| Index: content/common/gpu/client/gl_helper.cc
|
| diff --git a/content/common/gpu/client/gl_helper.cc b/content/common/gpu/client/gl_helper.cc
|
| index 0a03fedcd8a00908de4c5cbda6e2958509dbe296..f28be72dab2c25d148a5af4903147808ed26a9a8 100644
|
| --- a/content/common/gpu/client/gl_helper.cc
|
| +++ b/content/common/gpu/client/gl_helper.cc
|
| @@ -17,6 +17,7 @@
|
| #include "base/threading/thread_restrictions.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCString.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h"
|
| +#include "ui/gfx/rect.h"
|
| #include "ui/gfx/size.h"
|
| #include "ui/gl/gl_bindings.h"
|
|
|
| @@ -254,6 +255,7 @@ class GLHelper::CopyTextureToImpl {
|
|
|
| void CopyTextureTo(WebGLId src_texture,
|
| const gfx::Size& src_size,
|
| + const gfx::Rect& src_subrect,
|
| const gfx::Size& dst_size,
|
| unsigned char* out,
|
| const base::Callback<void(bool)>& callback);
|
| @@ -295,10 +297,13 @@ class GLHelper::CopyTextureToImpl {
|
| ~Request() {}
|
| };
|
|
|
| - // Returns the id of a framebuffer that
|
| + // Copies the block of pixels specified with |src_subrect| from |src_texture|,
|
| + // scales it to |dst_size|, writes it into a texture, and returns its ID.
|
| + // |src_size| is the size of |src_texture|.
|
| WebGLId ScaleTexture(WebGLId src_texture,
|
| - const gfx::Size& src_size,
|
| - const gfx::Size& dst_size);
|
| + const gfx::Size& src_size,
|
| + const gfx::Rect& src_subrect,
|
| + const gfx::Size& dst_size);
|
|
|
| // Deletes the context for GLHelperThread.
|
| void DeleteContextForThread();
|
| @@ -335,6 +340,8 @@ class GLHelper::CopyTextureToImpl {
|
| WebKit::WGC3Dint texcoord_location_;
|
| // The location of the source texture in the program.
|
| WebKit::WGC3Dint texture_location_;
|
| + // The location of the texture coordinate of the sub-rectangle in the program.
|
| + WebKit::WGC3Dint src_subrect_location_;
|
| std::queue<scoped_refptr<Request> > request_queue_;
|
| };
|
|
|
| @@ -349,9 +356,10 @@ const WebKit::WGC3Dchar GLHelper::CopyTextureToImpl::kCopyVertexShader[] =
|
| "attribute vec2 a_position;"
|
| "attribute vec2 a_texcoord;"
|
| "varying vec2 v_texcoord;"
|
| + "uniform vec4 src_subrect;"
|
| "void main() {"
|
| " gl_Position = vec4(a_position, 0.0, 1.0);"
|
| - " v_texcoord = a_texcoord;"
|
| + " v_texcoord = src_subrect.xy + a_texcoord * src_subrect.zw;"
|
| "}";
|
|
|
| const WebKit::WGC3Dchar GLHelper::CopyTextureToImpl::kCopyFragmentShader[] =
|
| @@ -393,11 +401,13 @@ void GLHelper::CopyTextureToImpl::InitProgram() {
|
| position_location_ = context_->getAttribLocation(program_, "a_position");
|
| texcoord_location_ = context_->getAttribLocation(program_, "a_texcoord");
|
| texture_location_ = context_->getUniformLocation(program_, "s_texture");
|
| + src_subrect_location_ = context_->getUniformLocation(program_, "src_subrect");
|
| }
|
|
|
| WebGLId GLHelper::CopyTextureToImpl::ScaleTexture(
|
| WebGLId src_texture,
|
| const gfx::Size& src_size,
|
| + const gfx::Rect& src_subrect,
|
| const gfx::Size& dst_size) {
|
| WebGLId dst_texture = context_->createTexture();
|
| {
|
| @@ -450,6 +460,15 @@ WebGLId GLHelper::CopyTextureToImpl::ScaleTexture(
|
|
|
| context_->uniform1i(texture_location_, 0);
|
|
|
| + // Convert |src_subrect| to texture coordinates.
|
| + GLfloat src_subrect_texcoord[] = {
|
| + static_cast<float>(src_subrect.x()) / src_size.width(),
|
| + static_cast<float>(src_subrect.y()) / src_size.height(),
|
| + static_cast<float>(src_subrect.width()) / src_size.width(),
|
| + static_cast<float>(src_subrect.height()) / src_size.height(),
|
| + };
|
| + context_->uniform4fv(src_subrect_location_, 1, src_subrect_texcoord);
|
| +
|
| // Conduct texture mapping by drawing a quad composed of two triangles.
|
| context_->drawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
| }
|
| @@ -470,6 +489,7 @@ void GLHelper::CopyTextureToImpl::DeleteContextForThread() {
|
| void GLHelper::CopyTextureToImpl::CopyTextureTo(
|
| WebGLId src_texture,
|
| const gfx::Size& src_size,
|
| + const gfx::Rect& src_subrect,
|
| const gfx::Size& dst_size,
|
| unsigned char* out,
|
| const base::Callback<void(bool)>& callback) {
|
| @@ -478,7 +498,7 @@ void GLHelper::CopyTextureToImpl::CopyTextureTo(
|
| return;
|
| }
|
|
|
| - WebGLId texture = ScaleTexture(src_texture, src_size, dst_size);
|
| + WebGLId texture = ScaleTexture(src_texture, src_size, src_subrect, dst_size);
|
| context_->flush();
|
| scoped_refptr<Request> request =
|
| new Request(this, texture, dst_size, out, callback);
|
| @@ -626,6 +646,7 @@ WebGraphicsContext3D* GLHelper::context() const {
|
|
|
| void GLHelper::CopyTextureTo(WebGLId src_texture,
|
| const gfx::Size& src_size,
|
| + const gfx::Rect& src_subrect,
|
| const gfx::Size& dst_size,
|
| unsigned char* out,
|
| const base::Callback<void(bool)>& callback) {
|
| @@ -637,6 +658,7 @@ void GLHelper::CopyTextureTo(WebGLId src_texture,
|
|
|
| copy_texture_to_impl_->CopyTextureTo(src_texture,
|
| src_size,
|
| + src_subrect,
|
| dst_size,
|
| out,
|
| callback);
|
|
|