1 /*
2  * Copyright 2015 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 GrRectOpFactory_DEFINED
9 #define GrRectOpFactory_DEFINED
10 
11 #include "GrAAFillRectOp.h"
12 #include "GrAAStrokeRectOp.h"
13 #include "GrAnalyticRectOp.h"
14 #include "GrColor.h"
15 #include "GrMeshDrawOp.h"
16 #include "GrNonAAFillRectOp.h"
17 #include "GrNonAAStrokeRectOp.h"
18 #include "GrPaint.h"
19 #include "SkMatrix.h"
20 #include "SkRefCnt.h"
21 
22 struct SkRect;
23 class SkStrokeRec;
24 
25 /**
26  * A factory for returning GrDrawOps which can draw rectangles.
27  */
28 namespace GrRectOpFactory {
29 
MakeNonAAFill(GrColor color,const SkMatrix & viewMatrix,const SkRect & rect,const SkRect * localRect,const SkMatrix * localMatrix)30 inline std::unique_ptr<GrMeshDrawOp> MakeNonAAFill(GrColor color,
31                                                    const SkMatrix& viewMatrix,
32                                                    const SkRect& rect,
33                                                    const SkRect* localRect,
34                                                    const SkMatrix* localMatrix) {
35     if (viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())) {
36         return GrNonAAFillRectOp::MakeWithPerspective(color, viewMatrix, rect, localRect,
37                                                       localMatrix);
38     } else {
39         return GrNonAAFillRectOp::Make(color, viewMatrix, rect, localRect, localMatrix);
40     }
41 }
42 
MakeAAFill(const GrPaint & paint,const SkMatrix & viewMatrix,const SkRect & rect,const SkRect & croppedRect,const SkRect & devRect)43 inline std::unique_ptr<GrMeshDrawOp> MakeAAFill(const GrPaint& paint,
44                                                 const SkMatrix& viewMatrix,
45                                                 const SkRect& rect,
46                                                 const SkRect& croppedRect,
47                                                 const SkRect& devRect) {
48     if (!paint.usesDistanceVectorField()) {
49         return GrAAFillRectOp::Make(paint.getColor(), viewMatrix, croppedRect, devRect);
50     } else {
51         return GrAnalyticRectOp::Make(paint.getColor(), viewMatrix, rect, croppedRect, devRect);
52     }
53 }
54 
MakeAAFill(GrColor color,const SkMatrix & viewMatrix,const SkMatrix & localMatrix,const SkRect & rect,const SkRect & devRect)55 inline std::unique_ptr<GrMeshDrawOp> MakeAAFill(GrColor color,
56                                                 const SkMatrix& viewMatrix,
57                                                 const SkMatrix& localMatrix,
58                                                 const SkRect& rect,
59                                                 const SkRect& devRect) {
60     return GrAAFillRectOp::Make(color, viewMatrix, localMatrix, rect, devRect);
61 }
62 
MakeNonAAStroke(GrColor color,const SkMatrix & viewMatrix,const SkRect & rect,const SkStrokeRec & strokeRec,bool snapToPixelCenters)63 inline std::unique_ptr<GrMeshDrawOp> MakeNonAAStroke(GrColor color,
64                                                      const SkMatrix& viewMatrix,
65                                                      const SkRect& rect,
66                                                      const SkStrokeRec& strokeRec,
67                                                      bool snapToPixelCenters) {
68     return GrNonAAStrokeRectOp::Make(color, viewMatrix, rect, strokeRec, snapToPixelCenters);
69 }
70 
MakeAAStroke(GrColor color,const SkMatrix & viewMatrix,const SkRect & rect,const SkStrokeRec & stroke)71 inline std::unique_ptr<GrMeshDrawOp> MakeAAStroke(GrColor color,
72                                                   const SkMatrix& viewMatrix,
73                                                   const SkRect& rect,
74                                                   const SkStrokeRec& stroke) {
75     return GrAAStrokeRectOp::Make(color, viewMatrix, rect, stroke);
76 }
77 
78 // First rect is outer; second rect is inner
79 std::unique_ptr<GrMeshDrawOp> MakeAAFillNestedRects(GrColor, const SkMatrix& viewMatrix,
80                                                     const SkRect rects[2]);
81 };
82 
83 #endif
84