Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 023a1cdbf068832875073a5601c29420043d74b5..ffe66d47e8d63c18d3d3eeac826cb33940973fc6 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -1099,16 +1099,31 @@ ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { |
resource_provider_->UnlockForWrite(resource_); |
} |
+static bool ShouldCreateSurface(SkSurface* surface, |
+ bool use_distance_field_text, |
+ bool can_use_lcd_text) { |
+ if (!surface) |
+ return true; |
+ bool surface_uses_distance_field_text = |
+ surface->props().isUseDistanceFieldFonts(); |
+ if (use_distance_field_text != surface_uses_distance_field_text) |
+ return true; |
+ bool surface_can_use_lcd_text = |
+ surface->props().pixelGeometry() != kUnknown_SkPixelGeometry; |
+ if (can_use_lcd_text != surface_can_use_lcd_text) |
+ return true; |
+ return false; |
+} |
+ |
SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface( |
- bool use_distance_field_text) { |
+ bool use_distance_field_text, |
+ bool can_use_lcd_text) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
DCHECK(resource_->locked_for_write); |
- // If the surface doesn't exist, or doesn't have the correct dff setting, |
- // recreate the surface within the resource. |
- if (!resource_->sk_surface || |
- use_distance_field_text != |
- resource_->sk_surface->props().isUseDistanceFieldFonts()) { |
+ bool create_surface = ShouldCreateSurface( |
+ resource_->sk_surface.get(), use_distance_field_text, can_use_lcd_text); |
+ if (create_surface) { |
class GrContext* gr_context = resource_provider_->GrContext(); |
// TODO(alokp): Implement TestContextProvider::GrContext(). |
if (!gr_context) |
@@ -1127,11 +1142,18 @@ SkSurface* ResourceProvider::ScopedWriteLockGr::GetSkSurface( |
skia::AdoptRef(gr_context->wrapBackendTexture(desc)); |
if (!gr_texture) |
return nullptr; |
- SkSurface::TextRenderMode text_render_mode = |
- use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode |
- : SkSurface::kStandard_TextRenderMode; |
+ uint32_t flags = use_distance_field_text |
+ ? SkSurfaceProps::kUseDistanceFieldFonts_Flag |
+ : 0; |
+ // Use unknown pixel geometry to disable LCD text. |
+ SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); |
+ if (can_use_lcd_text) { |
+ // LegacyFontHost will get LCD text and skia figures out what type to use. |
+ surface_props = |
+ SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); |
+ } |
resource_->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( |
- gr_texture->asRenderTarget(), text_render_mode)); |
+ gr_texture->asRenderTarget(), &surface_props)); |
} |
return resource_->sk_surface.get(); |
} |