| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 bool isVerticalLine = (p1.x() == p2.x()); | 494 bool isVerticalLine = (p1.x() == p2.x()); |
| 495 int width = roundf(strokeThickness()); | 495 int width = roundf(strokeThickness()); |
| 496 | 496 |
| 497 // We know these are vertical or horizontal lines, so the length will just | 497 // We know these are vertical or horizontal lines, so the length will just |
| 498 // be the sum of the displacement component vectors give or take 1 - | 498 // be the sum of the displacement component vectors give or take 1 - |
| 499 // probably worth the speed up of no square root, which also won't be exact. | 499 // probably worth the speed up of no square root, which also won't be exact. |
| 500 FloatSize disp = p2 - p1; | 500 FloatSize disp = p2 - p1; |
| 501 int length = SkScalarRoundToInt(disp.width() + disp.height()); | 501 int length = SkScalarRoundToInt(disp.width() + disp.height()); |
| 502 PaintFlags flags(immutableState()->strokeFlags(length)); | 502 PaintFlags flags(immutableState()->strokeFlags(length)); |
| 503 | 503 |
| 504 if (getStrokeStyle() == DottedStroke || getStrokeStyle() == DashedStroke) { | 504 if (StrokeData::strokeIsDashed(width, getStrokeStyle())) { |
| 505 // Do a rect fill of our endpoints. This ensures we always have the | 505 // Do a rect fill of our endpoints. This ensures we always have the |
| 506 // appearance of being a border. We then draw the actual dotted/dashed | 506 // appearance of being a border. We then draw the actual dotted/dashed |
| 507 // line. | 507 // line. |
| 508 SkRect r1, r2; | 508 SkRect r1, r2; |
| 509 r1.set(p1.x(), p1.y(), p1.x() + width, p1.y() + width); | 509 r1.set(p1.x(), p1.y(), p1.x() + width, p1.y() + width); |
| 510 r2.set(p2.x(), p2.y(), p2.x() + width, p2.y() + width); | 510 r2.set(p2.x(), p2.y(), p2.x() + width, p2.y() + width); |
| 511 | 511 |
| 512 if (isVerticalLine) { | 512 if (isVerticalLine) { |
| 513 r1.offset(-width / 2, 0); | 513 r1.offset(-width / 2, 0); |
| 514 r2.offset(-width / 2, -width); | 514 r2.offset(-width / 2, -width); |
| 515 } else { | 515 } else { |
| 516 r1.offset(0, -width / 2); | 516 r1.offset(0, -width / 2); |
| 517 r2.offset(-width, -width / 2); | 517 r2.offset(-width, -width / 2); |
| 518 } | 518 } |
| 519 PaintFlags fillFlags; | 519 PaintFlags fillFlags; |
| 520 fillFlags.setColor(flags.getColor()); | 520 fillFlags.setColor(flags.getColor()); |
| 521 drawRect(r1, fillFlags); | 521 drawRect(r1, fillFlags); |
| 522 drawRect(r2, fillFlags); | 522 drawRect(r2, fillFlags); |
| 523 } else if (getStrokeStyle() == DottedStroke) { |
| 524 // We draw thick dotted lines with 0 length dash strokes and round endcaps, |
| 525 // producing circles. The endcaps extend beyond the line's endpoints, |
| 526 // so move the start and end in. |
| 527 if (isVerticalLine) { |
| 528 p1.setY(p1.y() + width / 2.f); |
| 529 p2.setY(p2.y() - width / 2.f); |
| 530 } else { |
| 531 p1.setX(p1.x() + width / 2.f); |
| 532 p2.setX(p2.x() - width / 2.f); |
| 533 } |
| 523 } | 534 } |
| 524 | 535 |
| 525 adjustLineToPixelBoundaries(p1, p2, width, penStyle); | 536 adjustLineToPixelBoundaries(p1, p2, width, penStyle); |
| 526 m_canvas->drawLine(p1.x(), p1.y(), p2.x(), p2.y(), flags); | 537 m_canvas->drawLine(p1.x(), p1.y(), p2.x(), p2.y(), flags); |
| 527 } | 538 } |
| 528 | 539 |
| 529 namespace { | 540 namespace { |
| 530 | 541 |
| 531 #if !OS(MACOSX) | 542 #if !OS(MACOSX) |
| 532 | 543 |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1291 | 1302 |
| 1292 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, | 1303 void GraphicsContext::adjustLineToPixelBoundaries(FloatPoint& p1, |
| 1293 FloatPoint& p2, | 1304 FloatPoint& p2, |
| 1294 float strokeWidth, | 1305 float strokeWidth, |
| 1295 StrokeStyle penStyle) { | 1306 StrokeStyle penStyle) { |
| 1296 // For odd widths, we add in 0.5 to the appropriate x/y so that the float | 1307 // For odd widths, we add in 0.5 to the appropriate x/y so that the float |
| 1297 // arithmetic works out. For example, with a border width of 3, WebKit will | 1308 // arithmetic works out. For example, with a border width of 3, WebKit will |
| 1298 // pass us (y1+y2)/2, e.g., (50+53)/2 = 103/2 = 51 when we want 51.5. It is | 1309 // pass us (y1+y2)/2, e.g., (50+53)/2 = 103/2 = 51 when we want 51.5. It is |
| 1299 // always true that an even width gave us a perfect position, but an odd width | 1310 // always true that an even width gave us a perfect position, but an odd width |
| 1300 // gave us a position that is off by exactly 0.5. | 1311 // gave us a position that is off by exactly 0.5. |
| 1301 if (penStyle == DottedStroke || penStyle == DashedStroke) { | 1312 if (StrokeData::strokeIsDashed(strokeWidth, penStyle)) { |
| 1302 if (p1.x() == p2.x()) { | 1313 if (p1.x() == p2.x()) { |
| 1303 p1.setY(p1.y() + strokeWidth); | 1314 p1.setY(p1.y() + strokeWidth); |
| 1304 p2.setY(p2.y() - strokeWidth); | 1315 p2.setY(p2.y() - strokeWidth); |
| 1305 } else { | 1316 } else { |
| 1306 p1.setX(p1.x() + strokeWidth); | 1317 p1.setX(p1.x() + strokeWidth); |
| 1307 p2.setX(p2.x() - strokeWidth); | 1318 p2.setX(p2.x() - strokeWidth); |
| 1308 } | 1319 } |
| 1309 } | 1320 } |
| 1310 | 1321 |
| 1311 if (static_cast<int>(strokeWidth) % 2) { // odd | 1322 if (static_cast<int>(strokeWidth) % 2) { // odd |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1336 break; | 1347 break; |
| 1337 default: | 1348 default: |
| 1338 NOTREACHED(); | 1349 NOTREACHED(); |
| 1339 break; | 1350 break; |
| 1340 } | 1351 } |
| 1341 | 1352 |
| 1342 return nullptr; | 1353 return nullptr; |
| 1343 } | 1354 } |
| 1344 | 1355 |
| 1345 } // namespace blink | 1356 } // namespace blink |
| OLD | NEW |