Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index ff1b83812432068323fed4e467277d6a5d216c39..88c077e938ade08c269c2cc7f877f92b9a0b491d 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -63,6 +63,7 @@ |
#include "third_party/skia/include/gpu/gl/GrGLInterface.h" |
#include "third_party/skia/include/gpu/gl/GrGLTypes.h" |
#include "ui/gfx/color_space.h" |
+#include "ui/gfx/color_transform.h" |
#include "ui/gfx/geometry/quad_f.h" |
#include "ui/gfx/geometry/rect_conversions.h" |
#include "ui/gfx/skia_util.h" |
@@ -2029,50 +2030,6 @@ void GLRenderer::DrawContentQuadNoAA(const ContentDrawQuadBase* quad, |
gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); |
} |
-// TODO(ccameron): This has been replicated in ui/gfx/color_transform.cc. Delete |
-// one of the instances. |
-void ComputeYUVToRGBMatrices(const gfx::ColorSpace& src_color_space, |
- const gfx::ColorSpace& dst_color_space, |
- uint32_t bits_per_channel, |
- float resource_multiplier, |
- float resource_offset, |
- float* yuv_to_rgb_matrix) { |
- // Compute the matrix |full_transform| which converts input YUV values to RGB |
- // values. |
- SkMatrix44 full_transform; |
- |
- // Start with the resource adjust. |
- full_transform.setScale(resource_multiplier, resource_multiplier, |
- resource_multiplier); |
- full_transform.preTranslate(-resource_offset, -resource_offset, |
- -resource_offset); |
- |
- // If we're using a LUT for conversion, we only need the resource adjust, |
- // so just return this matrix. |
- if (dst_color_space.IsValid()) { |
- full_transform.asColMajorf(yuv_to_rgb_matrix); |
- return; |
- } |
- |
- // Then apply the range adjust. |
- { |
- SkMatrix44 range_adjust; |
- src_color_space.GetRangeAdjustMatrix(&range_adjust); |
- full_transform.postConcat(range_adjust); |
- } |
- |
- // Then apply the YUV to RGB full_transform. |
- { |
- SkMatrix44 rgb_to_yuv; |
- src_color_space.GetTransferMatrix(&rgb_to_yuv); |
- SkMatrix44 yuv_to_rgb; |
- rgb_to_yuv.invert(&yuv_to_rgb); |
- full_transform.postConcat(yuv_to_rgb); |
- } |
- |
- full_transform.asColMajorf(yuv_to_rgb_matrix); |
-} |
- |
void GLRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad, |
const gfx::QuadF* clip_region) { |
SetBlendEnabled(quad->ShouldDrawWithBlending()); |
@@ -2205,12 +2162,10 @@ void GLRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad, |
if (alpha_texture_mode == YUV_HAS_ALPHA_TEXTURE) |
gl_->Uniform1i(current_program_->a_texture_location(), 4); |
- float yuv_to_rgb_matrix[16] = {0}; |
- ComputeYUVToRGBMatrices(src_color_space, dst_color_space, |
- quad->bits_per_channel, quad->resource_multiplier, |
- quad->resource_offset, yuv_to_rgb_matrix); |
- gl_->UniformMatrix4fv(current_program_->yuv_and_resource_matrix_location(), 1, |
- 0, yuv_to_rgb_matrix); |
+ gl_->Uniform1f(current_program_->resource_multiplier_location(), |
+ quad->resource_multiplier); |
+ gl_->Uniform1f(current_program_->resource_offset_location(), |
+ quad->resource_offset); |
// The transform and vertex data are used to figure out the extents that the |
// un-antialiased quad should have and which vertex this is and the float |
@@ -3032,8 +2987,9 @@ void GLRenderer::SetUseProgram(const ProgramKey& program_key_no_color, |
const gfx::ColorSpace& src_color_space, |
const gfx::ColorSpace& dst_color_space) { |
ProgramKey program_key = program_key_no_color; |
- if (src_color_space.IsValid() && dst_color_space.IsValid()) |
- program_key.SetColorConversionMode(COLOR_CONVERSION_MODE_LUT); |
+ const gfx::ColorTransform* color_transform = |
+ GetColorTransform(src_color_space, dst_color_space); |
+ program_key.SetColorTransform(color_transform); |
// Create and set the program if needed. |
std::unique_ptr<Program>& program = program_cache_[program_key]; |
@@ -3064,8 +3020,7 @@ void GLRenderer::SetUseProgram(const ProgramKey& program_key_no_color, |
gl_->Uniform4fv(current_program_->viewport_location(), 1, viewport); |
} |
if (current_program_->lut_texture_location() != -1) { |
- ColorLUTCache::LUT lut = |
- color_lut_cache_.GetLUT(src_color_space, dst_color_space); |
+ ColorLUTCache::LUT lut = color_lut_cache_.GetLUT(color_transform); |
gl_->ActiveTexture(GL_TEXTURE5); |
gl_->BindTexture(GL_TEXTURE_2D, lut.texture); |
gl_->Uniform1i(current_program_->lut_texture_location(), 5); |
@@ -3082,12 +3037,25 @@ const Program* GLRenderer::GetProgramIfInitialized( |
return found->second.get(); |
} |
+const gfx::ColorTransform* GLRenderer::GetColorTransform( |
+ const gfx::ColorSpace& src, |
+ const gfx::ColorSpace& dst) { |
+ std::unique_ptr<gfx::ColorTransform>& transform = |
+ color_transform_cache_[dst][src]; |
+ if (!transform) { |
+ transform = gfx::ColorTransform::NewColorTransform( |
+ src, dst, gfx::ColorTransform::Intent::INTENT_PERCEPTUAL); |
+ } |
+ return transform.get(); |
+} |
+ |
void GLRenderer::CleanupSharedObjects() { |
shared_geometry_ = nullptr; |
for (auto& iter : program_cache_) |
iter.second->Cleanup(gl_); |
program_cache_.clear(); |
+ color_transform_cache_.clear(); |
if (offscreen_framebuffer_id_) |
gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_); |