180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef GrAARectRenderer_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define GrAARectRenderer_DEFINED
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrRefCnt.h"
137839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkMatrix.h"
1458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger#include "SkRect.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrGpu;
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrDrawTarget;
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrIndexBuffer;
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * This class wraps helper functions that draw AA rects (filled & stroked)
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass GrAARectRenderer : public GrRefCnt {
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SK_DECLARE_INST_COUNT(GrAARectRenderer)
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrAARectRenderer()
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    : fAAFillRectIndexBuffer(NULL)
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    , fAAStrokeRectIndexBuffer(NULL) {
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void reset();
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    ~GrAARectRenderer() {
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->reset();
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // TODO: potentialy fuse the fill & stroke methods and differentiate
397839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // between them by passing in strokeWidth (<0 means fill).
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void fillAARect(GrGpu* gpu,
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                    GrDrawTarget* target,
4358190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                    const SkRect& rect,
447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                    const SkMatrix& combinedMatrix,
4558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                    const SkRect& devRect,
467839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                    bool useVertexCoverage) {
477839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#ifdef SHADER_AA_FILL_RECT
487839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        if (combinedMatrix.rectStaysRect()) {
497839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            this->shaderFillAlignedAARect(gpu, target,
507839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                          rect, combinedMatrix);
517839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        } else {
527839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger            this->shaderFillAARect(gpu, target,
537839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                   rect, combinedMatrix);
547839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        }
557839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#else
567839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger        this->geometryFillAARect(gpu, target,
577839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 rect, combinedMatrix,
587839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 devRect, useVertexCoverage);
597839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#endif
607839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    }
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void strokeAARect(GrGpu* gpu,
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                      GrDrawTarget* target,
6458190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                      const SkRect& rect,
657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                      const SkMatrix& combinedMatrix,
6658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                      const SkRect& devRect,
677839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                      SkScalar width,
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                      bool useVertexCoverage);
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
707839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // First rect is outer; second rect is inner
717839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void fillAANestedRects(GrGpu* gpu,
727839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                           GrDrawTarget* target,
737839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                           const SkRect rects[2],
747839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                           const SkMatrix& combinedMatrix,
757839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                           bool useVertexCoverage);
767839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrIndexBuffer*              fAAFillRectIndexBuffer;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrIndexBuffer*              fAAStrokeRectIndexBuffer;
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrIndexBuffer* aaFillRectIndexBuffer(GrGpu* gpu);
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static int aaStrokeRectIndexCount();
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    GrIndexBuffer* aaStrokeRectIndexBuffer(GrGpu* gpu);
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
867839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // TODO: Remove the useVertexCoverage boolean. Just use it all the time
877839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    // since we now have a coverage vertex attribute
887839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void geometryFillAARect(GrGpu* gpu,
897839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                            GrDrawTarget* target,
9058190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                            const SkRect& rect,
917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                            const SkMatrix& combinedMatrix,
9258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                            const SkRect& devRect,
937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                            bool useVertexCoverage);
947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void shaderFillAARect(GrGpu* gpu,
967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                          GrDrawTarget* target,
9758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                          const SkRect& rect,
987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                          const SkMatrix& combinedMatrix);
997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void shaderFillAlignedAARect(GrGpu* gpu,
1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 GrDrawTarget* target,
10258190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger                                 const SkRect& rect,
1037839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                                 const SkMatrix& combinedMatrix);
1047839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
1057839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger    void geometryStrokeAARect(GrGpu* gpu,
1067839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              GrDrawTarget* target,
1077839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              const SkRect& devOutside,
1087839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              const SkRect& devInside,
1097839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger                              bool useVertexCoverage);
1107839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef GrRefCnt INHERITED;
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif // GrAARectRenderer_DEFINED
115