blob: 9ab7a46bbe3002c0a1af37631e874cb798b9e958 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef ShaderProgram_h
#define ShaderProgram_h
#if USE(ACCELERATED_COMPOSITING)
#include "FloatRect.h"
#include "IntRect.h"
#include "SkRect.h"
#include "TransformationMatrix.h"
#include <GLES2/gl2.h>
#define MAX_CONTRAST 5
namespace WebCore {
class ShaderProgram {
public:
ShaderProgram();
void init();
int program() { return m_program; }
// Drawing
void setViewport(SkRect& viewport, float scale);
float zValue(const TransformationMatrix& drawMatrix, float w, float h);
// For drawQuad and drawLayerQuad, they can handle 3 cases for now:
// 1) textureTarget == GL_TEXTURE_2D
// Normal texture in GL_TEXTURE_2D target.
// 2) textureTarget == GL_TEXTURE_EXTERNAL_OES
// Surface texture in GL_TEXTURE_EXTERNAL_OES target.
// 3) textureTarget == 0 (Will be deprecated soon)
// Surface texture in GL_TEXTURE_2D target.
//
// TODO: Shrink the support modes into 2 (1 and 2) after media framework
// support Surface texture in GL_TEXTURE_EXTERNAL_OES target on all
// platforms.
void drawQuad(SkRect& geometry, int textureId, float opacity,
GLenum textureTarget = GL_TEXTURE_2D,
GLint texFilter = GL_LINEAR);
void drawLayerQuad(const TransformationMatrix& drawMatrix,
const SkRect& geometry, int textureId, float opacity,
bool forceBlending = false,
GLenum textureTarget = GL_TEXTURE_2D);
void drawVideoLayerQuad(const TransformationMatrix& drawMatrix,
float* textureMatrix, SkRect& geometry, int textureId);
void setViewRect(const IntRect& viewRect);
FloatRect rectInScreenCoord(const TransformationMatrix& drawMatrix,
const IntSize& size);
FloatRect rectInInvScreenCoord(const TransformationMatrix& drawMatrix,
const IntSize& size);
FloatRect rectInInvScreenCoord(const FloatRect& rect);
FloatRect rectInScreenCoord(const FloatRect& rect);
FloatRect convertScreenCoordToDocumentCoord(const FloatRect& rect);
FloatRect convertInvScreenCoordToScreenCoord(const FloatRect& rect);
FloatRect convertScreenCoordToInvScreenCoord(const FloatRect& rect);
void setTitleBarHeight(int height) { m_titleBarHeight = height; }
void setWebViewRect(const IntRect& rect) { m_webViewRect = rect; }
void setScreenClip(const IntRect& clip);
void clip(const FloatRect& rect);
IntRect clippedRectWithViewport(const IntRect& rect, int margin = 0);
FloatRect documentViewport() { return m_documentViewport; }
void resetBlending();
float contrast() { return m_contrast; }
void setContrast(float c) {
float contrast = c;
if (contrast < 0)
contrast = 0;
if (contrast > MAX_CONTRAST)
contrast = MAX_CONTRAST;
m_contrast = contrast;
}
void setWebViewMatrix(const float* matrix, bool alphaLayer);
// This delta is the delta from the layout pos and the current animation pos.
// Basically, in terms of layout, the webview is still in the original layout
// pos, as without animation. Such that the viewport and visible rect etc are
// still in that pos, too, except the clipping info.
// Our rendering approach is after applying all the matrix, webView is
// rendered as if it was at the original layout pos, but then offset the
// glViewport to match the animation.
void calculateAnimationDelta();
int getAnimationDeltaX() { return m_animationDelta.x(); }
int getAnimationDeltaY() { return m_animationDelta.y(); }
private:
GLuint loadShader(GLenum shaderType, const char* pSource);
GLuint createProgram(const char* vertexSource, const char* fragmentSource);
void setProjectionMatrix(SkRect& geometry, GLint projectionMatrixHandle);
void setBlendingState(bool enableBlending);
void drawQuadInternal(SkRect& geometry, GLint textureId, float opacity,
GLint program, GLint projectionMatrixHandle,
GLint texSampler, GLenum textureTarget,
GLint position, GLint alpha,
GLint texFilter, GLint contrast = -1);
void drawLayerQuadInternal(const GLfloat* projectionMatrix, int textureId,
float opacity, GLenum textureTarget, GLint program,
GLint matrix, GLint texSample,
GLint position, GLint alpha, GLint contrast = -1);
bool m_blendingEnabled;
int m_program;
int m_programInverted;
int m_videoProgram;
int m_surfTexOESProgram;
int m_surfTexOESProgramInverted;
TransformationMatrix m_projectionMatrix;
GLuint m_textureBuffer[1];
TransformationMatrix m_documentToScreenMatrix;
TransformationMatrix m_documentToInvScreenMatrix;
SkRect m_viewport;
IntRect m_viewRect;
FloatRect m_clipRect;
IntRect m_screenClip;
int m_titleBarHeight;
IntRect m_webViewRect;
FloatRect m_documentViewport;
// uniforms
GLint m_hProjectionMatrix;
GLint m_hAlpha;
GLint m_hTexSampler;
GLint m_hProjectionMatrixInverted;
GLint m_hAlphaInverted;
GLint m_hContrastInverted;
GLint m_hTexSamplerInverted;
GLint m_hVideoProjectionMatrix;
GLint m_hVideoTextureMatrix;
GLint m_hVideoTexSampler;
GLint m_hSTOESProjectionMatrix;
GLint m_hSTOESAlpha;
GLint m_hSTOESTexSampler;
GLint m_hSTOESPosition;
GLint m_hSTOESProjectionMatrixInverted;
GLint m_hSTOESAlphaInverted;
GLint m_hSTOESContrastInverted;
GLint m_hSTOESTexSamplerInverted;
GLint m_hSTOESPositionInverted;
float m_contrast;
// attribs
GLint m_hPosition;
GLint m_hPositionInverted;
GLint m_hVideoPosition;
bool m_alphaLayer;
TransformationMatrix m_webViewMatrix;
float m_currentScale;
// After the webViewTranform, we need to reposition the rect to match our viewport.
// Basically, the webViewTransformMatrix should apply on the screen resolution.
// So we start by doing the scale and translate to get each tile into screen coordinates.
// After applying the webViewTransformMatrix, b/c the way it currently set up
// for scroll and titlebar, we need to offset both of them.
// Finally, map everything back to (-1, 1) by using the m_projectionMatrix.
// TODO: Given that m_webViewMatrix contains most of the tranformation
// information, we should be able to get rid of some parameter we got from
// Java side and simplify our code.
TransformationMatrix m_repositionMatrix;
IntPoint m_animationDelta;
};
} // namespace WebCore
#endif // USE(ACCELERATED_COMPOSITING)
#endif // ShaderProgram_h