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

Side by Side Diff: Source/core/platform/graphics/Path.cpp

Issue 18286007: Fix edge case bugs of canvas arc. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@ellipse
Patch Set: Test uses alpha color to check darkening of paths on the double-rasterized region. Created 7 years, 3 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 | « Source/core/html/canvas/CanvasPathMethods.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 (C) 2003, 2006 Apple Computer, Inc. All rights reserved. 2 * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved.
3 * 2006 Rob Buis <buis@kde.org> 3 * 2006 Rob Buis <buis@kde.org>
4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> 4 * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5 * Copyright (C) 2013 Google Inc. All rights reserved. 5 * Copyright (C) 2013 Google Inc. All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 void Path::addArcTo(const FloatPoint& p1, const FloatPoint& p2, float radius) 269 void Path::addArcTo(const FloatPoint& p1, const FloatPoint& p2, float radius)
270 { 270 {
271 m_path.arcTo(p1, p2, WebCoreFloatToSkScalar(radius)); 271 m_path.arcTo(p1, p2, WebCoreFloatToSkScalar(radius));
272 } 272 }
273 273
274 void Path::closeSubpath() 274 void Path::closeSubpath()
275 { 275 {
276 m_path.close(); 276 m_path.close();
277 } 277 }
278 278
279 void Path::addArc(const FloatPoint& p, float r, float sa, float ea, bool anticlo ckwise) 279 void Path::addArc(const FloatPoint& p, float radius, float startAngle, float end Angle, bool anticlockwise)
280 { 280 {
281 SkScalar cx = WebCoreFloatToSkScalar(p.x()); 281 SkScalar cx = WebCoreFloatToSkScalar(p.x());
282 SkScalar cy = WebCoreFloatToSkScalar(p.y()); 282 SkScalar cy = WebCoreFloatToSkScalar(p.y());
283 SkScalar radius = WebCoreFloatToSkScalar(r); 283 SkScalar radiusScalar = WebCoreFloatToSkScalar(radius);
284 SkScalar s360 = SkIntToScalar(360); 284 SkScalar s360 = SkIntToScalar(360);
285 285
286 SkRect oval; 286 SkRect oval;
287 oval.set(cx - radius, cy - radius, cx + radius, cy + radius); 287 oval.set(cx - radiusScalar, cy - radiusScalar, cx + radiusScalar, cy + radiu sScalar);
288 288
289 float sweep = ea - sa; 289 float sweep = endAngle - startAngle;
290 SkScalar startDegrees = WebCoreFloatToSkScalar(sa * 180 / piFloat); 290 SkScalar startDegrees = WebCoreFloatToSkScalar(startAngle * 180 / piFloat);
291 SkScalar sweepDegrees = WebCoreFloatToSkScalar(sweep * 180 / piFloat); 291 SkScalar sweepDegrees = WebCoreFloatToSkScalar(sweep * 180 / piFloat);
292 // Check for a circle. 292 // Check for a circle.
293 if (sweepDegrees >= s360 || sweepDegrees <= -s360) { 293 if (sweepDegrees >= s360 || sweepDegrees <= -s360) {
294 // Move to the start position (0 sweep means we add a single point). 294 // Move to the start position (0 sweep means we add a single point).
295 m_path.arcTo(oval, startDegrees, 0, false); 295 m_path.arcTo(oval, startDegrees, 0, false);
296 // Draw the circle. 296 // Draw the circle.
297 m_path.addOval(oval, anticlockwise ? 297 m_path.addOval(oval, anticlockwise ?
298 SkPath::kCCW_Direction : SkPath::kCW_Direction); 298 SkPath::kCCW_Direction : SkPath::kCW_Direction);
299 // Force a moveTo the end position. 299 // Force a moveTo the end position.
300 m_path.arcTo(oval, startDegrees + sweepDegrees, 0, true); 300 m_path.arcTo(oval, startDegrees + sweepDegrees, 0, true);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 { 414 {
415 m_path.offset(WebCoreFloatToSkScalar(size.width()), WebCoreFloatToSkScalar(s ize.height())); 415 m_path.offset(WebCoreFloatToSkScalar(size.width()), WebCoreFloatToSkScalar(s ize.height()));
416 } 416 }
417 417
418 bool Path::unionPath(const Path& other) 418 bool Path::unionPath(const Path& other)
419 { 419 {
420 return Op(m_path, other.m_path, kUnion_PathOp, &m_path); 420 return Op(m_path, other.m_path, kUnion_PathOp, &m_path);
421 } 421 }
422 422
423 } 423 }
OLDNEW
« no previous file with comments | « Source/core/html/canvas/CanvasPathMethods.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698