summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics/android/ShaderProgram.cpp
diff options
context:
space:
mode:
authorNicolas Roard <nicolas@android.com>2010-12-17 17:55:42 -0800
committerNicolas Roard <nicolas@android.com>2010-12-20 11:58:01 -0800
commit2917fbb92079f1d39cee3f84dac92e333b65f146 (patch)
treec8aeb8a684152490d77a28233f3a49ceb5a8eee7 /WebCore/platform/graphics/android/ShaderProgram.cpp
parenta1e0fec47adb2c0838ef3376d3853fceaa05f006 (diff)
downloadexternal_webkit-2917fbb92079f1d39cee3f84dac92e333b65f146.zip
external_webkit-2917fbb92079f1d39cee3f84dac92e333b65f146.tar.gz
external_webkit-2917fbb92079f1d39cee3f84dac92e333b65f146.tar.bz2
Add clipping support
Change-Id: If26bb40c4f75caa0fc9146aecb9f06dd1bcecd44
Diffstat (limited to 'WebCore/platform/graphics/android/ShaderProgram.cpp')
-rw-r--r--WebCore/platform/graphics/android/ShaderProgram.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/WebCore/platform/graphics/android/ShaderProgram.cpp b/WebCore/platform/graphics/android/ShaderProgram.cpp
index ac6375d..15f120d 100644
--- a/WebCore/platform/graphics/android/ShaderProgram.cpp
+++ b/WebCore/platform/graphics/android/ShaderProgram.cpp
@@ -152,6 +152,7 @@ void ShaderProgram::setViewport(SkRect& viewport)
GLUtils::setOrthographicMatrix(ortho, viewport.fLeft, viewport.fTop,
viewport.fRight, viewport.fBottom, -1000, 1000);
m_projectionMatrix = ortho;
+ m_viewport = viewport;
}
void ShaderProgram::setProjectionMatrix(SkRect& geometry)
@@ -188,6 +189,42 @@ void ShaderProgram::drawQuad(SkRect& geometry, int textureId, float opacity)
GLUtils::checkGlError("drawQuad");
}
+void ShaderProgram::setViewRect(const IntRect& viewRect)
+{
+ m_viewRect = viewRect;
+
+ // We do clipping using glScissor, which needs to take
+ // coordinates in screen space. The following matrix transform
+ // content coordinates in screen coordinates.
+ TransformationMatrix translate;
+ translate.translate(1.0, 1.0);
+ TransformationMatrix scale;
+ scale.scale3d(m_viewRect.width() * 0.5f, m_viewRect.height() * 0.5f, 1);
+
+ m_clippingMatrix = m_projectionMatrix;
+ m_clippingMatrix.multiply(translate);
+ m_clippingMatrix.multiply(scale);
+}
+
+void ShaderProgram::clip(const TransformationMatrix& drawMatrix,
+ const FloatRect& rect)
+{
+ if (rect == m_clipRect)
+ return;
+
+ FloatRect srect(0, 0, rect.width(), rect.height());
+ TransformationMatrix renderMatrix = drawMatrix;
+ renderMatrix.multiply(m_clippingMatrix);
+ FloatRect clip = renderMatrix.mapRect(srect);
+
+ // we should only call glScissor in this function, so that we can easily
+ // track the current clipping rect.
+ glScissor(m_viewRect.x() + clip.x(), m_viewRect.y() + clip.y(),
+ clip.width(), clip.height());
+
+ m_clipRect = rect;
+}
+
void ShaderProgram::drawLayerQuad(const TransformationMatrix& drawMatrix,
SkRect& geometry, int textureId, float opacity)
{