| /* | |
| * 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) { | |
| #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); | |
| #endif | |
| } | |
| void strokeAARect(GrGpu* gpu, | |
| GrDrawTarget* target, | |
| const SkRect& rect, | |
| const SkMatrix& combinedMatrix, | |
| const SkRect& devRect, | |
| const SkStrokeRec& stroke); | |
| // First rect is outer; second rect is inner | |
| void fillAANestedRects(GrGpu* gpu, | |
| GrDrawTarget* target, | |
| const SkRect rects[2], | |
| const SkMatrix& combinedMatrix); | |
| private: | |
| GrIndexBuffer* fAAFillRectIndexBuffer; | |
| GrIndexBuffer* fAAMiterStrokeRectIndexBuffer; | |
| GrIndexBuffer* fAABevelStrokeRectIndexBuffer; | |
| GrIndexBuffer* aaFillRectIndexBuffer(GrGpu* gpu); | |
| static int aaStrokeRectIndexCount(bool miterStroke); | |
| GrIndexBuffer* aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterStroke); | |
| void geometryFillAARect(GrGpu* gpu, | |
| GrDrawTarget* target, | |
| const SkRect& rect, | |
| const SkMatrix& combinedMatrix, | |
| const SkRect& devRect); | |
| 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 miterStroke); | |
| typedef SkRefCnt INHERITED; | |
| }; | |
| #endif // GrAARectRenderer_DEFINED |