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

Unified Diff: src/core/SkDraw.cpp

Issue 801353008: Use device-space stroke width for SkDraw::drawRect() quick-reject (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: Created 5 years, 11 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 | « gyp/tests.gypi ('k') | tests/RectTest.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkDraw.cpp
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 60075322b677463afa00a50014789c7ab73859e9..f69137f6b8bb003e1538a5e4c2db45e7c2a3305c 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -735,6 +735,16 @@ void SkDraw::drawPoints(SkCanvas::PointMode mode, size_t count,
}
}
+static inline SkPoint compute_stroke_size(const SkPaint& paint, const SkMatrix& matrix) {
+ SkASSERT(matrix.rectStaysRect());
+ SkASSERT(SkPaint::kFill_Style != paint.getStyle());
+
+ SkVector size;
+ SkPoint pt = { paint.getStrokeWidth(), paint.getStrokeWidth() };
+ matrix.mapVectors(&size, &pt, 1);
+ return SkPoint::Make(SkScalarAbs(size.fX), SkScalarAbs(size.fY));
+}
+
static bool easy_rect_join(const SkPaint& paint, const SkMatrix& matrix,
SkPoint* strokeSize) {
if (SkPaint::kMiter_Join != paint.getStrokeJoin() ||
@@ -742,11 +752,7 @@ static bool easy_rect_join(const SkPaint& paint, const SkMatrix& matrix,
return false;
}
- SkASSERT(matrix.rectStaysRect());
- SkPoint pt = { paint.getStrokeWidth(), paint.getStrokeWidth() };
- matrix.mapVectors(strokeSize, &pt, 1);
- strokeSize->fX = SkScalarAbs(strokeSize->fX);
- strokeSize->fY = SkScalarAbs(strokeSize->fY);
+ *strokeSize = compute_stroke_size(paint, matrix);
return true;
}
@@ -822,26 +828,27 @@ void SkDraw::drawRect(const SkRect& prePaintRect, const SkPaint& paint,
}
SkRect devRect;
- if (paintMatrix) {
- // skip the paintMatrix when transforming the rect by the CTM
- fMatrix->mapPoints(rect_points(devRect), rect_points(*postPaintRect), 2);
- } else {
- fMatrix->mapPoints(rect_points(devRect), rect_points(prePaintRect), 2);
- }
- // transform rect into devRect
+ const SkRect& paintRect = paintMatrix ? *postPaintRect : prePaintRect;
+ // skip the paintMatrix when transforming the rect by the CTM
+ fMatrix->mapPoints(rect_points(devRect), rect_points(paintRect), 2);
devRect.sort();
// look for the quick exit, before we build a blitter
- SkIRect ir = devRect.roundOut();
+ SkRect bbox = devRect;
if (paint.getStyle() != SkPaint::kFill_Style) {
// extra space for hairlines
if (paint.getStrokeWidth() == 0) {
- ir.outset(1, 1);
+ bbox.outset(1, 1);
} else {
- SkScalar radius = SkScalarHalf(paint.getStrokeWidth());
- ir.outset(radius, radius);
+ // For kStroke_RectType, strokeSize is already computed.
+ const SkPoint& ssize = (kStroke_RectType == rtype)
+ ? strokeSize
+ : compute_stroke_size(paint, *fMatrix);
+ bbox.outset(SkScalarHalf(ssize.x()), SkScalarHalf(ssize.y()));
}
}
+
+ SkIRect ir = bbox.roundOut();
if (fRC->quickReject(ir)) {
return;
}
« no previous file with comments | « gyp/tests.gypi ('k') | tests/RectTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698