| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 | 9 |
| 10 #include "SkBuffer.h" | 10 #include "SkBuffer.h" |
| (...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1436 this->incReserve(count); | 1436 this->incReserve(count); |
| 1437 // [xx,yy] == pts[0] | 1437 // [xx,yy] == pts[0] |
| 1438 this->lineTo(xx, yy); | 1438 this->lineTo(xx, yy); |
| 1439 for (int i = 1; i < count; i += 2) { | 1439 for (int i = 1; i < count; i += 2) { |
| 1440 this->quadTo(pts[i], pts[i+1]); | 1440 this->quadTo(pts[i], pts[i+1]); |
| 1441 } | 1441 } |
| 1442 } | 1442 } |
| 1443 | 1443 |
| 1444 /////////////////////////////////////////////////////////////////////////////// | 1444 /////////////////////////////////////////////////////////////////////////////// |
| 1445 | 1445 |
| 1446 void SkPath::addPath(const SkPath& path, SkScalar dx, SkScalar dy) { | 1446 void SkPath::addPath(const SkPath& path, SkScalar dx, SkScalar dy, AddPathMode m
ode) { |
| 1447 SkMatrix matrix; | 1447 SkMatrix matrix; |
| 1448 | 1448 |
| 1449 matrix.setTranslate(dx, dy); | 1449 matrix.setTranslate(dx, dy); |
| 1450 this->addPath(path, matrix); | 1450 this->addPath(path, matrix, mode); |
| 1451 } | 1451 } |
| 1452 | 1452 |
| 1453 void SkPath::addPath(const SkPath& path, const SkMatrix& matrix) { | 1453 void SkPath::addPath(const SkPath& path, const SkMatrix& matrix, AddPathMode mod
e) { |
| 1454 SkPathRef::Editor(&fPathRef, path.countVerbs(), path.countPoints()); | 1454 SkPathRef::Editor(&fPathRef, path.countVerbs(), path.countPoints()); |
| 1455 | 1455 |
| 1456 RawIter iter(path); | 1456 RawIter iter(path); |
| 1457 SkPoint pts[4]; | 1457 SkPoint pts[4]; |
| 1458 Verb verb; | 1458 Verb verb; |
| 1459 | 1459 |
| 1460 SkMatrix::MapPtsProc proc = matrix.getMapPtsProc(); | 1460 SkMatrix::MapPtsProc proc = matrix.getMapPtsProc(); |
| 1461 | 1461 bool firstVerb = true; |
| 1462 while ((verb = iter.next(pts)) != kDone_Verb) { | 1462 while ((verb = iter.next(pts)) != kDone_Verb) { |
| 1463 switch (verb) { | 1463 switch (verb) { |
| 1464 case kMove_Verb: | 1464 case kMove_Verb: |
| 1465 proc(matrix, &pts[0], &pts[0], 1); | 1465 proc(matrix, &pts[0], &pts[0], 1); |
| 1466 this->moveTo(pts[0]); | 1466 if (firstVerb && mode == kExtend_AddPathMode && !isEmpty()) { |
| 1467 injectMoveToIfNeeded(); // In case last contour is closed |
| 1468 this->lineTo(pts[0]); |
| 1469 } else { |
| 1470 this->moveTo(pts[0]); |
| 1471 } |
| 1467 break; | 1472 break; |
| 1468 case kLine_Verb: | 1473 case kLine_Verb: |
| 1469 proc(matrix, &pts[1], &pts[1], 1); | 1474 proc(matrix, &pts[1], &pts[1], 1); |
| 1470 this->lineTo(pts[1]); | 1475 this->lineTo(pts[1]); |
| 1471 break; | 1476 break; |
| 1472 case kQuad_Verb: | 1477 case kQuad_Verb: |
| 1473 proc(matrix, &pts[1], &pts[1], 2); | 1478 proc(matrix, &pts[1], &pts[1], 2); |
| 1474 this->quadTo(pts[1], pts[2]); | 1479 this->quadTo(pts[1], pts[2]); |
| 1475 break; | 1480 break; |
| 1476 case kConic_Verb: | 1481 case kConic_Verb: |
| 1477 proc(matrix, &pts[1], &pts[1], 2); | 1482 proc(matrix, &pts[1], &pts[1], 2); |
| 1478 this->conicTo(pts[1], pts[2], iter.conicWeight()); | 1483 this->conicTo(pts[1], pts[2], iter.conicWeight()); |
| 1479 break; | 1484 break; |
| 1480 case kCubic_Verb: | 1485 case kCubic_Verb: |
| 1481 proc(matrix, &pts[1], &pts[1], 3); | 1486 proc(matrix, &pts[1], &pts[1], 3); |
| 1482 this->cubicTo(pts[1], pts[2], pts[3]); | 1487 this->cubicTo(pts[1], pts[2], pts[3]); |
| 1483 break; | 1488 break; |
| 1484 case kClose_Verb: | 1489 case kClose_Verb: |
| 1485 this->close(); | 1490 this->close(); |
| 1486 break; | 1491 break; |
| 1487 default: | 1492 default: |
| 1488 SkDEBUGFAIL("unknown verb"); | 1493 SkDEBUGFAIL("unknown verb"); |
| 1489 } | 1494 } |
| 1495 firstVerb = false; |
| 1490 } | 1496 } |
| 1491 } | 1497 } |
| 1492 | 1498 |
| 1493 /////////////////////////////////////////////////////////////////////////////// | 1499 /////////////////////////////////////////////////////////////////////////////// |
| 1494 | 1500 |
| 1495 static int pts_in_verb(unsigned verb) { | 1501 static int pts_in_verb(unsigned verb) { |
| 1496 static const uint8_t gPtsInVerb[] = { | 1502 static const uint8_t gPtsInVerb[] = { |
| 1497 1, // kMove | 1503 1, // kMove |
| 1498 1, // kLine | 1504 1, // kLine |
| 1499 2, // kQuad | 1505 2, // kQuad |
| (...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2881 switch (this->getFillType()) { | 2887 switch (this->getFillType()) { |
| 2882 case SkPath::kEvenOdd_FillType: | 2888 case SkPath::kEvenOdd_FillType: |
| 2883 case SkPath::kInverseEvenOdd_FillType: | 2889 case SkPath::kInverseEvenOdd_FillType: |
| 2884 w &= 1; | 2890 w &= 1; |
| 2885 break; | 2891 break; |
| 2886 default: | 2892 default: |
| 2887 break; | 2893 break; |
| 2888 } | 2894 } |
| 2889 return SkToBool(w); | 2895 return SkToBool(w); |
| 2890 } | 2896 } |
| OLD | NEW |