| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2006 The Android Open Source Project | 2 * Copyright 2006 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 "SkBuffer.h" | 8 #include "SkBuffer.h" |
| 9 #include "SkErrorInternals.h" | 9 #include "SkErrorInternals.h" |
| 10 #include "SkGeometry.h" | 10 #include "SkGeometry.h" |
| (...skipping 1056 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1067 if (isOval) { | 1067 if (isOval) { |
| 1068 fDirection = dir; | 1068 fDirection = dir; |
| 1069 } else { | 1069 } else { |
| 1070 fDirection = kUnknown_Direction; | 1070 fDirection = kUnknown_Direction; |
| 1071 } | 1071 } |
| 1072 | 1072 |
| 1073 SkAutoDisableDirectionCheck addc(this); | 1073 SkAutoDisableDirectionCheck addc(this); |
| 1074 | 1074 |
| 1075 SkAutoPathBoundsUpdate apbu(this, oval); | 1075 SkAutoPathBoundsUpdate apbu(this, oval); |
| 1076 | 1076 |
| 1077 #ifdef SK_SUPPORT_LEGACY_ADDOVAL | |
| 1078 SkScalar cx = oval.centerX(); | |
| 1079 SkScalar cy = oval.centerY(); | |
| 1080 SkScalar rx = SkScalarHalf(oval.width()); | |
| 1081 SkScalar ry = SkScalarHalf(oval.height()); | |
| 1082 | |
| 1083 SkScalar sx = SkScalarMul(rx, SK_ScalarTanPIOver8); | |
| 1084 SkScalar sy = SkScalarMul(ry, SK_ScalarTanPIOver8); | |
| 1085 SkScalar mx = SkScalarMul(rx, SK_ScalarRoot2Over2); | |
| 1086 SkScalar my = SkScalarMul(ry, SK_ScalarRoot2Over2); | |
| 1087 | |
| 1088 /* | |
| 1089 To handle imprecision in computing the center and radii, we revert to | |
| 1090 the provided bounds when we can (i.e. use oval.fLeft instead of cx-rx) | |
| 1091 to ensure that we don't exceed the oval's bounds *ever*, since we want | |
| 1092 to use oval for our fast-bounds, rather than have to recompute it. | |
| 1093 */ | |
| 1094 const SkScalar L = oval.fLeft; // cx - rx | |
| 1095 const SkScalar T = oval.fTop; // cy - ry | |
| 1096 const SkScalar R = oval.fRight; // cx + rx | |
| 1097 const SkScalar B = oval.fBottom; // cy + ry | |
| 1098 | |
| 1099 this->incReserve(17); // 8 quads + close | |
| 1100 this->moveTo(R, cy); | |
| 1101 if (dir == kCCW_Direction) { | |
| 1102 this->quadTo( R, cy - sy, cx + mx, cy - my); | |
| 1103 this->quadTo(cx + sx, T, cx , T); | |
| 1104 this->quadTo(cx - sx, T, cx - mx, cy - my); | |
| 1105 this->quadTo( L, cy - sy, L, cy ); | |
| 1106 this->quadTo( L, cy + sy, cx - mx, cy + my); | |
| 1107 this->quadTo(cx - sx, B, cx , B); | |
| 1108 this->quadTo(cx + sx, B, cx + mx, cy + my); | |
| 1109 this->quadTo( R, cy + sy, R, cy ); | |
| 1110 } else { | |
| 1111 this->quadTo( R, cy + sy, cx + mx, cy + my); | |
| 1112 this->quadTo(cx + sx, B, cx , B); | |
| 1113 this->quadTo(cx - sx, B, cx - mx, cy + my); | |
| 1114 this->quadTo( L, cy + sy, L, cy ); | |
| 1115 this->quadTo( L, cy - sy, cx - mx, cy - my); | |
| 1116 this->quadTo(cx - sx, T, cx , T); | |
| 1117 this->quadTo(cx + sx, T, cx + mx, cy - my); | |
| 1118 this->quadTo( R, cy - sy, R, cy ); | |
| 1119 } | |
| 1120 #else | |
| 1121 const SkScalar L = oval.fLeft; | 1077 const SkScalar L = oval.fLeft; |
| 1122 const SkScalar T = oval.fTop; | 1078 const SkScalar T = oval.fTop; |
| 1123 const SkScalar R = oval.fRight; | 1079 const SkScalar R = oval.fRight; |
| 1124 const SkScalar B = oval.fBottom; | 1080 const SkScalar B = oval.fBottom; |
| 1125 const SkScalar cx = oval.centerX(); | 1081 const SkScalar cx = oval.centerX(); |
| 1126 const SkScalar cy = oval.centerY(); | 1082 const SkScalar cy = oval.centerY(); |
| 1127 const SkScalar weight = SK_ScalarRoot2Over2; | 1083 const SkScalar weight = SK_ScalarRoot2Over2; |
| 1128 | 1084 |
| 1129 this->incReserve(9); // move + 4 conics | 1085 this->incReserve(9); // move + 4 conics |
| 1130 this->moveTo(R, cy); | 1086 this->moveTo(R, cy); |
| 1131 if (dir == kCCW_Direction) { | 1087 if (dir == kCCW_Direction) { |
| 1132 this->conicTo(R, T, cx, T, weight); | 1088 this->conicTo(R, T, cx, T, weight); |
| 1133 this->conicTo(L, T, L, cy, weight); | 1089 this->conicTo(L, T, L, cy, weight); |
| 1134 this->conicTo(L, B, cx, B, weight); | 1090 this->conicTo(L, B, cx, B, weight); |
| 1135 this->conicTo(R, B, R, cy, weight); | 1091 this->conicTo(R, B, R, cy, weight); |
| 1136 } else { | 1092 } else { |
| 1137 this->conicTo(R, B, cx, B, weight); | 1093 this->conicTo(R, B, cx, B, weight); |
| 1138 this->conicTo(L, B, L, cy, weight); | 1094 this->conicTo(L, B, L, cy, weight); |
| 1139 this->conicTo(L, T, cx, T, weight); | 1095 this->conicTo(L, T, cx, T, weight); |
| 1140 this->conicTo(R, T, R, cy, weight); | 1096 this->conicTo(R, T, R, cy, weight); |
| 1141 } | 1097 } |
| 1142 #endif | |
| 1143 this->close(); | 1098 this->close(); |
| 1144 | 1099 |
| 1145 SkPathRef::Editor ed(&fPathRef); | 1100 SkPathRef::Editor ed(&fPathRef); |
| 1146 | 1101 |
| 1147 ed.setIsOval(isOval); | 1102 ed.setIsOval(isOval); |
| 1148 } | 1103 } |
| 1149 | 1104 |
| 1150 void SkPath::addCircle(SkScalar x, SkScalar y, SkScalar r, Direction dir) { | 1105 void SkPath::addCircle(SkScalar x, SkScalar y, SkScalar r, Direction dir) { |
| 1151 if (r > 0) { | 1106 if (r > 0) { |
| 1152 SkRect rect; | 1107 SkRect rect; |
| (...skipping 1680 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2833 switch (this->getFillType()) { | 2788 switch (this->getFillType()) { |
| 2834 case SkPath::kEvenOdd_FillType: | 2789 case SkPath::kEvenOdd_FillType: |
| 2835 case SkPath::kInverseEvenOdd_FillType: | 2790 case SkPath::kInverseEvenOdd_FillType: |
| 2836 w &= 1; | 2791 w &= 1; |
| 2837 break; | 2792 break; |
| 2838 default: | 2793 default: |
| 2839 break; | 2794 break; |
| 2840 } | 2795 } |
| 2841 return SkToBool(w); | 2796 return SkToBool(w); |
| 2842 } | 2797 } |
| OLD | NEW |