Home | History | Annotate | Download | only in rendering
      1 /*
      2  * Copyright 2012, The Android Open Source Project
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *  * Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  *  * Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef DrawQuadData_h
     27 #define DrawQuadData_h
     28 
     29 #if USE(ACCELERATED_COMPOSITING)
     30 
     31 #include "Color.h"
     32 #include "FloatRect.h"
     33 #include "SkRect.h"
     34 #include <GLES2/gl2.h>
     35 
     36 namespace WebCore {
     37 
     38 class TransformationMatrix;
     39 
     40 enum DrawQuadType {
     41     BaseQuad,
     42     LayerQuad,
     43     Blit        // 1:1 straight pixel blit
     44 };
     45 
     46 // Both PureColorQuadData and TextureQuadData share the data from DrawQuadData.
     47 class DrawQuadData {
     48 public:
     49     DrawQuadData(DrawQuadType type = BaseQuad,
     50                  const TransformationMatrix* drawMatrix = 0,
     51                  const SkRect* geometry = 0,
     52                  float opacity = 1.0f,
     53                  bool forceBlending = true,
     54                  FloatRect fillPortion = FloatRect(0.0f, 0.0f, 1.0f, 1.0f))
     55         : m_type(type)
     56         , m_drawMatrix(drawMatrix)
     57         , m_geometry(geometry)
     58         , m_opacity(opacity)
     59         , m_forceBlending(forceBlending)
     60         , m_fillPortion(fillPortion.x(), fillPortion.y(),
     61                         fillPortion.width(), fillPortion.height())
     62     {
     63     }
     64 
     65     DrawQuadData(const DrawQuadData& data)
     66         : m_type(data.m_type)
     67         , m_drawMatrix(data.m_drawMatrix)
     68         , m_geometry(data.m_geometry)
     69         , m_opacity(data.m_opacity)
     70         , m_forceBlending(data.m_forceBlending)
     71         , m_fillPortion(data.m_fillPortion.x(), data.m_fillPortion.y(),
     72                         data.m_fillPortion.width(), data.m_fillPortion.height())
     73     {
     74     }
     75 
     76     virtual ~DrawQuadData() {};
     77 
     78     DrawQuadType type() const { return m_type; }
     79     const TransformationMatrix* drawMatrix() const { return m_drawMatrix; }
     80     const SkRect* geometry() const { return m_geometry; }
     81     float opacity() const { return m_opacity; }
     82     bool forceBlending() const { return m_forceBlending; }
     83 
     84     void updateDrawMatrix(TransformationMatrix* matrix) { m_drawMatrix = matrix; }
     85     void updateGeometry(SkRect* rect) { m_geometry = rect; }
     86     void updateOpacity(float opacity) { m_opacity = opacity; }
     87 
     88     virtual bool pureColor() const { return false; }
     89 
     90     virtual Color quadColor() const { return Color(); }
     91 
     92     virtual int textureId() const { return 0; }
     93     virtual GLint textureFilter() const { return 0; }
     94     virtual GLenum textureTarget() const { return 0; }
     95     virtual FloatRect fillPortion() const { return m_fillPortion; }
     96     virtual bool hasRepeatScale() const { return false; }
     97     virtual FloatSize repeatScale() const { return FloatSize(); }
     98 
     99 private:
    100     DrawQuadType m_type;
    101     const TransformationMatrix* m_drawMatrix;
    102     const SkRect* m_geometry;
    103     float m_opacity;
    104     bool m_forceBlending;
    105     FloatRect m_fillPortion;
    106 };
    107 
    108 class PureColorQuadData : public DrawQuadData {
    109 public:
    110     PureColorQuadData(Color color,
    111                       DrawQuadType type = BaseQuad,
    112                       const TransformationMatrix* drawMatrix = 0,
    113                       const SkRect* geometry = 0,
    114                       float opacity = 1.0f,
    115                       bool forceBlending = true)
    116         : DrawQuadData(type, drawMatrix, geometry, opacity, forceBlending)
    117     {
    118         m_quadColor = color;
    119     }
    120 
    121     PureColorQuadData(const DrawQuadData& data, Color color)
    122         : DrawQuadData(data)
    123     {
    124         m_quadColor = color;
    125     }
    126 
    127     virtual ~PureColorQuadData() {};
    128     virtual bool pureColor() const { return true; }
    129     virtual Color quadColor() const { return m_quadColor; }
    130     void updateColor(const Color& color) { m_quadColor = color; }
    131 
    132 private:
    133     Color m_quadColor;
    134 };
    135 
    136 class TextureQuadData : public DrawQuadData {
    137 public:
    138     TextureQuadData(int textureId,
    139                     GLenum textureTarget = GL_TEXTURE_2D,
    140                     GLint textureFilter = GL_LINEAR,
    141                     DrawQuadType type = BaseQuad,
    142                     const TransformationMatrix* drawMatrix = 0,
    143                     const SkRect* geometry = 0,
    144                     float opacity = 1.0f,
    145                     bool forceBlending = true,
    146                     FloatRect fillPortion = FloatRect(0.0f, 0.0f, 1.0f, 1.0f),
    147                     FloatSize repeatScale = FloatSize())
    148         : DrawQuadData(type, drawMatrix, geometry, opacity, forceBlending, fillPortion)
    149     {
    150         m_textureId = textureId;
    151         m_textureTarget = textureTarget;
    152         m_textureFilter = textureFilter;
    153         m_repeatScale = repeatScale;
    154     }
    155 
    156     TextureQuadData(const DrawQuadData& data,
    157                     int textureId,
    158                     GLenum textureTarget = GL_TEXTURE_2D,
    159                     GLint textureFilter = GL_LINEAR)
    160         : DrawQuadData(data)
    161     {
    162         m_textureId = textureId;
    163         m_textureTarget = textureTarget;
    164         m_textureFilter = textureFilter;
    165     }
    166 
    167     virtual ~TextureQuadData() {};
    168     virtual bool pureColor() const { return false; }
    169 
    170     virtual int textureId() const { return m_textureId; }
    171     virtual GLint textureFilter() const { return m_textureFilter; }
    172     virtual GLenum textureTarget() const { return m_textureTarget; }
    173 
    174     void updateTextureId(int newId) { m_textureId = newId; }
    175     virtual bool hasRepeatScale() const { return !m_repeatScale.isEmpty(); }
    176     virtual FloatSize repeatScale() const { return m_repeatScale; }
    177 private:
    178     int m_textureId;
    179     GLint m_textureFilter;
    180     GLenum m_textureTarget;
    181     FloatSize m_repeatScale;
    182 };
    183 
    184 } // namespace WebCore
    185 
    186 #endif // USE(ACCELERATED_COMPOSITING)
    187 #endif // DrawQuadData_h
    188