Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(939)

Side by Side Diff: cc/output/gl_renderer.cc

Issue 909353003: cc: Translate filter when texture is larger than quad rect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: gl -> sw Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | cc/test/data/enlarged_texture_on_threshold.png » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/output/gl_renderer.h" 5 #include "cc/output/gl_renderer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 GLC(gl_, gl_->LineWidth(quad->width)); 618 GLC(gl_, gl_->LineWidth(quad->width));
619 619
620 // The indices for the line are stored in the same array as the triangle 620 // The indices for the line are stored in the same array as the triangle
621 // indices. 621 // indices.
622 GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0)); 622 GLC(gl_, gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, 0));
623 } 623 }
624 624
625 static skia::RefPtr<SkImage> ApplyImageFilter( 625 static skia::RefPtr<SkImage> ApplyImageFilter(
626 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context, 626 scoped_ptr<GLRenderer::ScopedUseGrContext> use_gr_context,
627 ResourceProvider* resource_provider, 627 ResourceProvider* resource_provider,
628 const gfx::Point& origin, 628 const gfx::Rect& rect,
629 const gfx::Vector2dF& scale, 629 const gfx::Vector2dF& scale,
630 SkImageFilter* filter, 630 SkImageFilter* filter,
631 ScopedResource* source_texture_resource) { 631 ScopedResource* source_texture_resource) {
632 if (!filter) 632 if (!filter)
633 return skia::RefPtr<SkImage>(); 633 return skia::RefPtr<SkImage>();
634 634
635 if (!use_gr_context) 635 if (!use_gr_context)
636 return skia::RefPtr<SkImage>(); 636 return skia::RefPtr<SkImage>();
637 637
638 ResourceProvider::ScopedReadLockGL lock(resource_provider, 638 ResourceProvider::ScopedReadLockGL lock(resource_provider,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 // Create surface to draw into. 687 // Create surface to draw into.
688 skia::RefPtr<SkSurface> surface = skia::AdoptRef( 688 skia::RefPtr<SkSurface> surface = skia::AdoptRef(
689 SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget())); 689 SkSurface::NewRenderTargetDirect(backing_store->asRenderTarget()));
690 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas()); 690 skia::RefPtr<SkCanvas> canvas = skia::SharePtr(surface->getCanvas());
691 691
692 // Draw the source bitmap through the filter to the canvas. 692 // Draw the source bitmap through the filter to the canvas.
693 SkPaint paint; 693 SkPaint paint;
694 paint.setImageFilter(filter); 694 paint.setImageFilter(filter);
695 canvas->clear(SK_ColorTRANSPARENT); 695 canvas->clear(SK_ColorTRANSPARENT);
696 696
697 canvas->translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y())); 697 // The origin of the filter is top-left and the origin of the source is
698 // bottom-left, but the orientation is the same, so we must translate the
699 // filter so that it renders at the bottom of the texture to avoid
700 // misregistration.
701 int y_translate = source.height() - rect.height() - rect.origin().y();
702 canvas->translate(-rect.origin().x(), y_translate);
698 canvas->scale(scale.x(), scale.y()); 703 canvas->scale(scale.x(), scale.y());
699 canvas->drawSprite(source, 0, 0, &paint); 704 canvas->drawSprite(source, 0, 0, &paint);
700 705
701 skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot()); 706 skia::RefPtr<SkImage> image = skia::AdoptRef(surface->newImageSnapshot());
702 if (!image || !image->getTexture()) { 707 if (!image || !image->getTexture()) {
703 return skia::RefPtr<SkImage>(); 708 return skia::RefPtr<SkImage>();
704 } 709 }
705 710
706 // Flush the GrContext to ensure all buffered GL calls are drawn to the 711 // Flush the GrContext to ensure all buffered GL calls are drawn to the
707 // backing store before we access and return it, and have cc begin using the 712 // backing store before we access and return it, and have cc begin using the
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 } 857 }
853 858
854 skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters( 859 skia::RefPtr<SkImage> GLRenderer::ApplyBackgroundFilters(
855 DrawingFrame* frame, 860 DrawingFrame* frame,
856 const RenderPassDrawQuad* quad, 861 const RenderPassDrawQuad* quad,
857 ScopedResource* background_texture) { 862 ScopedResource* background_texture) {
858 DCHECK(ShouldApplyBackgroundFilters(frame, quad)); 863 DCHECK(ShouldApplyBackgroundFilters(frame, quad));
859 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter( 864 skia::RefPtr<SkImageFilter> filter = RenderSurfaceFilters::BuildImageFilter(
860 quad->background_filters, background_texture->size()); 865 quad->background_filters, background_texture->size());
861 866
862 skia::RefPtr<SkImage> background_with_filters = 867 skia::RefPtr<SkImage> background_with_filters = ApplyImageFilter(
863 ApplyImageFilter(ScopedUseGrContext::Create(this, frame), 868 ScopedUseGrContext::Create(this, frame), resource_provider_, quad->rect,
864 resource_provider_, 869 quad->filters_scale, filter.get(), background_texture);
865 quad->rect.origin(),
866 quad->filters_scale,
867 filter.get(),
868 background_texture);
869 return background_with_filters; 870 return background_with_filters;
870 } 871 }
871 872
872 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame, 873 void GLRenderer::DrawRenderPassQuad(DrawingFrame* frame,
873 const RenderPassDrawQuad* quad) { 874 const RenderPassDrawQuad* quad) {
874 ScopedResource* contents_texture = 875 ScopedResource* contents_texture =
875 render_pass_textures_.get(quad->render_pass_id); 876 render_pass_textures_.get(quad->render_pass_id);
876 if (!contents_texture || !contents_texture->id()) 877 if (!contents_texture || !contents_texture->id())
877 return; 878 return;
878 879
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 SkColorFilter* colorfilter_rawptr = NULL; 965 SkColorFilter* colorfilter_rawptr = NULL;
965 filter->asColorFilter(&colorfilter_rawptr); 966 filter->asColorFilter(&colorfilter_rawptr);
966 cf = skia::AdoptRef(colorfilter_rawptr); 967 cf = skia::AdoptRef(colorfilter_rawptr);
967 } 968 }
968 969
969 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) { 970 if (cf && cf->asColorMatrix(color_matrix) && !filter->getInput(0)) {
970 // We have a single color matrix as a filter; apply it locally 971 // We have a single color matrix as a filter; apply it locally
971 // in the compositor. 972 // in the compositor.
972 use_color_matrix = true; 973 use_color_matrix = true;
973 } else { 974 } else {
974 filter_image = ApplyImageFilter(ScopedUseGrContext::Create(this, frame), 975 filter_image = ApplyImageFilter(
975 resource_provider_, 976 ScopedUseGrContext::Create(this, frame), resource_provider_,
976 quad->rect.origin(), 977 quad->rect, quad->filters_scale, filter.get(), contents_texture);
977 quad->filters_scale,
978 filter.get(),
979 contents_texture);
980 } 978 }
981 } 979 }
982 } 980 }
983 981
984 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock; 982 scoped_ptr<ResourceProvider::ScopedSamplerGL> mask_resource_lock;
985 unsigned mask_texture_id = 0; 983 unsigned mask_texture_id = 0;
986 SamplerType mask_sampler = SamplerTypeNA; 984 SamplerType mask_sampler = SamplerTypeNA;
987 if (quad->mask_resource_id) { 985 if (quad->mask_resource_id) {
988 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL( 986 mask_resource_lock.reset(new ResourceProvider::ScopedSamplerGL(
989 resource_provider_, quad->mask_resource_id, GL_TEXTURE1, GL_LINEAR)); 987 resource_provider_, quad->mask_resource_id, GL_TEXTURE1, GL_LINEAR));
(...skipping 2318 matching lines...) Expand 10 before | Expand all | Expand 10 after
3308 context_support_->ScheduleOverlayPlane( 3306 context_support_->ScheduleOverlayPlane(
3309 overlay.plane_z_order, 3307 overlay.plane_z_order,
3310 overlay.transform, 3308 overlay.transform,
3311 pending_overlay_resources_.back()->texture_id(), 3309 pending_overlay_resources_.back()->texture_id(),
3312 overlay.display_rect, 3310 overlay.display_rect,
3313 overlay.uv_rect); 3311 overlay.uv_rect);
3314 } 3312 }
3315 } 3313 }
3316 3314
3317 } // namespace cc 3315 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/test/data/enlarged_texture_on_threshold.png » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698