Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 506 // visible in the compositor's context. | 506 // visible in the compositor's context. |
| 507 offscreen_contexts->Context3d()->flush(); | 507 offscreen_contexts->Context3d()->flush(); |
| 508 | 508 |
| 509 // Use the compositor's GL context again. | 509 // Use the compositor's GL context again. |
| 510 renderer->Context()->makeContextCurrent(); | 510 renderer->Context()->makeContextCurrent(); |
| 511 return source; | 511 return source; |
| 512 } | 512 } |
| 513 | 513 |
| 514 static SkBitmap ApplyImageFilter(GLRenderer* renderer, | 514 static SkBitmap ApplyImageFilter(GLRenderer* renderer, |
| 515 ContextProvider* offscreen_contexts, | 515 ContextProvider* offscreen_contexts, |
| 516 gfx::Point origin, | |
| 516 SkImageFilter* filter, | 517 SkImageFilter* filter, |
| 517 ScopedResource* source_texture_resource) { | 518 ScopedResource* source_texture_resource) { |
| 518 if (!filter) | 519 if (!filter) |
| 519 return SkBitmap(); | 520 return SkBitmap(); |
| 520 | 521 |
| 521 if (!offscreen_contexts || !offscreen_contexts->GrContext()) | 522 if (!offscreen_contexts || !offscreen_contexts->GrContext()) |
| 522 return SkBitmap(); | 523 return SkBitmap(); |
| 523 | 524 |
| 524 ResourceProvider::ScopedWriteLockGL lock(renderer->resource_provider(), | 525 ResourceProvider::ScopedWriteLockGL lock(renderer->resource_provider(), |
| 525 source_texture_resource->id()); | 526 source_texture_resource->id()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 570 skia::AdoptRef(scratch_texture.detach()); | 571 skia::AdoptRef(scratch_texture.detach()); |
| 571 | 572 |
| 572 // Create a device and canvas using that backing store. | 573 // Create a device and canvas using that backing store. |
| 573 SkGpuDevice device(offscreen_contexts->GrContext(), backing_store.get()); | 574 SkGpuDevice device(offscreen_contexts->GrContext(), backing_store.get()); |
| 574 SkCanvas canvas(&device); | 575 SkCanvas canvas(&device); |
| 575 | 576 |
| 576 // Draw the source bitmap through the filter to the canvas. | 577 // Draw the source bitmap through the filter to the canvas. |
| 577 SkPaint paint; | 578 SkPaint paint; |
| 578 paint.setImageFilter(filter); | 579 paint.setImageFilter(filter); |
| 579 canvas.clear(SK_ColorTRANSPARENT); | 580 canvas.clear(SK_ColorTRANSPARENT); |
| 581 canvas.translate(SkIntToScalar(-origin.x()), SkIntToScalar(-origin.y())); | |
|
danakj
2013/08/29 02:07:16
Can you add a TODO here stating that the filter sh
Stephen White
2013/08/29 17:07:00
Done.
| |
| 580 canvas.drawSprite(source, 0, 0, &paint); | 582 canvas.drawSprite(source, 0, 0, &paint); |
| 581 | 583 |
| 582 // Flush skia context so that all the rendered stuff appears on the | 584 // Flush skia context so that all the rendered stuff appears on the |
| 583 // texture. | 585 // texture. |
| 584 offscreen_contexts->GrContext()->flush(); | 586 offscreen_contexts->GrContext()->flush(); |
| 585 | 587 |
| 586 // Flush the GL context so rendering results from this context are | 588 // Flush the GL context so rendering results from this context are |
| 587 // visible in the compositor's context. | 589 // visible in the compositor's context. |
| 588 offscreen_contexts->Context3d()->flush(); | 590 offscreen_contexts->Context3d()->flush(); |
| 589 | 591 |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 771 cf = skia::AdoptRef(colorfilter_rawptr); | 773 cf = skia::AdoptRef(colorfilter_rawptr); |
| 772 } | 774 } |
| 773 | 775 |
| 774 if (cf && cf->asColorMatrix(color_matrix) && !quad->filter->getInput(0)) { | 776 if (cf && cf->asColorMatrix(color_matrix) && !quad->filter->getInput(0)) { |
| 775 // We have a single color matrix as a filter; apply it locally | 777 // We have a single color matrix as a filter; apply it locally |
| 776 // in the compositor. | 778 // in the compositor. |
| 777 use_color_matrix = true; | 779 use_color_matrix = true; |
| 778 } else { | 780 } else { |
| 779 filter_bitmap = ApplyImageFilter(this, | 781 filter_bitmap = ApplyImageFilter(this, |
| 780 frame->offscreen_context_provider, | 782 frame->offscreen_context_provider, |
| 783 quad->rect.origin(), | |
| 781 quad->filter.get(), | 784 quad->filter.get(), |
| 782 contents_texture); | 785 contents_texture); |
| 783 } | 786 } |
| 784 } else if (!quad->filters.IsEmpty()) { | 787 } else if (!quad->filters.IsEmpty()) { |
| 785 FilterOperations optimized_filters = | 788 FilterOperations optimized_filters = |
| 786 RenderSurfaceFilters::Optimize(quad->filters); | 789 RenderSurfaceFilters::Optimize(quad->filters); |
| 787 | 790 |
| 788 if ((optimized_filters.size() == 1) && | 791 if ((optimized_filters.size() == 1) && |
| 789 (optimized_filters.at(0).type() == FilterOperation::COLOR_MATRIX)) { | 792 (optimized_filters.at(0).type() == FilterOperation::COLOR_MATRIX)) { |
| 790 memcpy( | 793 memcpy( |
| (...skipping 2362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3153 std::string unique_context_name = base::StringPrintf( | 3156 std::string unique_context_name = base::StringPrintf( |
| 3154 "%s-Offscreen-%p", | 3157 "%s-Offscreen-%p", |
| 3155 Settings().compositor_name.c_str(), | 3158 Settings().compositor_name.c_str(), |
| 3156 context_); | 3159 context_); |
| 3157 offscreen_context_provider->Context3d()->pushGroupMarkerEXT( | 3160 offscreen_context_provider->Context3d()->pushGroupMarkerEXT( |
| 3158 unique_context_name.c_str()); | 3161 unique_context_name.c_str()); |
| 3159 } | 3162 } |
| 3160 | 3163 |
| 3161 | 3164 |
| 3162 } // namespace cc | 3165 } // namespace cc |
| OLD | NEW |