summaryrefslogtreecommitdiffstats
path: root/cc/output/software_renderer.cc
diff options
context:
space:
mode:
authorajuma@chromium.org <ajuma@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-01 22:08:00 +0000
committerajuma@chromium.org <ajuma@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-01 22:08:00 +0000
commit52844912b438f8c6609a25a42b9807f6a924e690 (patch)
treec68f195cf23fb4b4ef4fb8067ecab940797ea379 /cc/output/software_renderer.cc
parent68d1dd345e06e259a086c2ccc186f7f260bbf0d0 (diff)
downloadchromium_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.cc46
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);