aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-12-10 13:44:45 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-10 13:44:45 -0800
commit70ee31b2fa127eee6c0cea61cf05508e9d3ca7b1 (patch)
tree37f8350cd24bc973ebaf1d1499d9801966142e7e /src/core
parent96f16e835e32665ea5af605e52715dbf43367291 (diff)
try adding flag to allow lcd text even in a layer
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkCanvas.cpp11
-rw-r--r--src/core/SkDevice.cpp5
-rw-r--r--src/core/SkImageFilter.cpp1
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) {