diff options
author | Nicolas Roard <nicolas@android.com> | 2010-12-17 17:55:42 -0800 |
---|---|---|
committer | Nicolas Roard <nicolas@android.com> | 2010-12-20 11:58:01 -0800 |
commit | 2917fbb92079f1d39cee3f84dac92e333b65f146 (patch) | |
tree | c8aeb8a684152490d77a28233f3a49ceb5a8eee7 /WebCore/platform/graphics/android/ShaderProgram.cpp | |
parent | a1e0fec47adb2c0838ef3376d3853fceaa05f006 (diff) | |
download | external_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.cpp | 37 |
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) { |