| Index: samplecode/SamplePathOverstroke.cpp
|
| diff --git a/samplecode/SamplePathOverstroke.cpp b/samplecode/SamplePathOverstroke.cpp
|
| index 821906565857dc9af99b3142fa839fe5a6164dcf..a2d1b89b8673815bf5949598b8c61e4382d7ecd2 100644
|
| --- a/samplecode/SamplePathOverstroke.cpp
|
| +++ b/samplecode/SamplePathOverstroke.cpp
|
| @@ -9,6 +9,7 @@
|
| #include "SkCanvas.h"
|
| #include "SkPath.h"
|
|
|
| +#include <iostream>
|
| #include <cmath>
|
|
|
| #define PI SK_ScalarPI
|
| @@ -21,11 +22,13 @@ class OverstrokeView : public SampleView {
|
| int fPathType; // super lazy enum
|
| bool fClosePath;
|
| bool fDrawFillPath;
|
| + bool fDumpHex;
|
| OverstrokeView() {
|
| fStroke = 5;
|
| fPathType = 0;
|
| fClosePath = false;
|
| fDrawFillPath = false;
|
| + fDumpHex = false;
|
| this->setBGColor(0xFFFFFFFF);
|
| }
|
|
|
| @@ -47,7 +50,7 @@ class OverstrokeView : public SampleView {
|
| this->inval(nullptr);
|
| return true;
|
| case 'x':
|
| - fPathType = (fPathType + 1) % 3;
|
| + fPathType = (fPathType + 1) % 4;
|
| this->inval(nullptr);
|
| return true;
|
| case 'c':
|
| @@ -58,6 +61,10 @@ class OverstrokeView : public SampleView {
|
| fDrawFillPath = !fDrawFillPath;
|
| this->inval(nullptr);
|
| return true;
|
| + case 'D':
|
| + fDumpHex = !fDumpHex;
|
| + this->inval(nullptr);
|
| + return true;
|
| default:
|
| break;
|
| }
|
| @@ -79,6 +86,20 @@ class OverstrokeView : public SampleView {
|
| return path;
|
| }
|
|
|
| + SkPath cubicPath(SkPoint p1, SkPoint p2) {
|
| + SkASSERT(p1.y() == p2.y());
|
| +
|
| + SkPath path;
|
| + path.moveTo(p1);
|
| +
|
| + SkPoint p3 = SkPoint::Make((p1.x() + p2.x()) / 3.0f, p1.y() * 0.7f);
|
| + SkPoint p4 = SkPoint::Make(2.0f*(p1.x() + p2.x()) / 3.0f, p1.y() * 1.5f);
|
| +
|
| + path.cubicTo(p3, p4, p2);
|
| +
|
| + return path;
|
| + }
|
| +
|
| SkPath linSemicirclePath(SkPoint p1, SkPoint p2) {
|
| SkASSERT(p1.y() == p2.y());
|
|
|
| @@ -123,11 +144,14 @@ class OverstrokeView : public SampleView {
|
| path = quadPath(p1, p2);
|
| break;
|
| case 1:
|
| - path = linSemicirclePath(p1, p2);
|
| + path = cubicPath(p1, p2);
|
| break;
|
| case 2:
|
| path = rectPath(p1);
|
| break;
|
| + case 3:
|
| + path = linSemicirclePath(p1, p2);
|
| + break;
|
| default:
|
| path = quadPath(p1, p2);
|
| break;
|
| @@ -145,17 +169,37 @@ class OverstrokeView : public SampleView {
|
|
|
| canvas->drawPath(path, p);
|
|
|
| + if (fDumpHex) {
|
| + std::cerr << "path dumpHex" << std::endl;
|
| + path.dumpHex();
|
| + }
|
| +
|
| + SkPaint hairp;
|
| + hairp.setColor(SK_ColorBLACK);
|
| + hairp.setAntiAlias(true);
|
| + hairp.setStyle(SkPaint::kStroke_Style);
|
| +
|
| if (fDrawFillPath) {
|
| SkPath fillpath;
|
| p.getFillPath(path, &fillpath);
|
|
|
| - SkPaint fillp;
|
| - fillp.setColor(SK_ColorBLACK);
|
| - fillp.setAntiAlias(true);
|
| - fillp.setStyle(SkPaint::kStroke_Style);
|
| + canvas->drawPath(fillpath, hairp);
|
|
|
| - canvas->drawPath(fillpath, fillp);
|
| + if (fDumpHex) {
|
| + std::cerr << "fillpath dumpHex" << std::endl;
|
| + fillpath.dumpHex();
|
| + }
|
| }
|
| +
|
| + if (fDumpHex) {
|
| + std::cerr << std::endl;
|
| +
|
| + fDumpHex = false;
|
| + }
|
| +
|
| + // draw original path with green hairline
|
| + hairp.setColor(SK_ColorGREEN);
|
| + canvas->drawPath(path, hairp);
|
| }
|
|
|
| private:
|
|
|