export SkDraw::ComputeRectType() and share that with SkGpuDevice
git-svn-id: http://skia.googlecode.com/svn/trunk@1055 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 0256f3b..4cc068d 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -685,7 +685,7 @@
paint.getStrokeMiter() < SK_ScalarSqrt2) {
return false;
}
-
+
SkASSERT(matrix.rectStaysRect());
SkPoint pt = { paint.getStrokeWidth(), paint.getStrokeWidth() };
matrix.mapVectors(strokeSize, &pt, 1);
@@ -694,12 +694,33 @@
return true;
}
-enum RectType {
- kHair_RectType,
- kFill_RectType,
- kStroke_RectType,
- kPath_RectType
-};
+SkDraw::RectType SkDraw::ComputeRectType(const SkPaint& paint,
+ const SkMatrix& matrix,
+ SkPoint* strokeSize) {
+ RectType rtype;
+ const SkScalar width = paint.getStrokeWidth();
+ const bool zeroWidth = (0 == width);
+ SkPaint::Style style = paint.getStyle();
+
+ if ((SkPaint::kStrokeAndFill_Style == style) && zeroWidth) {
+ style = SkPaint::kFill_Style;
+ }
+
+ if (paint.getPathEffect() || paint.getMaskFilter() ||
+ paint.getRasterizer() || !matrix.rectStaysRect() ||
+ SkPaint::kStrokeAndFill_Style == style) {
+ rtype = kPath_RectType;
+ } else if (SkPaint::kFill_Style == style) {
+ rtype = kFill_RectType;
+ } else if (zeroWidth) {
+ rtype = kHair_RectType;
+ } else if (easy_rect_join(paint, matrix, strokeSize)) {
+ rtype = kStroke_RectType;
+ } else {
+ rtype = kPath_RectType;
+ }
+ return rtype;
+}
void SkDraw::drawRect(const SkRect& rect, const SkPaint& paint) const {
SkDEBUGCODE(this->validate();)
@@ -710,35 +731,15 @@
return;
}
- RectType rtype;
- const SkScalar width = paint.getStrokeWidth();
- bool zeroWidth = (0 == width);
- SkPaint::Style style = paint.getStyle();
SkPoint strokeSize;
+ RectType rtype = ComputeRectType(paint, *fMatrix, &strokeSize);
- if ((SkPaint::kStrokeAndFill_Style == style) && zeroWidth) {
- style = SkPaint::kFill_Style;
- }
-
- if (paint.getPathEffect() || paint.getMaskFilter() ||
- paint.getRasterizer() || !fMatrix->rectStaysRect() ||
- SkPaint::kStrokeAndFill_Style == style) {
- rtype = kPath_RectType;
- } else if (SkPaint::kFill_Style == paint.getStyle()) {
- rtype = kFill_RectType;
- } else if (zeroWidth) {
- rtype = kHair_RectType;
- } else if (easy_rect_join(paint, *fMatrix, &strokeSize)) {
#ifdef SK_DISABLE_FAST_AA_STROKE_RECT
- if (paint.isAntiAlias()) {
- rtype = kPath_RectType;
- } else
-#endif
- rtype = kStroke_RectType;
- } else {
+ if (kStroke_RectType == rtype && paint.isAntiAlias()) {
rtype = kPath_RectType;
}
-
+#endif
+
if (kPath_RectType == rtype) {
SkPath tmp;
tmp.addRect(rect);
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index d102f3f..ce48be6 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -647,33 +647,27 @@
const SkPaint& paint) {
CHECK_SHOULD_DRAW(draw);
- bool doStroke = paint.getStyle() == SkPaint::kStroke_Style;
- SkScalar width = paint.getStrokeWidth();
+ const SkMatrix& matrix = *draw.fMatrix;
+ SkPoint strokeSize;
+ SkDraw::RectType type = SkDraw::ComputeRectType(paint, matrix, &strokeSize);
- /*
- We have special code for hairline strokes, miter-strokes, and fills.
- Anything else we just call our path code.
- */
- bool usePath = doStroke && width > 0 &&
- paint.getStrokeJoin() != SkPaint::kMiter_Join;
- // another reason we might need to call drawPath...
- if (paint.getMaskFilter()) {
- usePath = true;
- }
-
- if (usePath) {
+ if (SkDraw::kPath_RectType == type) {
SkPath path;
path.addRect(rect);
this->drawPath(draw, path, paint, NULL, true);
- return;
- }
+ } else {
+ GrPaint grPaint;
+ SkAutoCachedTexture act;
+ if (!this->skPaint2GrPaintShader(paint, &act, matrix, &grPaint)) {
+ return;
+ }
- GrPaint grPaint;
- SkAutoCachedTexture act;
- if (!this->skPaint2GrPaintShader(paint, &act, *draw.fMatrix, &grPaint)) {
- return;
+ SkScalar width = paint.getStrokeWidth();
+ if (SkDraw::kFill_RectType == type) {
+ width = -1;
+ }
+ fContext->drawRect(grPaint, Sk2Gr(rect), width);
}
- fContext->drawRect(grPaint, Sk2Gr(rect), doStroke ? width : -1);
}
#include "SkMaskFilter.h"