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

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

Issue 1113963002: use pathops utils to improve precision of cubic chopping in scan converter (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 7 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 | « no previous file | src/core/SkGeometry.h » ('j') | src/core/SkGeometry.cpp » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2009 The Android Open Source Project 3 * Copyright 2009 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 "SkEdgeClipper.h" 10 #include "SkEdgeClipper.h"
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 } 260 }
261 if (delta < TOLERANCE) { 261 if (delta < TOLERANCE) {
262 break; 262 break;
263 } 263 }
264 } 264 }
265 *t = mid; 265 *t = mid;
266 // SkDebugf("-- evalCubicAt %d delta %g\n", i, eval_cubic_coeff(A, B, C, D, * t)); 266 // SkDebugf("-- evalCubicAt %d delta %g\n", i, eval_cubic_coeff(A, B, C, D, * t));
267 return true; 267 return true;
268 } 268 }
269 269
270 #if 0
270 static bool chopMonoCubicAtY(SkPoint pts[4], SkScalar y, SkScalar* t) { 271 static bool chopMonoCubicAtY(SkPoint pts[4], SkScalar y, SkScalar* t) {
271 return chopMonoCubicAt(pts[0].fY, pts[1].fY, pts[2].fY, pts[3].fY, y, t); 272 return chopMonoCubicAt(pts[0].fY, pts[1].fY, pts[2].fY, pts[3].fY, y, t);
272 } 273 }
274 #endif
273 275
274 static bool chopMonoCubicAtX(SkPoint pts[4], SkScalar x, SkScalar* t) { 276 static bool chopMonoCubicAtX(SkPoint pts[4], SkScalar x, SkScalar* t) {
275 return chopMonoCubicAt(pts[0].fX, pts[1].fX, pts[2].fX, pts[3].fX, x, t); 277 return chopMonoCubicAt(pts[0].fX, pts[1].fX, pts[2].fX, pts[3].fX, x, t);
276 } 278 }
277 279
278 // Modify pts[] in place so that it is clipped in Y to the clip rect 280 // Modify pts[] in place so that it is clipped in Y to the clip rect
279 static void chop_cubic_in_Y(SkPoint pts[4], const SkRect& clip) { 281 static void chop_cubic_in_Y(SkPoint pts[4], const SkRect& clip) {
280 282
281 // are we partially above 283 // are we partially above
282 if (pts[0].fY < clip.fTop) { 284 if (pts[0].fY < clip.fTop) {
285 SkPoint tmp[7];
286 #if 0
283 SkScalar t; 287 SkScalar t;
284 if (chopMonoCubicAtY(pts, clip.fTop, &t)) { 288 if (chopMonoCubicAtY(pts, clip.fTop, &t)) {
285 SkPoint tmp[7];
286 SkChopCubicAt(pts, tmp, t); 289 SkChopCubicAt(pts, tmp, t);
287 290 #else
291 if (SkChopMonoCubicAtY(pts, clip.fTop, tmp)) {
292 #endif
288 // tmp[3, 4, 5].fY should all be to the below clip.fTop. 293 // tmp[3, 4, 5].fY should all be to the below clip.fTop.
289 // Since we can't trust the numerics of 294 // Since we can't trust the numerics of
290 // the chopper, we force those conditions now 295 // the chopper, we force those conditions now
291 tmp[3].fY = clip.fTop; 296 tmp[3].fY = clip.fTop;
292 clamp_ge(tmp[4].fY, clip.fTop); 297 clamp_ge(tmp[4].fY, clip.fTop);
293 clamp_ge(tmp[5].fY, clip.fTop); 298 // clamp_ge(tmp[5].fY, clip.fTop);
294 299
295 pts[0] = tmp[3]; 300 pts[0] = tmp[3];
296 pts[1] = tmp[4]; 301 pts[1] = tmp[4];
297 pts[2] = tmp[5]; 302 pts[2] = tmp[5];
298 } else { 303 } else {
299 // if chopMonoCubicAtY failed, then we may have hit inexact numerics 304 // if chopMonoCubicAtY failed, then we may have hit inexact numerics
300 // so we just clamp against the top 305 // so we just clamp against the top
301 for (int i = 0; i < 4; i++) { 306 for (int i = 0; i < 4; i++) {
302 clamp_ge(pts[i].fY, clip.fTop); 307 clamp_ge(pts[i].fY, clip.fTop);
303 } 308 }
304 } 309 }
305 } 310 }
306 311
307 // are we partially below 312 // are we partially below
308 if (pts[3].fY > clip.fBottom) { 313 if (pts[3].fY > clip.fBottom) {
314 SkPoint tmp[7];
315 #if 0
309 SkScalar t; 316 SkScalar t;
310 if (chopMonoCubicAtY(pts, clip.fBottom, &t)) { 317 if (chopMonoCubicAtY(pts, clip.fBottom, &t)) {
311 SkPoint tmp[7];
312 SkChopCubicAt(pts, tmp, t); 318 SkChopCubicAt(pts, tmp, t);
319 #else
320 if (SkChopMonoCubicAtY(pts, clip.fBottom, tmp)) {
321 #endif
313 tmp[3].fY = clip.fBottom; 322 tmp[3].fY = clip.fBottom;
314 clamp_le(tmp[2].fY, clip.fBottom); 323 clamp_le(tmp[2].fY, clip.fBottom);
315 324
316 pts[1] = tmp[1]; 325 pts[1] = tmp[1];
317 pts[2] = tmp[2]; 326 pts[2] = tmp[2];
318 pts[3] = tmp[3]; 327 pts[3] = tmp[3];
319 } else { 328 } else {
320 // if chopMonoCubicAtY failed, then we may have hit inexact numerics 329 // if chopMonoCubicAtY failed, then we may have hit inexact numerics
321 // so we just clamp against the bottom 330 // so we just clamp against the bottom
322 for (int i = 0; i < 4; i++) { 331 for (int i = 0; i < 4; i++) {
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 assert_monotonic(&pts[0].fY, count); 535 assert_monotonic(&pts[0].fY, count);
527 } 536 }
528 } 537 }
529 538
530 void sk_assert_monotonic_x(const SkPoint pts[], int count) { 539 void sk_assert_monotonic_x(const SkPoint pts[], int count) {
531 if (count > 1) { 540 if (count > 1) {
532 assert_monotonic(&pts[0].fX, count); 541 assert_monotonic(&pts[0].fX, count);
533 } 542 }
534 } 543 }
535 #endif 544 #endif
OLDNEW
« no previous file with comments | « no previous file | src/core/SkGeometry.h » ('j') | src/core/SkGeometry.cpp » ('J')

Powered by Google App Engine
This is Rietveld 408576698