Switch over to SkPathBuilder
Bug: skia:9000 Change-Id: If7192dfb8df01db9acb83a3c331fbbde981e5e2e Reviewed-on: https://skia-review.googlesource.com/c/skia/+/307017 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
parent
bfbe71252a
commit
d5b51a0b97
@ -7,7 +7,7 @@
|
||||
|
||||
#include "include/core/SkCanvas.h"
|
||||
#include "include/core/SkPaint.h"
|
||||
#include "include/core/SkPath.h"
|
||||
#include "include/core/SkPathBuilder.h"
|
||||
#include "include/utils/SkRandom.h"
|
||||
#include "samplecode/Sample.h"
|
||||
|
||||
@ -30,9 +30,7 @@ static void gen_paths(const SkTDArray<SkScalar>& topData,
|
||||
SkScalar yBase,
|
||||
SkScalar xLeft, SkScalar xDelta,
|
||||
int leftShift,
|
||||
SkPath* plot, SkPath* fill) {
|
||||
plot->rewind();
|
||||
fill->rewind();
|
||||
SkPathBuilder* plot, SkPathBuilder* fill) {
|
||||
plot->incReserve(topData.count());
|
||||
if (nullptr == bottomData) {
|
||||
fill->incReserve(topData.count() + 2);
|
||||
@ -121,9 +119,6 @@ class ChartView : public Sample {
|
||||
}
|
||||
}
|
||||
|
||||
SkPath plotPath;
|
||||
SkPath fillPath;
|
||||
|
||||
static const SkScalar kStrokeWidth = SkIntToScalar(2);
|
||||
SkPaint plotPaint;
|
||||
SkPaint fillPaint;
|
||||
@ -135,7 +130,9 @@ class ChartView : public Sample {
|
||||
fillPaint.setAntiAlias(true);
|
||||
fillPaint.setStyle(SkPaint::kFill_Style);
|
||||
|
||||
SkPathBuilder plotPath, fillPath;
|
||||
SkTDArray<SkScalar>* prevData = nullptr;
|
||||
|
||||
for (int i = 0; i < kNumGraphs; ++i) {
|
||||
gen_paths(fData[i],
|
||||
prevData,
|
||||
@ -148,10 +145,10 @@ class ChartView : public Sample {
|
||||
|
||||
// Make the fills partially transparent
|
||||
fillPaint.setColor((gColors[i] & 0x00ffffff) | 0x80000000);
|
||||
canvas->drawPath(fillPath, fillPaint);
|
||||
canvas->drawPath(fillPath.detach(), fillPaint);
|
||||
|
||||
plotPaint.setColor(gColors[i]);
|
||||
canvas->drawPath(plotPath, plotPaint);
|
||||
canvas->drawPath(plotPath.detach(), plotPaint);
|
||||
|
||||
prevData = fData + i;
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include "include/core/SkColorPriv.h"
|
||||
#include "include/core/SkFont.h"
|
||||
#include "include/core/SkPaint.h"
|
||||
#include "include/core/SkPath.h"
|
||||
#include "include/core/SkPathBuilder.h"
|
||||
#include "include/utils/SkRandom.h"
|
||||
#include "samplecode/Sample.h"
|
||||
#include "src/core/SkClipOpPriv.h"
|
||||
@ -39,7 +39,6 @@ static void show_fill(SkCanvas* canvas, bool doAA) {
|
||||
|
||||
for (int i = 0; i < 50; ++i) {
|
||||
SkRect r;
|
||||
SkPath p;
|
||||
|
||||
r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
|
||||
rand.nextUScalar1() * W, rand.nextUScalar1() * H);
|
||||
@ -49,8 +48,7 @@ static void show_fill(SkCanvas* canvas, bool doAA) {
|
||||
r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
|
||||
rand.nextUScalar1() * W, rand.nextUScalar1() * H);
|
||||
paint.setColor(rand.nextU());
|
||||
p.addOval(r);
|
||||
canvas->drawPath(p, paint);
|
||||
canvas->drawOval(r, paint);
|
||||
}
|
||||
}
|
||||
|
||||
@ -68,7 +66,6 @@ static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n
|
||||
|
||||
for (int i = 0; i < n; ++i) {
|
||||
SkRect r;
|
||||
SkPath p;
|
||||
|
||||
r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
|
||||
rand.nextUScalar1() * W, rand.nextUScalar1() * H);
|
||||
@ -78,8 +75,7 @@ static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n
|
||||
r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
|
||||
rand.nextUScalar1() * W, rand.nextUScalar1() * H);
|
||||
paint.setColor(rand.nextU());
|
||||
p.addOval(r);
|
||||
canvas->drawPath(p, paint);
|
||||
canvas->drawOval(r, paint);
|
||||
|
||||
const SkScalar minx = -SkIntToScalar(W)/4;
|
||||
const SkScalar maxx = 5*SkIntToScalar(W)/4;
|
||||
@ -114,9 +110,8 @@ class ClipView : public Sample {
|
||||
};
|
||||
|
||||
SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
|
||||
SkPath clipPath;
|
||||
r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
|
||||
clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20));
|
||||
SkPath clipPath = SkPathBuilder().addRRect(SkRRect::MakeRectXY(r, 20, 20)).detach();
|
||||
|
||||
// clipPath.toggleInverseFillType();
|
||||
|
||||
@ -213,7 +208,7 @@ struct SkHalfPlane {
|
||||
|
||||
#include "src/core/SkEdgeClipper.h"
|
||||
|
||||
static void clip(const SkPath& path, SkPoint p0, SkPoint p1, SkPath* clippedPath) {
|
||||
static SkPath clip(const SkPath& path, SkPoint p0, SkPoint p1) {
|
||||
SkMatrix mx, inv;
|
||||
SkVector v = p1 - p0;
|
||||
mx.setAll(v.fX, -v.fY, p0.fX,
|
||||
@ -228,9 +223,9 @@ static void clip(const SkPath& path, SkPoint p0, SkPoint p1, SkPath* clippedPath
|
||||
SkRect clip = {-big, 0, big, big };
|
||||
|
||||
struct Rec {
|
||||
SkPath* fResult;
|
||||
SkPoint fPrev;
|
||||
} rec = { clippedPath, {0, 0} };
|
||||
SkPathBuilder fResult;
|
||||
SkPoint fPrev = {0, 0};
|
||||
} rec;
|
||||
|
||||
SkEdgeClipper::ClipPath(rotated, clip, false,
|
||||
[](SkEdgeClipper* clipper, bool newCtr, void* ctx) {
|
||||
@ -241,26 +236,26 @@ static void clip(const SkPath& path, SkPoint p0, SkPoint p1, SkPath* clippedPath
|
||||
SkPath::Verb verb;
|
||||
while ((verb = clipper->next(pts)) != SkPath::kDone_Verb) {
|
||||
if (newCtr) {
|
||||
rec->fResult->moveTo(pts[0]);
|
||||
rec->fResult.moveTo(pts[0]);
|
||||
rec->fPrev = pts[0];
|
||||
newCtr = false;
|
||||
}
|
||||
|
||||
if (addLineTo || pts[0] != rec->fPrev) {
|
||||
rec->fResult->lineTo(pts[0]);
|
||||
rec->fResult.lineTo(pts[0]);
|
||||
}
|
||||
|
||||
switch (verb) {
|
||||
case SkPath::kLine_Verb:
|
||||
rec->fResult->lineTo(pts[1]);
|
||||
rec->fResult.lineTo(pts[1]);
|
||||
rec->fPrev = pts[1];
|
||||
break;
|
||||
case SkPath::kQuad_Verb:
|
||||
rec->fResult->quadTo(pts[1], pts[2]);
|
||||
rec->fResult.quadTo(pts[1], pts[2]);
|
||||
rec->fPrev = pts[2];
|
||||
break;
|
||||
case SkPath::kCubic_Verb:
|
||||
rec->fResult->cubicTo(pts[1], pts[2], pts[3]);
|
||||
rec->fResult.cubicTo(pts[1], pts[2], pts[3]);
|
||||
rec->fPrev = pts[3];
|
||||
break;
|
||||
default: break;
|
||||
@ -269,7 +264,7 @@ static void clip(const SkPath& path, SkPoint p0, SkPoint p1, SkPath* clippedPath
|
||||
}
|
||||
}, &rec);
|
||||
|
||||
rec.fResult->transform(mx);
|
||||
return rec.fResult.detach().makeTransform(mx);
|
||||
}
|
||||
|
||||
static void draw_halfplane(SkCanvas* canvas, SkPoint p0, SkPoint p1, SkColor c) {
|
||||
@ -290,7 +285,7 @@ static SkPath make_path() {
|
||||
return SkPoint{x * 400, y * 400};
|
||||
};
|
||||
|
||||
SkPath path;
|
||||
SkPathBuilder path;
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
SkPoint pts[6];
|
||||
for (auto& p : pts) {
|
||||
@ -298,7 +293,7 @@ static SkPath make_path() {
|
||||
}
|
||||
path.moveTo(pts[0]).quadTo(pts[1], pts[2]).quadTo(pts[3], pts[4]).lineTo(pts[5]);
|
||||
}
|
||||
return path;
|
||||
return path.detach();
|
||||
}
|
||||
|
||||
class HalfPlaneView : public Sample {
|
||||
@ -321,9 +316,7 @@ class HalfPlaneView : public Sample {
|
||||
|
||||
paint.setColor({0, 0, 0, 1}, nullptr);
|
||||
|
||||
SkPath clippedPath;
|
||||
clip(fPath, fPts[0], fPts[1], &clippedPath);
|
||||
canvas->drawPath(clippedPath, paint);
|
||||
canvas->drawPath(clip(fPath, fPts[0], fPts[1]), paint);
|
||||
|
||||
draw_halfplane(canvas, fPts[0], fPts[1], SK_ColorRED);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user