Chromium Code Reviews| Index: cc/resources/resource_provider.cc |
| diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
| index ded347763485a32184d0aa950f329e685ce204c4..dc8e76231daaedc954876c05838f5a75a901600a 100644 |
| --- a/cc/resources/resource_provider.cc |
| +++ b/cc/resources/resource_provider.cc |
| @@ -995,6 +995,35 @@ void ResourceProvider::UnlockForWriteToGpuMemoryBuffer(ResourceId id) { |
| resource->read_lock_fences_enabled = true; |
| } |
| +SkSurface* ResourceProvider::CreateSkSurface(ResourceId id, |
| + bool use_distance_field_text) { |
| + Resource* resource = GetResource(id); |
| + DCHECK(resource->locked_for_write); |
| + |
| + class GrContext* gr_context = GrContext(); |
| + // TODO(alokp): Implement TestContextProvider::GrContext(). |
| + if (!gr_context) |
| + return nullptr; |
| + |
| + LazyAllocate(resource); |
| + |
| + GrBackendTextureDesc desc; |
| + desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| + desc.fWidth = resource->size.width(); |
| + desc.fHeight = resource->size.height(); |
| + desc.fConfig = ToGrPixelConfig(resource->format); |
| + desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| + desc.fTextureHandle = resource->gl_id; |
| + skia::RefPtr<GrTexture> gr_texture = |
| + skia::AdoptRef(gr_context->wrapBackendTexture(desc)); |
| + SkSurface::TextRenderMode text_render_mode = |
| + use_distance_field_text ? SkSurface::kDistanceField_TextRenderMode |
| + : SkSurface::kStandard_TextRenderMode; |
| + resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( |
| + gr_texture->asRenderTarget(), text_render_mode)); |
| + return resource->sk_surface.get(); |
| +} |
| + |
| const ResourceProvider::Resource* ResourceProvider::LockForWriteToSkSurface( |
| ResourceId id) { |
| Resource* resource = GetResource(id); |
| @@ -1002,28 +1031,9 @@ const ResourceProvider::Resource* ResourceProvider::LockForWriteToSkSurface( |
| DCHECK(CanLockForWrite(id)); |
| resource->locked_for_write = true; |
| + |
| if (!resource->sk_surface) { |
| - class GrContext* gr_context = GrContext(); |
| - // TODO(alokp): Implement TestContextProvider::GrContext(). |
| - if (!gr_context) |
| - return resource; |
| - |
| - LazyAllocate(resource); |
| - |
| - GrBackendTextureDesc desc; |
| - desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
| - desc.fWidth = resource->size.width(); |
| - desc.fHeight = resource->size.height(); |
| - desc.fConfig = ToGrPixelConfig(resource->format); |
| - desc.fOrigin = kTopLeft_GrSurfaceOrigin; |
| - desc.fTextureHandle = resource->gl_id; |
| - skia::RefPtr<GrTexture> gr_texture = |
| - skia::AdoptRef(gr_context->wrapBackendTexture(desc)); |
| - SkSurface::TextRenderMode text_render_mode = |
| - use_distance_field_text_ ? SkSurface::kDistanceField_TextRenderMode |
| - : SkSurface::kStandard_TextRenderMode; |
| - resource->sk_surface = skia::AdoptRef(SkSurface::NewRenderTargetDirect( |
| - gr_texture->asRenderTarget(), text_render_mode)); |
| + CreateSkSurface(id, use_distance_field_text_); |
|
reveman
2014/10/15 17:34:09
Let's not bother to create the surface here if you
|
| } |
| return resource; |
| @@ -1151,6 +1161,19 @@ ResourceProvider::ScopedWriteLockGr::~ScopedWriteLockGr() { |
| resource_provider_->UnlockForWriteToSkSurface(resource_id_); |
| } |
| +void ResourceProvider::ScopedWriteLockGr::SetUseDistanceFieldText( |
| + bool use_distance_field_text) { |
| + bool surface_uses_distance_field = |
| + resource_provider_->use_distance_field_text_ || use_distance_field_text; |
|
reveman
2014/10/15 17:34:09
what is ResourceProvider::use_distance_field_text_
|
| + // If the surface doesn't have the correct dff setting, recreate the surface |
| + // within the resource. |
| + if (surface_uses_distance_field != |
| + sk_surface_->props().isUseDistanceFieldFonts()) { |
| + sk_surface_ = resource_provider_->CreateSkSurface(resource_id_, |
| + use_distance_field_text); |
| + } |
| +} |
| + |
| ResourceProvider::ResourceProvider( |
| OutputSurface* output_surface, |
| SharedBitmapManager* shared_bitmap_manager, |