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..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); |