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

Side by Side Diff: src/core/SkStroke.cpp

Issue 1418133007: fix for teeny strokes (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 2 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 unified diff | Download patch
« no previous file with comments | « gm/strokes.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2008 The Android Open Source Project 2 * Copyright 2008 The Android Open Source Project
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 7
8 #include "SkStrokerPriv.h" 8 #include "SkStrokerPriv.h"
9 #include "SkGeometry.h" 9 #include "SkGeometry.h"
10 #include "SkPathPriv.h" 10 #include "SkPathPriv.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 #else 44 #else
45 #define STROKER_RESULT(resultType, depth, quadPts, format, ...) \ 45 #define STROKER_RESULT(resultType, depth, quadPts, format, ...) \
46 resultType 46 resultType
47 #define STROKER_DEBUG_PARAMS(...) 47 #define STROKER_DEBUG_PARAMS(...)
48 #endif 48 #endif
49 49
50 static inline bool degenerate_vector(const SkVector& v) { 50 static inline bool degenerate_vector(const SkVector& v) {
51 return !SkPoint::CanNormalize(v.fX, v.fY); 51 return !SkPoint::CanNormalize(v.fX, v.fY);
52 } 52 }
53 53
54 static bool set_normal_unitnormal(const SkPoint& before, const SkPoint& after, 54 static bool set_normal_unitnormal(const SkPoint& before, const SkPoint& after, S kScalar scale,
55 SkScalar radius, 55 SkScalar radius,
56 SkVector* normal, SkVector* unitNormal) { 56 SkVector* normal, SkVector* unitNormal) {
57 if (!unitNormal->setNormalize(after.fX - before.fX, after.fY - before.fY)) { 57 if (!unitNormal->setNormalize((after.fX - before.fX) * scale,
58 (after.fY - before.fY) * scale)) {
58 return false; 59 return false;
59 } 60 }
60 unitNormal->rotateCCW(); 61 unitNormal->rotateCCW();
61 unitNormal->scale(radius, normal); 62 unitNormal->scale(radius, normal);
62 return true; 63 return true;
63 } 64 }
64 65
65 static bool set_normal_unitnormal(const SkVector& vec, 66 static bool set_normal_unitnormal(const SkVector& vec,
66 SkScalar radius, 67 SkScalar radius,
67 SkVector* normal, SkVector* unitNormal) { 68 SkVector* normal, SkVector* unitNormal) {
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 238
238 /////////////////////////////////////////////////////////////////////////////// 239 ///////////////////////////////////////////////////////////////////////////////
239 240
240 bool SkPathStroker::preJoinTo(const SkPoint& currPt, SkVector* normal, 241 bool SkPathStroker::preJoinTo(const SkPoint& currPt, SkVector* normal,
241 SkVector* unitNormal, bool currIsLine) { 242 SkVector* unitNormal, bool currIsLine) {
242 SkASSERT(fSegmentCount >= 0); 243 SkASSERT(fSegmentCount >= 0);
243 244
244 SkScalar prevX = fPrevPt.fX; 245 SkScalar prevX = fPrevPt.fX;
245 SkScalar prevY = fPrevPt.fY; 246 SkScalar prevY = fPrevPt.fY;
246 247
247 if (!set_normal_unitnormal(fPrevPt, currPt, fRadius, normal, unitNormal)) { 248 if (!set_normal_unitnormal(fPrevPt, currPt, fResScale, fRadius, normal, unit Normal)) {
248 if (SkStrokerPriv::CapFactory(SkPaint::kButt_Cap) == fCapper) { 249 if (SkStrokerPriv::CapFactory(SkPaint::kButt_Cap) == fCapper) {
249 return false; 250 return false;
250 } 251 }
251 /* Square caps and round caps draw even if the segment length is zero. 252 /* Square caps and round caps draw even if the segment length is zero.
252 Since the zero length segment has no direction, set the orientation 253 Since the zero length segment has no direction, set the orientation
253 to upright as the default orientation */ 254 to upright as the default orientation */
254 normal->set(fRadius, 0); 255 normal->set(fRadius, 0);
255 unitNormal->set(1, 0); 256 unitNormal->set(1, 0);
256 } 257 }
257 258
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 fFirstPt = fPrevPt = pt; 361 fFirstPt = fPrevPt = pt;
361 } 362 }
362 363
363 void SkPathStroker::line_to(const SkPoint& currPt, const SkVector& normal) { 364 void SkPathStroker::line_to(const SkPoint& currPt, const SkVector& normal) {
364 fOuter.lineTo(currPt.fX + normal.fX, currPt.fY + normal.fY); 365 fOuter.lineTo(currPt.fX + normal.fX, currPt.fY + normal.fY);
365 fInner.lineTo(currPt.fX - normal.fX, currPt.fY - normal.fY); 366 fInner.lineTo(currPt.fX - normal.fX, currPt.fY - normal.fY);
366 } 367 }
367 368
368 void SkPathStroker::lineTo(const SkPoint& currPt) { 369 void SkPathStroker::lineTo(const SkPoint& currPt) {
369 if (SkStrokerPriv::CapFactory(SkPaint::kButt_Cap) == fCapper 370 if (SkStrokerPriv::CapFactory(SkPaint::kButt_Cap) == fCapper
370 && SkPath::IsLineDegenerate(fPrevPt, currPt, false)) { 371 && fPrevPt.equalsWithinTolerance(currPt, SK_ScalarNearlyZero * fInvR esScale)) {
371 return; 372 return;
372 } 373 }
373 SkVector normal, unitNormal; 374 SkVector normal, unitNormal;
374 375
375 if (!this->preJoinTo(currPt, &normal, &unitNormal, true)) { 376 if (!this->preJoinTo(currPt, &normal, &unitNormal, true)) {
376 return; 377 return;
377 } 378 }
378 this->line_to(currPt, normal); 379 this->line_to(currPt, normal);
379 this->postJoinTo(currPt, normal, unitNormal); 380 this->postJoinTo(currPt, normal, unitNormal);
380 } 381 }
381 382
382 void SkPathStroker::setQuadEndNormal(const SkPoint quad[3], const SkVector& norm alAB, 383 void SkPathStroker::setQuadEndNormal(const SkPoint quad[3], const SkVector& norm alAB,
383 const SkVector& unitNormalAB, SkVector* normalBC, SkVector* unitNormalBC ) { 384 const SkVector& unitNormalAB, SkVector* normalBC, SkVector* unitNormalBC ) {
384 if (!set_normal_unitnormal(quad[1], quad[2], fRadius, normalBC, unitNormalBC )) { 385 if (!set_normal_unitnormal(quad[1], quad[2], fResScale, fRadius, normalBC, u nitNormalBC)) {
385 *normalBC = normalAB; 386 *normalBC = normalAB;
386 *unitNormalBC = unitNormalAB; 387 *unitNormalBC = unitNormalAB;
387 } 388 }
388 } 389 }
389 390
390 void SkPathStroker::setConicEndNormal(const SkConic& conic, const SkVector& norm alAB, 391 void SkPathStroker::setConicEndNormal(const SkConic& conic, const SkVector& norm alAB,
391 const SkVector& unitNormalAB, SkVector* normalBC, SkVector* unitNormalBC ) { 392 const SkVector& unitNormalAB, SkVector* normalBC, SkVector* unitNormalBC ) {
392 setQuadEndNormal(conic.fPts, normalAB, unitNormalAB, normalBC, unitNormalBC) ; 393 setQuadEndNormal(conic.fPts, normalAB, unitNormalAB, normalBC, unitNormalBC) ;
393 } 394 }
394 395
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 default: 1482 default:
1482 break; 1483 break;
1483 } 1484 }
1484 1485
1485 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) { 1486 if (fWidth < SkMinScalar(rw, rh) && !fDoFill) {
1486 r = rect; 1487 r = rect;
1487 r.inset(radius, radius); 1488 r.inset(radius, radius);
1488 dst->addRect(r, reverse_direction(dir)); 1489 dst->addRect(r, reverse_direction(dir));
1489 } 1490 }
1490 } 1491 }
OLDNEW
« no previous file with comments | « gm/strokes.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698