| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 #include "SkPathOpsTypes.h" | 7 #include "SkPathOpsPoint.h" |
| 8 #include "SkPathWriter.h" | 8 #include "SkPathWriter.h" |
| 9 | 9 |
| 10 // wrap path to keep track of whether the contour is initialized and non-empty | 10 // wrap path to keep track of whether the contour is initialized and non-empty |
| 11 SkPathWriter::SkPathWriter(SkPath& path) | 11 SkPathWriter::SkPathWriter(SkPath& path) |
| 12 : fPathPtr(&path) | 12 : fPathPtr(&path) |
| 13 , fCloses(0) | 13 , fCloses(0) |
| 14 , fMoves(0) | 14 , fMoves(0) |
| 15 { | 15 { |
| 16 init(); | 16 init(); |
| 17 } | 17 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 30 SkDebugf("path.close();\n"); | 30 SkDebugf("path.close();\n"); |
| 31 #endif | 31 #endif |
| 32 fPathPtr->close(); | 32 fPathPtr->close(); |
| 33 fCloses++; | 33 fCloses++; |
| 34 } | 34 } |
| 35 init(); | 35 init(); |
| 36 } | 36 } |
| 37 | 37 |
| 38 void SkPathWriter::cubicTo(const SkPoint& pt1, const SkPoint& pt2, const SkPoint
& pt3) { | 38 void SkPathWriter::cubicTo(const SkPoint& pt1, const SkPoint& pt2, const SkPoint
& pt3) { |
| 39 lineTo(); | 39 lineTo(); |
| 40 if (fEmpty && AlmostEqualUlps(fDefer[0], pt1) && AlmostEqualUlps(pt1, pt2) |
| 41 && AlmostEqualUlps(pt2, pt3)) { |
| 42 deferredLine(pt3); |
| 43 return; |
| 44 } |
| 40 moveTo(); | 45 moveTo(); |
| 41 fDefer[1] = pt3; | 46 fDefer[1] = pt3; |
| 42 nudge(); | 47 nudge(); |
| 43 fDefer[0] = fDefer[1]; | 48 fDefer[0] = fDefer[1]; |
| 44 #if DEBUG_PATH_CONSTRUCTION | 49 #if DEBUG_PATH_CONSTRUCTION |
| 45 SkDebugf("path.cubicTo(%1.9g,%1.9g, %1.9g,%1.9g, %1.9g,%1.9g);\n", | 50 SkDebugf("path.cubicTo(%1.9g,%1.9g, %1.9g,%1.9g, %1.9g,%1.9g);\n", |
| 46 pt1.fX, pt1.fY, pt2.fX, pt2.fY, fDefer[1].fX, fDefer[1].fY); | 51 pt1.fX, pt1.fY, pt2.fX, pt2.fY, fDefer[1].fX, fDefer[1].fY); |
| 47 #endif | 52 #endif |
| 48 fPathPtr->cubicTo(pt1.fX, pt1.fY, pt2.fX, pt2.fY, fDefer[1].fX, fDefer[1].fY
); | 53 fPathPtr->cubicTo(pt1.fX, pt1.fY, pt2.fX, pt2.fY, fDefer[1].fX, fDefer[1].fY
); |
| 49 fEmpty = false; | 54 fEmpty = false; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 void SkPathWriter::nudge() { | 114 void SkPathWriter::nudge() { |
| 110 if (fEmpty || !AlmostEqualUlps(fDefer[1].fX, fFirstPt.fX) | 115 if (fEmpty || !AlmostEqualUlps(fDefer[1].fX, fFirstPt.fX) |
| 111 || !AlmostEqualUlps(fDefer[1].fY, fFirstPt.fY)) { | 116 || !AlmostEqualUlps(fDefer[1].fY, fFirstPt.fY)) { |
| 112 return; | 117 return; |
| 113 } | 118 } |
| 114 fDefer[1] = fFirstPt; | 119 fDefer[1] = fFirstPt; |
| 115 } | 120 } |
| 116 | 121 |
| 117 void SkPathWriter::quadTo(const SkPoint& pt1, const SkPoint& pt2) { | 122 void SkPathWriter::quadTo(const SkPoint& pt1, const SkPoint& pt2) { |
| 118 lineTo(); | 123 lineTo(); |
| 124 if (fEmpty && AlmostEqualUlps(fDefer[0], pt1) && AlmostEqualUlps(pt1, pt2))
{ |
| 125 deferredLine(pt2); |
| 126 return; |
| 127 } |
| 119 moveTo(); | 128 moveTo(); |
| 120 fDefer[1] = pt2; | 129 fDefer[1] = pt2; |
| 121 nudge(); | 130 nudge(); |
| 122 fDefer[0] = fDefer[1]; | 131 fDefer[0] = fDefer[1]; |
| 123 #if DEBUG_PATH_CONSTRUCTION | 132 #if DEBUG_PATH_CONSTRUCTION |
| 124 SkDebugf("path.quadTo(%1.9g,%1.9g, %1.9g,%1.9g);\n", | 133 SkDebugf("path.quadTo(%1.9g,%1.9g, %1.9g,%1.9g);\n", |
| 125 pt1.fX, pt1.fY, fDefer[1].fX, fDefer[1].fY); | 134 pt1.fX, pt1.fY, fDefer[1].fX, fDefer[1].fY); |
| 126 #endif | 135 #endif |
| 127 fPathPtr->quadTo(pt1.fX, pt1.fY, fDefer[1].fX, fDefer[1].fY); | 136 fPathPtr->quadTo(pt1.fX, pt1.fY, fDefer[1].fX, fDefer[1].fY); |
| 128 fEmpty = false; | 137 fEmpty = false; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 148 return; | 157 return; |
| 149 } | 158 } |
| 150 fFirstPt = fDefer[0]; | 159 fFirstPt = fDefer[0]; |
| 151 #if DEBUG_PATH_CONSTRUCTION | 160 #if DEBUG_PATH_CONSTRUCTION |
| 152 SkDebugf("path.moveTo(%1.9g,%1.9g);\n", fDefer[0].fX, fDefer[0].fY); | 161 SkDebugf("path.moveTo(%1.9g,%1.9g);\n", fDefer[0].fX, fDefer[0].fY); |
| 153 #endif | 162 #endif |
| 154 fPathPtr->moveTo(fDefer[0].fX, fDefer[0].fY); | 163 fPathPtr->moveTo(fDefer[0].fX, fDefer[0].fY); |
| 155 fMoved = false; | 164 fMoved = false; |
| 156 fMoves++; | 165 fMoves++; |
| 157 } | 166 } |
| OLD | NEW |