diff options
Diffstat (limited to 'WebCore/platform/graphics')
5 files changed, 75 insertions, 9 deletions
diff --git a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp index 040f63e..1a08b3c 100644 --- a/WebCore/platform/graphics/android/BaseLayerAndroid.cpp +++ b/WebCore/platform/graphics/android/BaseLayerAndroid.cpp @@ -256,6 +256,7 @@ bool BaseLayerAndroid::drawGL(IntRect& viewRect, SkRect& visibleRect, ShaderProgram* shader = TilesManager::instance()->shader(); glUseProgram(shader->program()); glUniform1i(shader->textureSampler(), 0); + shader->setViewRect(viewRect); ret = drawBasePictureInGL(visibleRect, scale); @@ -263,7 +264,8 @@ bool BaseLayerAndroid::drawGL(IntRect& viewRect, SkRect& visibleRect, LayerAndroid* compositedRoot = static_cast<LayerAndroid*>(getChild(0)); TransformationMatrix ident; compositedRoot->updateFixedLayersPositions(visibleRect); - compositedRoot->updateGLPositions(ident, 1); + FloatRect clip(0, 0, viewRect.width(), viewRect.height()); + compositedRoot->updateGLPositions(ident, clip, 1); SkMatrix matrix; matrix.setTranslate(left, top); diff --git a/WebCore/platform/graphics/android/LayerAndroid.cpp b/WebCore/platform/graphics/android/LayerAndroid.cpp index 301022a..49cd4ca 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.cpp +++ b/WebCore/platform/graphics/android/LayerAndroid.cpp @@ -6,6 +6,7 @@ #include "AndroidAnimation.h" #include "DrawExtra.h" #include "GLUtils.h" +#include "MediaLayer.h" #include "PaintLayerOperation.h" #include "ParseCanvas.h" #include "SkBitmapRef.h" @@ -14,7 +15,6 @@ #include "SkPaint.h" #include "SkPicture.h" #include "TilesManager.h" -#include "MediaLayer.h" #include <wtf/CurrentTime.h> #define LAYER_DEBUG // Add diagonals for debugging @@ -472,7 +472,8 @@ void LayerAndroid::updatePositions() this->getChild(i)->updatePositions(); } -void LayerAndroid::updateGLPositions(const TransformationMatrix& parentMatrix, float opacity) +void LayerAndroid::updateGLPositions(const TransformationMatrix& parentMatrix, + const FloatRect& clipping, float opacity) { IntSize bounds(getSize().width(), getSize().height()); FloatPoint anchorPoint(getAnchorPoint().fX, getAnchorPoint().fY); @@ -499,6 +500,16 @@ void LayerAndroid::updateGLPositions(const TransformationMatrix& parentMatrix, f opacity *= getOpacity(); setDrawOpacity(opacity); + if (m_haveClip) { + FloatRect clip; + clip.setLocation(p); + clip.setWidth(getSize().width()); + clip.setHeight(getSize().height()); + setDrawClip(clip); + } else { + setDrawClip(clipping); + } + int count = this->countChildren(); if (!count) return; @@ -521,7 +532,7 @@ void LayerAndroid::updateGLPositions(const TransformationMatrix& parentMatrix, f localMatrix.translate(-getSize().width() * 0.5f, -getSize().height() * 0.5f); } for (int i = 0; i < count; i++) - this->getChild(i)->updateGLPositions(localMatrix, opacity); + this->getChild(i)->updateGLPositions(localMatrix, drawClip(), opacity); } void LayerAndroid::setContentsImage(SkBitmapRef* img) @@ -608,13 +619,15 @@ static inline bool compareLayerZ(const LayerAndroid* a, const LayerAndroid* b) bool LayerAndroid::drawGL(SkMatrix& matrix) { + SkRect rect; + rect.set(0, 0, getSize().width(), getSize().height()); + + TilesManager::instance()->shader()->clip(drawTransform(), m_clippingRect); + if (prepareContext() && m_texture) { TextureInfo* textureInfo = m_texture->consumerLock(); if (textureInfo && m_texture->isReady()) { - SkRect rect; - rect.set(0, 0, getSize().width(), getSize().height()); - TransformationMatrix m = drawTransform(); - TilesManager::instance()->shader()->drawLayerQuad(m, rect, + TilesManager::instance()->shader()->drawLayerQuad(drawTransform(), rect, textureInfo->m_textureId, m_drawOpacity); } diff --git a/WebCore/platform/graphics/android/LayerAndroid.h b/WebCore/platform/graphics/android/LayerAndroid.h index 1156601..76b4cb8 100644 --- a/WebCore/platform/graphics/android/LayerAndroid.h +++ b/WebCore/platform/graphics/android/LayerAndroid.h @@ -21,6 +21,7 @@ #include "FloatPoint.h" #include "FloatPoint3D.h" +#include "FloatRect.h" #include "LayerTexture.h" #include "RefPtr.h" #include "SkColor.h" @@ -115,7 +116,8 @@ public: virtual bool drawGL(SkMatrix&); bool drawChildrenGL(SkMatrix&); virtual void paintBitmapGL(); - void updateGLPositions(const TransformationMatrix& parentMatrix, float opacity); + void updateGLPositions(const TransformationMatrix& parentMatrix, + const FloatRect& clip, float opacity); void setDrawOpacity(float opacity) { m_drawOpacity = opacity; } bool preserves3D() { return m_preserves3D; } @@ -125,6 +127,8 @@ public: void setDrawTransform(const TransformationMatrix& transform) { m_drawTransform = transform; } const TransformationMatrix& drawTransform() const { return m_drawTransform; } void setChildrenTransform(const TransformationMatrix& t) { m_childrenTransform = t; } + void setDrawClip(const FloatRect& rect) { m_clippingRect = rect; } + const FloatRect& drawClip() { return m_clippingRect; } void setFixedPosition(SkLength left, // CSS left property SkLength top, // CSS top property @@ -264,6 +268,7 @@ private: float m_drawOpacity; TransformationMatrix m_drawTransform; TransformationMatrix m_childrenTransform; + FloatRect m_clippingRect; // Note that m_recordingPicture and m_contentsImage are mutually exclusive; // m_recordingPicture is used when WebKit is asked to paint the layer's 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) { diff --git a/WebCore/platform/graphics/android/ShaderProgram.h b/WebCore/platform/graphics/android/ShaderProgram.h index 785b42d..719a9ac 100644 --- a/WebCore/platform/graphics/android/ShaderProgram.h +++ b/WebCore/platform/graphics/android/ShaderProgram.h @@ -19,6 +19,8 @@ #if USE(ACCELERATED_COMPOSITING) +#include "FloatRect.h" +#include "IntRect.h" #include "SkRect.h" #include "TransformationMatrix.h" #include <GLES2/gl2.h> @@ -38,6 +40,8 @@ class ShaderProgram { void drawQuad(SkRect& geometry, int textureId, float opacity); void drawLayerQuad(const TransformationMatrix& drawMatrix, SkRect& geometry, int textureId, float opacity); + void setViewRect(const IntRect& viewRect); + void clip(const TransformationMatrix& drawMatrix, const FloatRect& rect); private: GLuint loadShader(GLenum shaderType, const char* pSource); @@ -49,6 +53,11 @@ class ShaderProgram { TransformationMatrix m_projectionMatrix; GLuint m_textureBuffer[1]; + TransformationMatrix m_clippingMatrix; + SkRect m_viewport; + IntRect m_viewRect; + FloatRect m_clipRect; + // uniforms int m_hProjectionMatrix; int m_hAlpha; |