summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/graphics')
-rw-r--r--WebCore/platform/graphics/android/BaseLayerAndroid.cpp4
-rw-r--r--WebCore/platform/graphics/android/LayerAndroid.cpp27
-rw-r--r--WebCore/platform/graphics/android/LayerAndroid.h7
-rw-r--r--WebCore/platform/graphics/android/ShaderProgram.cpp37
-rw-r--r--WebCore/platform/graphics/android/ShaderProgram.h9
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;