| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "PathOpsTestCommon.h" | 7 #include "PathOpsTestCommon.h" |
| 8 #include "SkGeometry.h" | 8 #include "SkGeometry.h" |
| 9 #include "SkIntersections.h" | 9 #include "SkIntersections.h" |
| 10 #include "Test.h" | 10 #include "Test.h" |
| 11 | 11 |
| 12 /* | 12 /* |
| 13 manually compute the intersection of a pair of circles and see if the conic inte
rsection matches | 13 manually compute the intersection of a pair of circles and see if the conic inte
rsection matches |
| 14 given two circles | 14 given two circles |
| 15 construct a line connecting their centers | 15 construct a line connecting their centers |
| 16 | 16 |
| 17 */ | 17 */ |
| 18 | 18 |
| 19 static const SkDConic testSet[] = { | 19 static const SkDConic testSet[] = { |
| 20 {{{{306.588013,-227.983994}, {212.464996,-262.242004}, {95.5512009,58.976398
5}}}, 0.707107008f}, | 20 {{{{306.588013,-227.983994}, {212.464996,-262.242004}, {95.5512009,58.976398
5}}}, 0.707107008f}, |
| 21 {{{{377.218994,-141.981003}, {40.578701,-201.339996}, {23.1854992,-102.69799
8}}}, 0.707107008f}, | 21 {{{{377.218994,-141.981003}, {40.578701,-201.339996}, {23.1854992,-102.69799
8}}}, 0.707107008f}, |
| 22 | 22 |
| 23 {{{{5.1114602088928223, 628.77813720703125}, | 23 {{{{5.1114602088928223, 628.77813720703125}, |
| 24 {10.834027290344238, 988.964111328125}, | 24 {10.834027290344238, 988.964111328125}, |
| 25 {163.40835571289062, 988.964111328125}}}, 0.72944212f}, | 25 {163.40835571289062, 988.964111328125}}}, 0.72944212f}, |
| 26 {{{{163.40835571289062, 988.964111328125}, | 26 {{{{163.40835571289062, 988.964111328125}, |
| 27 {5, 988.964111328125}, | 27 {5, 988.964111328125}, |
| 28 {5, 614.7423095703125}}}, 0.707106769f}, | 28 {5, 614.7423095703125}}}, 0.707106769f}, |
| 29 | 29 |
| 30 {{{{11.17222976684570312, -8.103978157043457031}, | 30 {{{{11.17222976684570312, -8.103978157043457031}, |
| 31 {22.91432571411132812, -10.37866020202636719}, | 31 {22.91432571411132812, -10.37866020202636719}, |
| 32 {23.7764129638671875, -7.725424289703369141}}}, 1.00862849f}, | 32 {23.7764129638671875, -7.725424289703369141}}}, 1.00862849f}, |
| 33 {{{{-1.545085430145263672, -4.755282402038574219}, | 33 {{{{-1.545085430145263672, -4.755282402038574219}, |
| 34 {22.23132705688476562, -12.48070907592773438}, | 34 {22.23132705688476562, -12.48070907592773438}, |
| 35 {23.7764129638671875, -7.725427150726318359}}}, 0.707106769f}, | 35 {23.7764129638671875, -7.725427150726318359}}}, 0.707106769f}, |
| 36 | 36 |
| 37 {{{{-4,1}, {-4,5}, {0,5}}}, 0.707106769f}, | 37 {{{{-4,1}, {-4,5}, {0,5}}}, 0.707106769f}, |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 109 paint.setARGB(0x80, 0, 0, 0xFF); | 109 paint.setARGB(0x80, 0, 0, 0xFF); |
| 110 canvas.drawPath(path, paint); | 110 canvas.drawPath(path, paint); |
| 111 SkString filename("c:\\Users\\caryclark\\Documents\\"); | 111 SkString filename("c:\\Users\\caryclark\\Documents\\"); |
| 112 filename.appendf("%s.png", name); | 112 filename.appendf("%s.png", name); |
| 113 SkImageEncoder::EncodeFile(filename.c_str(), bitmap, | 113 SkImageEncoder::EncodeFile(filename.c_str(), bitmap, |
| 114 SkImageEncoder::kPNG_Type, 100); | 114 SkImageEncoder::kPNG_Type, 100); |
| 115 } | 115 } |
| 116 | 116 |
| 117 static void writeDPng(const SkDConic& dC, const char* name) { | 117 static void writeDPng(const SkDConic& dC, const char* name) { |
| 118 const int scale = 5; | 118 const int scale = 5; |
| 119 SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale }, | 119 SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale }, |
| 120 {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, | 120 {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, |
| 121 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight }; | 121 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight }; |
| 122 SkBitmap bitmap; | 122 SkBitmap bitmap; |
| 123 SkDRect bounds; | 123 SkDRect bounds; |
| 124 bounds.setBounds(dConic); | 124 bounds.setBounds(dConic); |
| 125 bounds.fLeft -= 10; | 125 bounds.fLeft -= 10; |
| 126 bounds.fTop -= 10; | 126 bounds.fTop -= 10; |
| 127 bounds.fRight += 10; | 127 bounds.fRight += 10; |
| 128 bounds.fBottom += 10; | 128 bounds.fBottom += 10; |
| 129 bitmap.tryAllocPixels(SkImageInfo::MakeN32Premul( | 129 bitmap.tryAllocPixels(SkImageInfo::MakeN32Premul( |
| 130 SkScalarRoundToInt(SkDoubleToScalar(bounds.width())), | 130 SkScalarRoundToInt(SkDoubleToScalar(bounds.width())), |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 }; | 219 }; |
| 220 | 220 |
| 221 const SkDConic frame6[] = { | 221 const SkDConic frame6[] = { |
| 222 {{{{306.588013,-227.983994}, {212.464996,-262.242004}, {95.5512009,58.9763985}}}
, 0.707107008f}, | 222 {{{{306.588013,-227.983994}, {212.464996,-262.242004}, {95.5512009,58.9763985}}}
, 0.707107008f}, |
| 223 {{{{377.218994,-141.981003}, {40.578701,-201.339996}, {23.1854992,-102.697998}}}
, 0.707107008f}, | 223 {{{{377.218994,-141.981003}, {40.578701,-201.339996}, {23.1854992,-102.697998}}}
, 0.707107008f}, |
| 224 {{{{205.78973252799028, -158.12538713371103}, {190.33692178059735, -137.11320166
154385}, {174.87004877564593, -111.2132534799228}}}, 0.858117759f}, | 224 {{{{205.78973252799028, -158.12538713371103}, {190.33692178059735, -137.11320166
154385}, {174.87004877564593, -111.2132534799228}}}, 0.858117759f}, |
| 225 {{{{252.08225670812539, -156.90491625851064}, {219.70109133058406, -158.81912754
088933}, {190.17095392508796, -158.38373974664466}}}, 0.858306944f}, | 225 {{{{252.08225670812539, -156.90491625851064}, {219.70109133058406, -158.81912754
088933}, {190.17095392508796, -158.38373974664466}}}, 0.858306944f}, |
| 226 }; | 226 }; |
| 227 | 227 |
| 228 const SkDConic* frames[] = { | 228 const SkDConic* frames[] = { |
| 229 frame0, frame1, frame2, frame3, frame4, frame5, frame6 | 229 frame0, frame1, frame2, frame3, frame4, frame5, frame6 |
| 230 }; | 230 }; |
| 231 | 231 |
| 232 const int frameSizes[] = { (int) SK_ARRAY_COUNT(frame0), (int) SK_ARRAY_COUNT(fr
ame1), | 232 const int frameSizes[] = { (int) SK_ARRAY_COUNT(frame0), (int) SK_ARRAY_COUNT(fr
ame1), |
| 233 (int) SK_ARRAY_COUNT(frame2), (int) SK_ARRAY_COUNT(frame3), | 233 (int) SK_ARRAY_COUNT(frame2), (int) SK_ARRAY_COUNT(frame3), |
| 234 (int) SK_ARRAY_COUNT(frame4), (int) SK_ARRAY_COUNT(frame5), | 234 (int) SK_ARRAY_COUNT(frame4), (int) SK_ARRAY_COUNT(frame5), |
| 235 (int) SK_ARRAY_COUNT(frame6), | 235 (int) SK_ARRAY_COUNT(frame6), |
| 236 }; | 236 }; |
| 237 | 237 |
| 238 static void writeFrames() { | 238 static void writeFrames() { |
| 239 const int scale = 5; | 239 const int scale = 5; |
| 240 | 240 |
| 241 for (int index = 0; index < (int) SK_ARRAY_COUNT(frameSizes); ++index) { | 241 for (int index = 0; index < (int) SK_ARRAY_COUNT(frameSizes); ++index) { |
| 242 SkDRect bounds; | 242 SkDRect bounds; |
| 243 bool boundsSet = false; | 243 bool boundsSet = false; |
| 244 int frameSize = frameSizes[index]; | 244 int frameSize = frameSizes[index]; |
| 245 for (int fIndex = 0; fIndex < frameSize; ++fIndex) { | 245 for (int fIndex = 0; fIndex < frameSize; ++fIndex) { |
| 246 const SkDConic& dC = frames[index][fIndex]; | 246 const SkDConic& dC = frames[index][fIndex]; |
| 247 SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale
}, | 247 SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale
}, |
| 248 {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, | 248 {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, |
| 249 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight }; | 249 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight }; |
| 250 SkDRect dBounds; | 250 SkDRect dBounds; |
| 251 dBounds.setBounds(dConic); | 251 dBounds.setBounds(dConic); |
| 252 if (!boundsSet) { | 252 if (!boundsSet) { |
| 253 bounds = dBounds; | 253 bounds = dBounds; |
| 254 boundsSet = true; | 254 boundsSet = true; |
| 255 } else { | 255 } else { |
| 256 bounds.add((SkDPoint&) dBounds.fLeft); | 256 bounds.add((SkDPoint&) dBounds.fLeft); |
| 257 bounds.add((SkDPoint&) dBounds.fRight); | 257 bounds.add((SkDPoint&) dBounds.fRight); |
| 258 } | 258 } |
| 259 } | 259 } |
| 260 bounds.fLeft -= 10; | 260 bounds.fLeft -= 10; |
| 261 bounds.fTop -= 10; | 261 bounds.fTop -= 10; |
| 262 bounds.fRight += 10; | 262 bounds.fRight += 10; |
| 263 bounds.fBottom += 10; | 263 bounds.fBottom += 10; |
| 264 SkBitmap bitmap; | 264 SkBitmap bitmap; |
| 265 bitmap.tryAllocPixels(SkImageInfo::MakeN32Premul( | 265 bitmap.tryAllocPixels(SkImageInfo::MakeN32Premul( |
| 266 SkScalarRoundToInt(SkDoubleToScalar(bounds.width())), | 266 SkScalarRoundToInt(SkDoubleToScalar(bounds.width())), |
| 267 SkScalarRoundToInt(SkDoubleToScalar(bounds.height())))); | 267 SkScalarRoundToInt(SkDoubleToScalar(bounds.height())))); |
| 268 SkCanvas canvas(bitmap); | 268 SkCanvas canvas(bitmap); |
| 269 SkPaint paint; | 269 SkPaint paint; |
| 270 paint.setAntiAlias(true); | 270 paint.setAntiAlias(true); |
| 271 paint.setStyle(SkPaint::kStroke_Style); | 271 paint.setStyle(SkPaint::kStroke_Style); |
| 272 canvas.translate(SkDoubleToScalar(-bounds.fLeft), SkDoubleToScalar(-boun
ds.fTop)); | 272 canvas.translate(SkDoubleToScalar(-bounds.fLeft), SkDoubleToScalar(-boun
ds.fTop)); |
| 273 canvas.drawColor(SK_ColorWHITE); | 273 canvas.drawColor(SK_ColorWHITE); |
| 274 for (int fIndex = 0; fIndex < frameSize; ++fIndex) { | 274 for (int fIndex = 0; fIndex < frameSize; ++fIndex) { |
| 275 const SkDConic& dC = frames[index][fIndex]; | 275 const SkDConic& dC = frames[index][fIndex]; |
| 276 SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale
}, | 276 SkDConic dConic = {{{ {dC.fPts[0].fX * scale, dC.fPts[0].fY * scale
}, |
| 277 {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, | 277 {dC.fPts[1].fX * scale, dC.fPts[1].fY * scale }, |
| 278 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight }; | 278 {dC.fPts[2].fX * scale, dC.fPts[2].fY * scale }}}, dC.fWeight }; |
| 279 SkPath path; | 279 SkPath path; |
| 280 path.moveTo(dConic.fPts[0].asSkPoint()); | 280 path.moveTo(dConic.fPts[0].asSkPoint()); |
| 281 path.conicTo(dConic.fPts[1].asSkPoint(), dConic.fPts[2].asSkPoint(),
dConic.fWeight); | 281 path.conicTo(dConic.fPts[1].asSkPoint(), dConic.fPts[2].asSkPoint(),
dConic.fWeight); |
| 282 if (fIndex < 2) { | 282 if (fIndex < 2) { |
| 283 paint.setARGB(0x80, 0xFF, 0, 0); | 283 paint.setARGB(0x80, 0xFF, 0, 0); |
| 284 } else { | 284 } else { |
| 285 paint.setARGB(0x80, 0, 0, 0xFF); | 285 paint.setARGB(0x80, 0, 0, 0xFF); |
| 286 } | 286 } |
| 287 canvas.drawPath(path, paint); | 287 canvas.drawPath(path, paint); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 } | 341 } |
| 342 } | 342 } |
| 343 | 343 |
| 344 DEF_TEST(PathOpsConicIntersectionOneOff, reporter) { | 344 DEF_TEST(PathOpsConicIntersectionOneOff, reporter) { |
| 345 oneOff(reporter, 0, 1); | 345 oneOff(reporter, 0, 1); |
| 346 } | 346 } |
| 347 | 347 |
| 348 DEF_TEST(PathOpsConicIntersection, reporter) { | 348 DEF_TEST(PathOpsConicIntersection, reporter) { |
| 349 oneOffTests(reporter); | 349 oneOffTests(reporter); |
| 350 } | 350 } |
| OLD | NEW |