GrAARectRenderer.h revision 7839ce1af63bf12fe7b3caa866970bbbb3afb13d
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 "GrRect.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "GrRefCnt.h" 147839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger#include "SkMatrix.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, 437839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrRect& rect, 447839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMatrix& combinedMatrix, 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrRect& 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, 647839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrRect& rect, 657839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMatrix& combinedMatrix, 6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru const GrRect& 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, 907839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrRect& rect, 917839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMatrix& combinedMatrix, 927839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrRect& devRect, 937839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger bool useVertexCoverage); 947839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 957839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger void shaderFillAARect(GrGpu* gpu, 967839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrDrawTarget* target, 977839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrRect& rect, 987839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const SkMatrix& combinedMatrix); 997839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger 1007839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger void shaderFillAlignedAARect(GrGpu* gpu, 1017839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger GrDrawTarget* target, 1027839ce1af63bf12fe7b3caa866970bbbb3afb13dDerek Sollenberger const GrRect& 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