aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Cary Clark <caryclark@google.com>2017-12-20 16:52:53 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-20 16:53:05 +0000
commit16a127fa6000e2715e2d2ad4d0c9110c7fbd4cac (patch)
tree2e80b97ff3b7aaf7f8d62e00315c326052dda530
parentd5f447367cd5e775ca8ce6cc49a8414e17b223f2 (diff)
Revert "long rect dash with guards"
This reverts commit 4ad0c592ce830f17ff07052f20392caa700e9a53. Reason for revert: test fails in tiled case Original change's description: > long rect dash with guards > > check dash fix back in with > guards against changing > chrome layout test results > > original CL: skia-review.googlesource.com/c/skia/+/84862 > > efficiently dash very large rectangles and very long lines > Speed up dashing when lines and rects are absurdly large. > > Prior to this CL, only horizontal lines were detected. > > Also folded in a change to handle dashing of zero length lines. > > TBR=egdaniel@google.com > Bug: skia:7311 > Change-Id: I139b10f676e7ae06ad83aaf2a35d49cf06280a67 > Reviewed-on: https://skia-review.googlesource.com/87760 > Commit-Queue: Cary Clark <caryclark@skia.org> > Reviewed-by: Cary Clark <caryclark@skia.org> TBR=egdaniel@google.com,caryclark@skia.org Change-Id: Ifd35ddf395826a55c72e650470527d01740b6438 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia:7311 Reviewed-on: https://skia-review.googlesource.com/87841 Reviewed-by: Cary Clark <caryclark@google.com> Commit-Queue: Cary Clark <caryclark@google.com>
-rw-r--r--gm/strokes.cpp31
-rw-r--r--src/utils/SkDashPath.cpp131
2 files changed, 0 insertions, 162 deletions
diff --git a/gm/strokes.cpp b/gm/strokes.cpp
index df632dc269..ed13d090ff 100644
--- a/gm/strokes.cpp
+++ b/gm/strokes.cpp
@@ -533,34 +533,3 @@ DEF_SIMPLE_GM(zerolinedash, canvas, 256, 256) {
canvas->drawLine(100, 100, 100, 100, paint);
}
-
-#define PDF_IS_FIXED_SO_THIS_DOESNT_BREAK_IT
-#ifdef PDF_IS_FIXED_SO_THIS_DOESNT_BREAK_IT
-DEF_SIMPLE_GM(longrect_dash, canvas, 250, 250) {
- canvas->clear(SK_ColorWHITE);
-
- SkPaint paint;
- paint.setColor(SkColorSetARGB(255, 0, 0, 0));
- paint.setStrokeWidth(5);
- paint.setStrokeCap(SkPaint::kRound_Cap);
- paint.setStrokeJoin(SkPaint::kBevel_Join);
- paint.setStyle(SkPaint::kStroke_Style);
- SkScalar dash_pattern[] = {1, 5};
- paint.setPathEffect(SkDashPathEffect::Make(dash_pattern, 2, 0));
- // try all combinations of stretching bounds
- for (auto left : { 20.f, -100001.f } ) {
- for (auto top : { 20.f, -100001.f } ) {
- for (auto right : { 40.f, 100001.f } ) {
- for (auto bottom : { 40.f, 100001.f } ) {
- canvas->save();
- canvas->clipRect({10, 10, 50, 50});
- canvas->drawRect({left, top, right, bottom}, paint);
- canvas->restore();
- canvas->translate(60, 0);
- }
- }
- canvas->translate(-60 * 4, 60);
- }
- }
-}
-#endif
diff --git a/src/utils/SkDashPath.cpp b/src/utils/SkDashPath.cpp
index 34953c9465..cbfc8f2168 100644
--- a/src/utils/SkDashPath.cpp
+++ b/src/utils/SkDashPath.cpp
@@ -83,95 +83,11 @@ static void outset_for_stroke(SkRect* rect, const SkStrokeRec& rec) {
rect->outset(radius, radius);
}
-#ifndef SK_SUPPORT_LEGACY_DASH_CULL_PATH
-// If line is zero-length, bump out the end by a tiny amount
-// to draw endcaps. The bump factor is sized so that
-// SkPoint::Distance() computes a non-zero length.
-// Offsets SK_ScalarNearlyZero or smaller create empty paths when Iter measures length.
-// Large values are scaled by SK_ScalarNearlyZero so significant bits change.
-static void adjust_zero_length_line(SkPoint pts[2]) {
- SkASSERT(pts[0] == pts[1]);
- pts[1].fX += SkTMax(1.001f, pts[1].fX) * SK_ScalarNearlyZero;
-}
-
-static bool clip_line(SkPoint pts[2], const SkRect& bounds, SkScalar intervalLength,
- SkScalar priorPhase) {
- SkVector dxy = pts[1] - pts[0];
-
- // only horizontal or vertical lines
- if (dxy.fX && dxy.fY) {
- return false;
- }
- int xyOffset = SkToBool(dxy.fY); // 0 to adjust horizontal, 1 to adjust vertical
-
- SkScalar minXY = (&pts[0].fX)[xyOffset];
- SkScalar maxXY = (&pts[1].fX)[xyOffset];
- bool swapped = maxXY < minXY;
- if (swapped) {
- SkTSwap(minXY, maxXY);
- }
-
- SkASSERT(minXY <= maxXY);
- SkScalar leftTop = (&bounds.fLeft)[xyOffset];
- SkScalar rightBottom = (&bounds.fRight)[xyOffset];
- if (maxXY < leftTop || minXY > rightBottom) {
- return false;
- }
-
- // Now we actually perform the chop, removing the excess to the left/top and
- // right/bottom of the bounds (keeping our new line "in phase" with the dash,
- // hence the (mod intervalLength).
-
- if (minXY < leftTop) {
- minXY = leftTop - SkScalarMod(leftTop - minXY, intervalLength);
- if (!swapped) {
- minXY -= priorPhase; // for rectangles, adjust by prior phase
- }
- }
- if (maxXY > rightBottom) {
- maxXY = rightBottom + SkScalarMod(maxXY - rightBottom, intervalLength);
- if (swapped) {
- maxXY += priorPhase; // for rectangles, adjust by prior phase
- }
- }
-
- SkASSERT(maxXY >= minXY);
- if (swapped) {
- SkTSwap(minXY, maxXY);
- }
- (&pts[0].fX)[xyOffset] = minXY;
- (&pts[1].fX)[xyOffset] = maxXY;
-
- if (minXY == maxXY) {
- adjust_zero_length_line(pts);
- }
- return true;
-}
-
-static bool contains_inclusive(const SkRect& rect, const SkPoint& pt) {
- return rect.fLeft <= pt.fX && pt.fX <= rect.fRight &&
- rect.fTop <= pt.fY && pt.fY <= rect.fBottom;
-}
-
-// Returns true is b is between a and c, that is: a <= b <= c, or a >= b >= c.
-// Can perform this test with one branch by observing that, relative to b,
-// the condition is true only if one side is positive and one side is negative.
-// If the numbers are very small, the optimization may return the wrong result
-// because the multiply may generate a zero where the simple compare does not.
-// For this reason the assert does not fire when all three numbers are near zero.
-static bool between(SkScalar a, SkScalar b, SkScalar c) {
- SkASSERT(((a <= b && b <= c) || (a >= b && b >= c)) == ((a - b) * (c - b) <= 0)
- || (SkScalarNearlyZero(a) && SkScalarNearlyZero(b) && SkScalarNearlyZero(c)));
- return (a - b) * (c - b) <= 0;
-}
-#endif
-
// Only handles lines for now. If returns true, dstPath is the new (smaller)
// path. If returns false, then dstPath parameter is ignored.
static bool cull_path(const SkPath& srcPath, const SkStrokeRec& rec,
const SkRect* cullRect, SkScalar intervalLength,
SkPath* dstPath) {
-#ifdef SK_SUPPORT_LEGACY_DASH_CULL_PATH
if (nullptr == cullRect) {
return false;
}
@@ -230,53 +146,6 @@ static bool cull_path(const SkPath& srcPath, const SkStrokeRec& rec,
if (minX == maxX) {
pts[1].fX += maxX * FLT_EPSILON * 32; // 16 instead of 32 does not draw; length stays zero
}
-#else // !SK_SUPPORT_LEGACY_DASH_CULL_PATH
- SkPoint pts[4];
- if (nullptr == cullRect) {
- if (srcPath.isLine(pts) && pts[0] == pts[1]) {
- adjust_zero_length_line(pts);
- } else {
- return false;
- }
- } else {
- SkRect bounds;
- bool isLine = srcPath.isLine(pts);
- bool isRect = !isLine && srcPath.isRect(nullptr);
- if (!isLine && !isRect) {
- return false;
- }
- bounds = *cullRect;
- outset_for_stroke(&bounds, rec);
- if (isRect) {
- // break rect into four lines, and call each one separately
- SkPath::Iter iter(srcPath, false);
- SkAssertResult(SkPath::kMove_Verb == iter.next(pts));
- SkScalar priorLength = 0;
- while (SkPath::kLine_Verb == iter.next(pts)) {
- SkVector v = pts[1] - pts[0];
- // if line is entirely outside clip rect, skip it
- if (v.fX ? between(cullRect->fTop, pts[0].fY, cullRect->fBottom) :
- between(cullRect->fLeft, pts[0].fX, cullRect->fRight)) {
- bool skipMoveTo = contains_inclusive(*cullRect, pts[0]);
- if (clip_line(pts, bounds, intervalLength,
- SkScalarMod(priorLength, intervalLength))) {
- if (0 == priorLength || !skipMoveTo) {
- dstPath->moveTo(pts[0]);
- }
- dstPath->lineTo(pts[1]);
- }
- }
- // keep track of all prior lengths to set phase of next line
- priorLength += SkScalarAbs(v.fX ? v.fX : v.fY);
- }
- return !dstPath->isEmpty();
- }
- SkASSERT(isLine);
- if (!clip_line(pts, bounds, intervalLength, 0)) {
- return false;
- }
- }
-#endif
dstPath->moveTo(pts[0]);
dstPath->lineTo(pts[1]);
return true;