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 <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 // 5. Draw the background texture for the contents using the same transform as | 555 // 5. Draw the background texture for the contents using the same transform as |
556 // used to draw the contents itself. This is done without blending to replace | 556 // used to draw the contents itself. This is done without blending to replace |
557 // the current background pixels with the new filtered background. | 557 // the current background pixels with the new filtered background. |
558 // 6. Draw the contents of the quad over drop of the new background with | 558 // 6. Draw the contents of the quad over drop of the new background with |
559 // blending, as per usual. The filtered background pixels will show through | 559 // blending, as per usual. The filtered background pixels will show through |
560 // any non-opaque pixels in this draws. | 560 // any non-opaque pixels in this draws. |
561 // | 561 // |
562 // Pixel copies in this algorithm occur at steps 2, 3, 4, and 5. | 562 // Pixel copies in this algorithm occur at steps 2, 3, 4, and 5. |
563 | 563 |
564 // FIXME: When this algorithm changes, update | 564 // FIXME: When this algorithm changes, update |
565 // LayerTreeHost::prioritizeTextures() accordingly. | 565 // LayerTreeHost::PrioritizeTextures() accordingly. |
566 | 566 |
567 const WebKit::WebFilterOperations& filters = quad->background_filters; | 567 const WebKit::WebFilterOperations& filters = quad->background_filters; |
568 if (filters.isEmpty()) | 568 DCHECK(!filters.isEmpty()); |
569 return scoped_ptr<ScopedResource>(); | |
570 | 569 |
571 // FIXME: We only allow background filters on an opaque render surface because | 570 // FIXME: We only allow background filters on an opaque render surface because |
572 // other surfaces may contain translucent pixels, and the contents behind | 571 // other surfaces may contain translucent pixels, and the contents behind |
573 // those translucent pixels wouldn't have the filter applied. | 572 // those translucent pixels wouldn't have the filter applied. |
574 if (frame->current_render_pass->has_transparent_background) | 573 if (frame->current_render_pass->has_transparent_background) |
575 return scoped_ptr<ScopedResource>(); | 574 return scoped_ptr<ScopedResource>(); |
576 DCHECK(!frame->current_texture); | 575 DCHECK(!frame->current_texture); |
577 | 576 |
578 // FIXME: Do a single readback for both the surface and replica and cache the | 577 // FIXME: Do a single readback for both the surface and replica and cache the |
579 // filtered results (once filter textures are not reused). | 578 // filtered results (once filter textures are not reused). |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 gfx::Transform contents_device_transform = | 654 gfx::Transform contents_device_transform = |
656 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; | 655 frame->window_matrix * frame->projection_matrix * quad_rect_matrix; |
657 contents_device_transform.FlattenTo2d(); | 656 contents_device_transform.FlattenTo2d(); |
658 | 657 |
659 // Can only draw surface if device matrix is invertible. | 658 // Can only draw surface if device matrix is invertible. |
660 gfx::Transform contents_device_transform_inverse( | 659 gfx::Transform contents_device_transform_inverse( |
661 gfx::Transform::kSkipInitialization); | 660 gfx::Transform::kSkipInitialization); |
662 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) | 661 if (!contents_device_transform.GetInverse(&contents_device_transform_inverse)) |
663 return; | 662 return; |
664 | 663 |
665 scoped_ptr<ScopedResource> background_texture = | 664 scoped_ptr<ScopedResource> background_texture; |
666 DrawBackgroundFilters(frame, | 665 if (!quad->background_filters.isEmpty()) { |
667 quad, | 666 // The pixels from the filtered background should completely replace the |
668 contents_device_transform, | 667 // current pixel values. |
669 contents_device_transform_inverse); | 668 bool disable_blending = blend_enabled(); |
| 669 if (disable_blending) |
| 670 SetBlendEnabled(false); |
| 671 |
| 672 background_texture = DrawBackgroundFilters( |
| 673 frame, |
| 674 quad, |
| 675 contents_device_transform, |
| 676 contents_device_transform_inverse); |
| 677 |
| 678 if (disable_blending) |
| 679 SetBlendEnabled(true); |
| 680 } |
670 | 681 |
671 // FIXME: Cache this value so that we don't have to do it for both the surface | 682 // FIXME: Cache this value so that we don't have to do it for both the surface |
672 // and its replica. Apply filters to the contents texture. | 683 // and its replica. Apply filters to the contents texture. |
673 SkBitmap filter_bitmap; | 684 SkBitmap filter_bitmap; |
674 SkScalar color_matrix[20]; | 685 SkScalar color_matrix[20]; |
675 bool use_color_matrix = false; | 686 bool use_color_matrix = false; |
676 if (quad->filter) { | 687 if (quad->filter) { |
677 SkColorFilter* cf; | 688 SkColorFilter* cf; |
678 if ((quad->filter->asColorFilter(&cf)) && cf->asColorMatrix(color_matrix) && | 689 if ((quad->filter->asColorFilter(&cf)) && cf->asColorMatrix(color_matrix) && |
679 !quad->filter->getInput(0)) { | 690 !quad->filter->getInput(0)) { |
(...skipping 1773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2453 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); | 2464 resource_provider_->DeleteResource(on_demand_tile_raster_resource_id_); |
2454 | 2465 |
2455 ReleaseRenderPassTextures(); | 2466 ReleaseRenderPassTextures(); |
2456 } | 2467 } |
2457 | 2468 |
2458 bool GLRenderer::IsContextLost() { | 2469 bool GLRenderer::IsContextLost() { |
2459 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); | 2470 return (context_->getGraphicsResetStatusARB() != GL_NO_ERROR); |
2460 } | 2471 } |
2461 | 2472 |
2462 } // namespace cc | 2473 } // namespace cc |
OLD | NEW |