Home | History | Annotate | Download | only in gpu
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #ifndef GrAARectRenderer_DEFINED
      9 #define GrAARectRenderer_DEFINED
     10 
     11 #include "SkMatrix.h"
     12 #include "SkRect.h"
     13 #include "SkRefCnt.h"
     14 #include "SkStrokeRec.h"
     15 
     16 class GrGpu;
     17 class GrDrawTarget;
     18 class GrIndexBuffer;
     19 
     20 /*
     21  * This class wraps helper functions that draw AA rects (filled & stroked)
     22  */
     23 class GrAARectRenderer : public SkRefCnt {
     24 public:
     25     SK_DECLARE_INST_COUNT(GrAARectRenderer)
     26 
     27     GrAARectRenderer()
     28     : fAAFillRectIndexBuffer(NULL)
     29     , fAAMiterStrokeRectIndexBuffer(NULL)
     30     , fAABevelStrokeRectIndexBuffer(NULL) {
     31     }
     32 
     33     void reset();
     34 
     35     ~GrAARectRenderer() {
     36         this->reset();
     37     }
     38 
     39     // TODO: potentialy fuse the fill & stroke methods and differentiate
     40     // between them by passing in stroke (==NULL means fill).
     41 
     42     void fillAARect(GrGpu* gpu,
     43                     GrDrawTarget* target,
     44                     const SkRect& rect,
     45                     const SkMatrix& combinedMatrix,
     46                     const SkRect& devRect,
     47                     bool useVertexCoverage) {
     48 #ifdef SHADER_AA_FILL_RECT
     49         if (combinedMatrix.rectStaysRect()) {
     50             this->shaderFillAlignedAARect(gpu, target,
     51                                           rect, combinedMatrix);
     52         } else {
     53             this->shaderFillAARect(gpu, target,
     54                                    rect, combinedMatrix);
     55         }
     56 #else
     57         this->geometryFillAARect(gpu, target,
     58                                  rect, combinedMatrix,
     59                                  devRect, useVertexCoverage);
     60 #endif
     61     }
     62 
     63     void strokeAARect(GrGpu* gpu,
     64                       GrDrawTarget* target,
     65                       const SkRect& rect,
     66                       const SkMatrix& combinedMatrix,
     67                       const SkRect& devRect,
     68                       const SkStrokeRec& stroke,
     69                       bool useVertexCoverage);
     70 
     71     // First rect is outer; second rect is inner
     72     void fillAANestedRects(GrGpu* gpu,
     73                            GrDrawTarget* target,
     74                            const SkRect rects[2],
     75                            const SkMatrix& combinedMatrix,
     76                            bool useVertexCoverage);
     77 
     78 private:
     79     GrIndexBuffer*              fAAFillRectIndexBuffer;
     80     GrIndexBuffer*              fAAMiterStrokeRectIndexBuffer;
     81     GrIndexBuffer*              fAABevelStrokeRectIndexBuffer;
     82 
     83     GrIndexBuffer* aaFillRectIndexBuffer(GrGpu* gpu);
     84 
     85     static int aaStrokeRectIndexCount(bool miterStroke);
     86     GrIndexBuffer* aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterStroke);
     87 
     88     // TODO: Remove the useVertexCoverage boolean. Just use it all the time
     89     // since we now have a coverage vertex attribute
     90     void geometryFillAARect(GrGpu* gpu,
     91                             GrDrawTarget* target,
     92                             const SkRect& rect,
     93                             const SkMatrix& combinedMatrix,
     94                             const SkRect& devRect,
     95                             bool useVertexCoverage);
     96 
     97     void shaderFillAARect(GrGpu* gpu,
     98                           GrDrawTarget* target,
     99                           const SkRect& rect,
    100                           const SkMatrix& combinedMatrix);
    101 
    102     void shaderFillAlignedAARect(GrGpu* gpu,
    103                                  GrDrawTarget* target,
    104                                  const SkRect& rect,
    105                                  const SkMatrix& combinedMatrix);
    106 
    107     void geometryStrokeAARect(GrGpu* gpu,
    108                               GrDrawTarget* target,
    109                               const SkRect& devOutside,
    110                               const SkRect& devOutsideAssist,
    111                               const SkRect& devInside,
    112                               bool useVertexCoverage,
    113                               bool miterStroke);
    114 
    115     typedef SkRefCnt INHERITED;
    116 };
    117 
    118 #endif // GrAARectRenderer_DEFINED
    119