diff options
author | ajuma@chromium.org <ajuma@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-01 22:08:00 +0000 |
---|---|---|
committer | ajuma@chromium.org <ajuma@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-01 22:08:00 +0000 |
commit | 52844912b438f8c6609a25a42b9807f6a924e690 (patch) | |
tree | c68f195cf23fb4b4ef4fb8067ecab940797ea379 /cc/output/software_renderer.cc | |
parent | 68d1dd345e06e259a086c2ccc186f7f260bbf0d0 (diff) | |
download | chromium_src-52844912b438f8c6609a25a42b9807f6a924e690.zip chromium_src-52844912b438f8c6609a25a42b9807f6a924e690.tar.gz chromium_src-52844912b438f8c6609a25a42b9807f6a924e690.tar.bz2 |
Enable general CSS filters in the software compositor
The software compositor has only supported filters that include a
reference filter. This CL enables support for filters that don't
include a reference filter.
BUG=160302
Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=229569
Review URL: https://codereview.chromium.org/24090003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@232476 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/output/software_renderer.cc')
-rw-r--r-- | cc/output/software_renderer.cc | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/cc/output/software_renderer.cc b/cc/output/software_renderer.cc index 9bc3cda..7a932cc 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, + 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); |