diff -r 000000000000 -r 6474c204b198 gfx/skia/trunk/src/gpu/GrAARectRenderer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/skia/trunk/src/gpu/GrAARectRenderer.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,118 @@ +/* + * Copyright 2012 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef GrAARectRenderer_DEFINED +#define GrAARectRenderer_DEFINED + +#include "SkMatrix.h" +#include "SkRect.h" +#include "SkRefCnt.h" +#include "SkStrokeRec.h" + +class GrGpu; +class GrDrawTarget; +class GrIndexBuffer; + +/* + * This class wraps helper functions that draw AA rects (filled & stroked) + */ +class GrAARectRenderer : public SkRefCnt { +public: + SK_DECLARE_INST_COUNT(GrAARectRenderer) + + GrAARectRenderer() + : fAAFillRectIndexBuffer(NULL) + , fAAMiterStrokeRectIndexBuffer(NULL) + , fAABevelStrokeRectIndexBuffer(NULL) { + } + + void reset(); + + ~GrAARectRenderer() { + this->reset(); + } + + // TODO: potentialy fuse the fill & stroke methods and differentiate + // between them by passing in stroke (==NULL means fill). + + void fillAARect(GrGpu* gpu, + GrDrawTarget* target, + const SkRect& rect, + const SkMatrix& combinedMatrix, + const SkRect& devRect, + bool useVertexCoverage) { +#ifdef SHADER_AA_FILL_RECT + if (combinedMatrix.rectStaysRect()) { + this->shaderFillAlignedAARect(gpu, target, + rect, combinedMatrix); + } else { + this->shaderFillAARect(gpu, target, + rect, combinedMatrix); + } +#else + this->geometryFillAARect(gpu, target, + rect, combinedMatrix, + devRect, useVertexCoverage); +#endif + } + + void strokeAARect(GrGpu* gpu, + GrDrawTarget* target, + const SkRect& rect, + const SkMatrix& combinedMatrix, + const SkRect& devRect, + const SkStrokeRec* stroke, + bool useVertexCoverage); + + // First rect is outer; second rect is inner + void fillAANestedRects(GrGpu* gpu, + GrDrawTarget* target, + const SkRect rects[2], + const SkMatrix& combinedMatrix, + bool useVertexCoverage); + +private: + GrIndexBuffer* fAAFillRectIndexBuffer; + GrIndexBuffer* fAAMiterStrokeRectIndexBuffer; + GrIndexBuffer* fAABevelStrokeRectIndexBuffer; + + GrIndexBuffer* aaFillRectIndexBuffer(GrGpu* gpu); + + static int aaStrokeRectIndexCount(bool miterStroke); + GrIndexBuffer* aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterStroke); + + // TODO: Remove the useVertexCoverage boolean. Just use it all the time + // since we now have a coverage vertex attribute + void geometryFillAARect(GrGpu* gpu, + GrDrawTarget* target, + const SkRect& rect, + const SkMatrix& combinedMatrix, + const SkRect& devRect, + bool useVertexCoverage); + + void shaderFillAARect(GrGpu* gpu, + GrDrawTarget* target, + const SkRect& rect, + const SkMatrix& combinedMatrix); + + void shaderFillAlignedAARect(GrGpu* gpu, + GrDrawTarget* target, + const SkRect& rect, + const SkMatrix& combinedMatrix); + + void geometryStrokeAARect(GrGpu* gpu, + GrDrawTarget* target, + const SkRect& devOutside, + const SkRect& devOutsideAssist, + const SkRect& devInside, + bool useVertexCoverage, + bool miterStroke); + + typedef SkRefCnt INHERITED; +}; + +#endif // GrAARectRenderer_DEFINED