Chromium Code Reviews| 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); |