Index: src/gpu/GrDrawContext.cpp |
diff --git a/src/gpu/GrDrawContext.cpp b/src/gpu/GrDrawContext.cpp |
index 8b956476312f7c3d61ae6a33a9f001490124aa62..303361114655bf9fdfdfe590b3ce212be35dd1a5 100644 |
--- a/src/gpu/GrDrawContext.cpp |
+++ b/src/gpu/GrDrawContext.cpp |
@@ -202,6 +202,35 @@ |
NULL, |
&localMatrix); |
} |
+} |
+ |
+static inline bool is_irect(const SkRect& r) { |
+ return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && |
+ SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); |
+} |
+ |
+static bool apply_aa_to_rect(GrDrawTarget* target, |
+ GrPipelineBuilder* pipelineBuilder, |
+ SkRect* devBoundRect, |
+ const SkRect& rect, |
+ SkScalar strokeWidth, |
+ const SkMatrix& combinedMatrix, |
+ GrColor color) { |
+ if (pipelineBuilder->getRenderTarget()->isUnifiedMultisampled() || |
+ !combinedMatrix.preservesAxisAlignment()) { |
+ return false; |
+ } |
+ |
+ combinedMatrix.mapRect(devBoundRect, rect); |
+ if (!combinedMatrix.rectStaysRect()) { |
+ return true; |
+ } |
+ |
+ if (strokeWidth < 0) { |
+ return !is_irect(*devBoundRect); |
+ } |
+ |
+ return true; |
} |
static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& point) { |
@@ -268,18 +297,13 @@ |
} |
GrColor color = paint.getColor(); |
+ SkRect devBoundRect; |
bool needAA = paint.isAntiAlias() && |
!pipelineBuilder.getRenderTarget()->isUnifiedMultisampled(); |
- |
- // The fill path can handle rotation but not skew |
- // The stroke path needs the rect to remain axis aligned (no rotation or skew) |
- // None of our draw rect calls can handle perspective yet |
- SkASSERT(!viewMatrix.hasPerspective()); |
- bool canApplyAA = width >=0 ? viewMatrix.rectStaysRect() : viewMatrix.preservesRightAngles(); |
- |
- if (needAA && canApplyAA) { |
- SkRect devBoundRect; |
- viewMatrix.mapRect(&devBoundRect, rect); |
+ bool doAA = needAA && apply_aa_to_rect(fDrawTarget, &pipelineBuilder, &devBoundRect, rect, |
+ width, viewMatrix, color); |
+ |
+ if (doAA) { |
SkAutoTUnref<GrDrawBatch> batch; |
if (width >= 0) { |
batch.reset(GrRectBatchFactory::CreateStrokeAA(color, viewMatrix, rect, devBoundRect, |