Index: cc/output/software_renderer.cc |
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc |
index 4457607f72ef4c77cb67ae203ff095e6157081b0..edd7cb2f0af4b61c5b2f6881a15af3088bab20d2 100644 |
--- a/cc/output/software_renderer.cc |
+++ b/cc/output/software_renderer.cc |
@@ -435,22 +435,46 @@ void SoftwareRenderer::DrawRenderPassQuad(const DrawingFrame* frame, |
SkMatrix::kFill_ScaleToFit); |
const SkBitmap* content = lock.sk_bitmap(); |
- skia::RefPtr<SkShader> shader = skia::AdoptRef( |
- SkShader::CreateBitmapShader(*content, |
- SkShader::kClamp_TileMode, |
- SkShader::kClamp_TileMode)); |
- shader->setLocalMatrix(content_mat); |
- current_paint_.setShader(shader.get()); |
- // TODO(ajuma): Remove this condition once general CSS filters are working |
- // correctly (http://crbug.com/160302), and add corresponding pixel tests. |
- if (quad->filters.HasReferenceFilter()) { |
+ SkBitmap filter_bitmap; |
+ if (!quad->filters.IsEmpty()) { |
skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( |
quad->filters, content_texture->size()); |
- if (filter) |
- current_paint_.setImageFilter(filter.get()); |
+ // TODO(ajuma): In addition origin translation, the canvas should also be |
+ // scaled to accomodate device pixel ratio and pinch zoom. See |
+ // crbug.com/281516 and crbug.com/281518. |
+ // TODO(ajuma): Apply the filter in the same pass as the content where |
+ // possible (e.g. when there's no origin offset). See crbug.com/308201. |
+ if (filter) { |
+ bool is_opaque = false; |
+ skia::RefPtr<SkBaseDevice> device = |
+ skia::AdoptRef(new SkBitmapDevice(SkBitmap::kARGB_8888_Config, |
ajuma
2013/10/31 17:36:10
Using createCompatibleDevice leads to a crash on W
|
+ content_texture->size().width(), |
+ content_texture->size().height(), |
+ is_opaque)); |
+ SkCanvas canvas(device.get()); |
+ SkPaint paint; |
+ paint.setImageFilter(filter.get()); |
+ canvas.clear(SK_ColorTRANSPARENT); |
+ canvas.translate(SkIntToScalar(-quad->rect.origin().x()), |
+ SkIntToScalar(-quad->rect.origin().y())); |
+ canvas.drawSprite(*content, 0, 0, &paint); |
+ bool will_change_pixels = false; |
+ filter_bitmap = device->accessBitmap(will_change_pixels); |
+ } |
} |
+ skia::RefPtr<SkShader> shader; |
+ if (filter_bitmap.isNull()) { |
+ shader = skia::AdoptRef(SkShader::CreateBitmapShader( |
+ *content, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode)); |
+ } else { |
+ shader = skia::AdoptRef(SkShader::CreateBitmapShader( |
+ filter_bitmap, SkShader::kClamp_TileMode, SkShader::kClamp_TileMode)); |
+ } |
+ shader->setLocalMatrix(content_mat); |
+ current_paint_.setShader(shader.get()); |
+ |
if (quad->mask_resource_id) { |
ResourceProvider::ScopedReadLockSoftware mask_lock(resource_provider_, |
quad->mask_resource_id); |