diff options
author | reed <reed@google.com> | 2015-12-10 13:44:45 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-10 13:44:45 -0800 |
commit | 70ee31b2fa127eee6c0cea61cf05508e9d3ca7b1 (patch) | |
tree | 37f8350cd24bc973ebaf1d1499d9801966142e7e /src/core | |
parent | 96f16e835e32665ea5af605e52715dbf43367291 (diff) |
try adding flag to allow lcd text even in a layer
BUG=skia:
Review URL: https://codereview.chromium.org/1513513002
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkCanvas.cpp | 11 | ||||
-rw-r--r-- | src/core/SkDevice.cpp | 5 | ||||
-rw-r--r-- | src/core/SkImageFilter.cpp | 1 |
3 files changed, 14 insertions, 3 deletions
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp index 0c9c20d1ee..1d37e58419 100644 --- a/src/core/SkCanvas.cpp +++ b/src/core/SkCanvas.cpp @@ -1140,6 +1140,12 @@ int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags fl return this->getSaveCount() - 1; } +int SkCanvas::saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPaint* paint) { + unsigned flags = kARGB_ClipLayer_SaveFlag | kPreserveLCDText_PrivateSaveFlag; + return this->saveLayer(bounds, paint, (SaveFlags)flags); +} + + void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags, SaveLayerStrategy strategy) { #ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG @@ -1183,8 +1189,11 @@ void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Sav bool forceSpriteOnRestore = false; { + const bool preserveLCDText = kOpaque_SkAlphaType == info.alphaType() || + SkToBool(flags & kPreserveLCDText_PrivateSaveFlag); const SkBaseDevice::TileUsage usage = SkBaseDevice::kNever_TileUsage; - const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(info, usage, geo); + const SkBaseDevice::CreateInfo createInfo = SkBaseDevice::CreateInfo(info, usage, geo, + preserveLCDText, false); SkBaseDevice* newDev = device->onCreateDevice(createInfo, paint); if (nullptr == newDev) { // If onCreateDevice didn't succeed, try raster (e.g. PDF couldn't handle the paint) diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp index cf57c2d700..cc2f318713 100644 --- a/src/core/SkDevice.cpp +++ b/src/core/SkDevice.cpp @@ -55,7 +55,8 @@ const SkBitmap& SkBaseDevice::accessBitmap(bool changePixels) { SkPixelGeometry SkBaseDevice::CreateInfo::AdjustGeometry(const SkImageInfo& info, TileUsage tileUsage, - SkPixelGeometry geo) { + SkPixelGeometry geo, + bool preserveLCDText) { switch (tileUsage) { case kPossible_TileUsage: // (we think) for compatibility with old clients, we assume this layer can support LCD @@ -63,7 +64,7 @@ SkPixelGeometry SkBaseDevice::CreateInfo::AdjustGeometry(const SkImageInfo& info // our callers (reed/robertphilips). break; case kNever_TileUsage: - if (info.alphaType() != kOpaque_SkAlphaType) { + if (!preserveLCDText) { geo = kUnknown_SkPixelGeometry; } break; diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index 2bfd14254e..a3f89d08fa 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -658,6 +658,7 @@ SkBaseDevice* SkImageFilter::DeviceProxy::createDevice(int w, int h) { SkBaseDevice::CreateInfo cinfo(SkImageInfo::MakeN32Premul(w, h), SkBaseDevice::kNever_TileUsage, kUnknown_SkPixelGeometry, + false, /* preserveLCDText */ true /*forImageFilter*/); SkBaseDevice* dev = fDevice->onCreateDevice(cinfo, nullptr); if (nullptr == dev) { |