Index: cc/output/software_renderer.cc |
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc |
index 4457607f72ef4c77cb67ae203ff095e6157081b0..3b209b3d5a350e4590b3fc89167b4928b2a6febd 100644 |
--- a/cc/output/software_renderer.cc |
+++ b/cc/output/software_renderer.cc |
@@ -435,22 +435,43 @@ 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. |
+ if (filter) { |
+ skia::RefPtr<SkBaseDevice> device = |
+ skia::AdoptRef(current_canvas_->getDevice()->createCompatibleDevice( |
+ SkBitmap::kARGB_8888_Config, |
+ content_texture->size().width(), |
+ content_texture->size().height(), |
+ false)); |
danakj
2013/10/16 15:48:59
can you use temporary variables so these boolean l
ajuma
2013/10/16 19:12:07
Done.
|
+ 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); |
+ filter_bitmap = device->accessBitmap(false); |
Stephen White
2013/10/15 19:49:19
Might want to log a bug that there's a possible op
ajuma
2013/10/16 19:12:07
Done and added a TODO for this too.
|
+ } |
} |
+ 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); |