Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(739)

Unified Diff: src/gpu/batches/GrRectBatchFactory.cpp

Issue 1279303002: Expand functionality of GrRectBatchFactory with AARects (Closed) Base URL: https://skia.googlesource.com/skia.git@batchfactory3
Patch Set: tweaks Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/batches/GrRectBatchFactory.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/batches/GrRectBatchFactory.cpp
diff --git a/src/gpu/batches/GrRectBatchFactory.cpp b/src/gpu/batches/GrRectBatchFactory.cpp
index e2597d2a66e2bfcc16cdd4fba59e529168b34abf..33b51878a539566fdb6260834d444876d8ad253e 100644
--- a/src/gpu/batches/GrRectBatchFactory.cpp
+++ b/src/gpu/batches/GrRectBatchFactory.cpp
@@ -7,9 +7,29 @@
#include "GrRectBatchFactory.h"
+#include "GrAAFillRectBatch.h"
+#include "GrAAStrokeRectBatch.h"
#include "GrRectBatch.h"
#include "GrStrokeRectBatch.h"
+#include "SkStrokeRec.h"
+
+static GrBatch* create_stroke_aa_batch(GrColor color,
+ const SkMatrix& viewMatrix,
+ const SkRect& devOutside,
+ const SkRect& devOutsideAssist,
+ const SkRect& devInside,
+ bool miterStroke) {
+ GrAAStrokeRectBatch::Geometry geometry;
+ geometry.fColor = color;
+ geometry.fDevOutside = devOutside;
+ geometry.fDevOutsideAssist = devOutsideAssist;
+ geometry.fDevInside = devInside;
+ geometry.fMiterStroke = miterStroke;
+
+ return GrAAStrokeRectBatch::Create(geometry, viewMatrix);
+}
+
namespace GrRectBatchFactory {
GrBatch* CreateFillBW(GrColor color,
@@ -39,6 +59,19 @@ GrBatch* CreateFillBW(GrColor color,
return GrRectBatch::Create(geometry);
}
+GrBatch* CreateFillAA(GrColor color,
+ const SkMatrix& viewMatrix,
+ const SkRect& rect,
+ const SkRect& devRect) {
+ GrAAFillRectBatch::Geometry geometry;
+ geometry.fRect = rect;
+ geometry.fViewMatrix = viewMatrix;
+ geometry.fDevRect = devRect;
+ geometry.fColor = color;
+
+ return GrAAFillRectBatch::Create(geometry);
+}
+
GrBatch* CreateStrokeBW(GrColor color,
const SkMatrix& viewMatrix,
const SkRect& rect,
@@ -52,4 +85,80 @@ GrBatch* CreateStrokeBW(GrColor color,
return GrStrokeRectBatch::Create(geometry, snapToPixelCenters);
}
+GrBatch* CreateStrokeAA(GrColor color,
+ const SkMatrix& viewMatrix,
+ const SkRect& rect,
+ const SkRect& devRect,
+ const SkStrokeRec& stroke) {
+ SkVector devStrokeSize;
+ SkScalar width = stroke.getWidth();
+ if (width > 0) {
+ devStrokeSize.set(width, width);
+ viewMatrix.mapVectors(&devStrokeSize, 1);
+ devStrokeSize.setAbs(devStrokeSize);
+ } else {
+ devStrokeSize.set(SK_Scalar1, SK_Scalar1);
+ }
+
+ const SkScalar dx = devStrokeSize.fX;
+ const SkScalar dy = devStrokeSize.fY;
+ const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf);
+ const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf);
+
+ SkScalar spare;
+ {
+ SkScalar w = devRect.width() - dx;
+ SkScalar h = devRect.height() - dy;
+ spare = SkTMin(w, h);
+ }
+
+ SkRect devOutside(devRect);
+ devOutside.outset(rx, ry);
+
+ bool miterStroke = true;
+ // For hairlines, make bevel and round joins appear the same as mitered ones.
+ // small miter limit means right angles show bevel...
+ if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join ||
+ stroke.getMiter() < SK_ScalarSqrt2)) {
+ miterStroke = false;
+ }
+
+ if (spare <= 0 && miterStroke) {
+ return CreateFillAA(color, viewMatrix, devOutside, devOutside);
+ }
+
+ SkRect devInside(devRect);
+ devInside.inset(rx, ry);
+
+ SkRect devOutsideAssist(devRect);
+
+ // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist)
+ // to draw the outer of the rect. Because there are 8 vertices on the outer
+ // edge, while vertex number of inner edge is 4, the same as miter-stroke.
+ if (!miterStroke) {
+ devOutside.inset(0, ry);
+ devOutsideAssist.outset(0, ry);
+ }
+
+ return create_stroke_aa_batch(color, viewMatrix, devOutside, devOutsideAssist, devInside,
+ miterStroke);
+}
+
+GrBatch* CreateFillNestedRectsAA(GrColor color,
+ const SkMatrix& viewMatrix,
+ const SkRect rects[2]) {
+ SkASSERT(viewMatrix.rectStaysRect());
+ SkASSERT(!rects[0].isEmpty() && !rects[1].isEmpty());
+
+ SkRect devOutside, devInside;
+ viewMatrix.mapRect(&devOutside, rects[0]);
+ viewMatrix.mapRect(&devInside, rects[1]);
+
+ if (devInside.isEmpty()) {
+ return CreateFillAA(color, viewMatrix, devOutside, devOutside);
+ }
+
+ return create_stroke_aa_batch(color, viewMatrix, devOutside, devOutside, devInside, true);
+}
+
};
« no previous file with comments | « src/gpu/batches/GrRectBatchFactory.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698