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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp

Issue 1454163005: Change float-->double in CanvasRenderingContext2D.idl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update bug number in TestExpectations Created 5 years, 1 month 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) 3 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies)
4 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 4 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 5 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> 6 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 7 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. 8 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved.
9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 9 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
10 * 10 *
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 #include "wtf/text/StringBuilder.h" 75 #include "wtf/text/StringBuilder.h"
76 76
77 namespace blink { 77 namespace blink {
78 78
79 static const char defaultFont[] = "10px sans-serif"; 79 static const char defaultFont[] = "10px sans-serif";
80 static const char inherit[] = "inherit"; 80 static const char inherit[] = "inherit";
81 static const char rtl[] = "rtl"; 81 static const char rtl[] = "rtl";
82 static const char ltr[] = "ltr"; 82 static const char ltr[] = "ltr";
83 static const double TryRestoreContextInterval = 0.5; 83 static const double TryRestoreContextInterval = 0.5;
84 static const unsigned MaxTryRestoreContextAttempts = 4; 84 static const unsigned MaxTryRestoreContextAttempts = 4;
85 static const float cDeviceScaleFactor = 1.0f; // Canvas is device independent 85 static const double cDeviceScaleFactor = 1.0; // Canvas is device independent
86 86
87 static bool contextLostRestoredEventsEnabled() 87 static bool contextLostRestoredEventsEnabled()
88 { 88 {
89 return RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled(); 89 return RuntimeEnabledFeatures::experimentalCanvasFeaturesEnabled();
90 } 90 }
91 91
92 // Drawing methods need to use this instead of SkAutoCanvasRestore in case overd raw 92 // Drawing methods need to use this instead of SkAutoCanvasRestore in case overd raw
93 // detection substitutes the recording canvas (to discard overdrawn draw calls). 93 // detection substitutes the recording canvas (to discard overdrawn draw calls).
94 class CanvasRenderingContext2DAutoRestoreSkCanvas { 94 class CanvasRenderingContext2DAutoRestoreSkCanvas {
95 STACK_ALLOCATED(); 95 STACK_ALLOCATED();
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 if (canvasPattern->pattern()->isTextureBacked()) 441 if (canvasPattern->pattern()->isTextureBacked())
442 canvas()->disableDeferral(); 442 canvas()->disableDeferral();
443 canvasStyle = CanvasStyle::createFromPattern(canvasPattern); 443 canvasStyle = CanvasStyle::createFromPattern(canvasPattern);
444 } 444 }
445 445
446 ASSERT(canvasStyle); 446 ASSERT(canvasStyle);
447 modifiableState().setFillStyle(canvasStyle); 447 modifiableState().setFillStyle(canvasStyle);
448 modifiableState().setUnparsedFillColor(colorString); 448 modifiableState().setUnparsedFillColor(colorString);
449 } 449 }
450 450
451 float CanvasRenderingContext2D::lineWidth() const 451 double CanvasRenderingContext2D::lineWidth() const
452 { 452 {
453 return state().lineWidth(); 453 return state().lineWidth();
454 } 454 }
455 455
456 void CanvasRenderingContext2D::setLineWidth(float width) 456 void CanvasRenderingContext2D::setLineWidth(double width)
457 { 457 {
458 if (!std::isfinite(width) || width <= 0) 458 if (!std::isfinite(width) || width <= 0)
459 return; 459 return;
460 if (state().lineWidth() == width) 460 if (state().lineWidth() == width)
461 return; 461 return;
462 modifiableState().setLineWidth(width); 462 modifiableState().setLineWidth(width);
463 } 463 }
464 464
465 String CanvasRenderingContext2D::lineCap() const 465 String CanvasRenderingContext2D::lineCap() const
466 { 466 {
(...skipping 18 matching lines...) Expand all
485 void CanvasRenderingContext2D::setLineJoin(const String& s) 485 void CanvasRenderingContext2D::setLineJoin(const String& s)
486 { 486 {
487 LineJoin join; 487 LineJoin join;
488 if (!parseLineJoin(s, join)) 488 if (!parseLineJoin(s, join))
489 return; 489 return;
490 if (state().lineJoin() == join) 490 if (state().lineJoin() == join)
491 return; 491 return;
492 modifiableState().setLineJoin(join); 492 modifiableState().setLineJoin(join);
493 } 493 }
494 494
495 float CanvasRenderingContext2D::miterLimit() const 495 double CanvasRenderingContext2D::miterLimit() const
496 { 496 {
497 return state().miterLimit(); 497 return state().miterLimit();
498 } 498 }
499 499
500 void CanvasRenderingContext2D::setMiterLimit(float limit) 500 void CanvasRenderingContext2D::setMiterLimit(double limit)
501 { 501 {
502 if (!std::isfinite(limit) || limit <= 0) 502 if (!std::isfinite(limit) || limit <= 0)
503 return; 503 return;
504 if (state().miterLimit() == limit) 504 if (state().miterLimit() == limit)
505 return; 505 return;
506 modifiableState().setMiterLimit(limit); 506 modifiableState().setMiterLimit(limit);
507 } 507 }
508 508
509 float CanvasRenderingContext2D::shadowOffsetX() const 509 double CanvasRenderingContext2D::shadowOffsetX() const
510 { 510 {
511 return state().shadowOffset().width(); 511 return state().shadowOffset().width();
512 } 512 }
513 513
514 void CanvasRenderingContext2D::setShadowOffsetX(float x) 514 void CanvasRenderingContext2D::setShadowOffsetX(double x)
515 { 515 {
516 if (!std::isfinite(x)) 516 if (!std::isfinite(x))
517 return; 517 return;
518 if (state().shadowOffset().width() == x) 518 if (state().shadowOffset().width() == x)
519 return; 519 return;
520 modifiableState().setShadowOffsetX(x); 520 modifiableState().setShadowOffsetX(x);
521 } 521 }
522 522
523 float CanvasRenderingContext2D::shadowOffsetY() const 523 double CanvasRenderingContext2D::shadowOffsetY() const
524 { 524 {
525 return state().shadowOffset().height(); 525 return state().shadowOffset().height();
526 } 526 }
527 527
528 void CanvasRenderingContext2D::setShadowOffsetY(float y) 528 void CanvasRenderingContext2D::setShadowOffsetY(double y)
529 { 529 {
530 if (!std::isfinite(y)) 530 if (!std::isfinite(y))
531 return; 531 return;
532 if (state().shadowOffset().height() == y) 532 if (state().shadowOffset().height() == y)
533 return; 533 return;
534 modifiableState().setShadowOffsetY(y); 534 modifiableState().setShadowOffsetY(y);
535 } 535 }
536 536
537 float CanvasRenderingContext2D::shadowBlur() const 537 double CanvasRenderingContext2D::shadowBlur() const
538 { 538 {
539 return state().shadowBlur(); 539 return state().shadowBlur();
540 } 540 }
541 541
542 void CanvasRenderingContext2D::setShadowBlur(float blur) 542 void CanvasRenderingContext2D::setShadowBlur(double blur)
543 { 543 {
544 if (!std::isfinite(blur) || blur < 0) 544 if (!std::isfinite(blur) || blur < 0)
545 return; 545 return;
546 if (state().shadowBlur() == blur) 546 if (state().shadowBlur() == blur)
547 return; 547 return;
548 modifiableState().setShadowBlur(blur); 548 modifiableState().setShadowBlur(blur);
549 } 549 }
550 550
551 String CanvasRenderingContext2D::shadowColor() const 551 String CanvasRenderingContext2D::shadowColor() const
552 { 552 {
553 return Color(state().shadowColor()).serialized(); 553 return Color(state().shadowColor()).serialized();
554 } 554 }
555 555
556 void CanvasRenderingContext2D::setShadowColor(const String& colorString) 556 void CanvasRenderingContext2D::setShadowColor(const String& colorString)
557 { 557 {
558 Color color; 558 Color color;
559 if (!parseColorOrCurrentColor(color, colorString, canvas())) 559 if (!parseColorOrCurrentColor(color, colorString, canvas()))
560 return; 560 return;
561 if (state().shadowColor() == color) 561 if (state().shadowColor() == color)
562 return; 562 return;
563 modifiableState().setShadowColor(color.rgb()); 563 modifiableState().setShadowColor(color.rgb());
564 } 564 }
565 565
566 const Vector<float>& CanvasRenderingContext2D::getLineDash() const 566 const Vector<double>& CanvasRenderingContext2D::getLineDash() const
567 { 567 {
568 return state().lineDash(); 568 return state().lineDash();
569 } 569 }
570 570
571 static bool lineDashSequenceIsValid(const Vector<float>& dash) 571 static bool lineDashSequenceIsValid(const Vector<double>& dash)
572 { 572 {
573 for (size_t i = 0; i < dash.size(); i++) { 573 for (size_t i = 0; i < dash.size(); i++) {
574 if (!std::isfinite(dash[i]) || dash[i] < 0) 574 if (!std::isfinite(dash[i]) || dash[i] < 0)
575 return false; 575 return false;
576 } 576 }
577 return true; 577 return true;
578 } 578 }
579 579
580 void CanvasRenderingContext2D::setLineDash(const Vector<float>& dash) 580 void CanvasRenderingContext2D::setLineDash(const Vector<double>& dash)
581 { 581 {
582 if (!lineDashSequenceIsValid(dash)) 582 if (!lineDashSequenceIsValid(dash))
583 return; 583 return;
584 modifiableState().setLineDash(dash); 584 modifiableState().setLineDash(dash);
585 } 585 }
586 586
587 float CanvasRenderingContext2D::lineDashOffset() const 587 double CanvasRenderingContext2D::lineDashOffset() const
588 { 588 {
589 return state().lineDashOffset(); 589 return state().lineDashOffset();
590 } 590 }
591 591
592 void CanvasRenderingContext2D::setLineDashOffset(float offset) 592 void CanvasRenderingContext2D::setLineDashOffset(double offset)
593 { 593 {
594 if (!std::isfinite(offset) || state().lineDashOffset() == offset) 594 if (!std::isfinite(offset) || state().lineDashOffset() == offset)
595 return; 595 return;
596 modifiableState().setLineDashOffset(offset); 596 modifiableState().setLineDashOffset(offset);
597 } 597 }
598 598
599 float CanvasRenderingContext2D::globalAlpha() const 599 double CanvasRenderingContext2D::globalAlpha() const
600 { 600 {
601 return state().globalAlpha(); 601 return state().globalAlpha();
602 } 602 }
603 603
604 void CanvasRenderingContext2D::setGlobalAlpha(float alpha) 604 void CanvasRenderingContext2D::setGlobalAlpha(double alpha)
605 { 605 {
606 if (!(alpha >= 0 && alpha <= 1)) 606 if (!(alpha >= 0 && alpha <= 1))
607 return; 607 return;
608 if (state().globalAlpha() == alpha) 608 if (state().globalAlpha() == alpha)
609 return; 609 return;
610 modifiableState().setGlobalAlpha(alpha); 610 modifiableState().setGlobalAlpha(alpha);
611 } 611 }
612 612
613 bool CanvasRenderingContext2D::shouldAntialias() const 613 bool CanvasRenderingContext2D::shouldAntialias() const
614 { 614 {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
661 return SVGMatrixTearOff::create(state().transform()); 661 return SVGMatrixTearOff::create(state().transform());
662 } 662 }
663 663
664 void CanvasRenderingContext2D::setCurrentTransform(PassRefPtrWillBeRawPtr<SVGMat rixTearOff> passMatrixTearOff) 664 void CanvasRenderingContext2D::setCurrentTransform(PassRefPtrWillBeRawPtr<SVGMat rixTearOff> passMatrixTearOff)
665 { 665 {
666 RefPtrWillBeRawPtr<SVGMatrixTearOff> matrixTearOff = passMatrixTearOff; 666 RefPtrWillBeRawPtr<SVGMatrixTearOff> matrixTearOff = passMatrixTearOff;
667 const AffineTransform& transform = matrixTearOff->value(); 667 const AffineTransform& transform = matrixTearOff->value();
668 setTransform(transform.a(), transform.b(), transform.c(), transform.d(), tra nsform.e(), transform.f()); 668 setTransform(transform.a(), transform.b(), transform.c(), transform.d(), tra nsform.e(), transform.f());
669 } 669 }
670 670
671 void CanvasRenderingContext2D::scale(float sx, float sy) 671 void CanvasRenderingContext2D::scale(double sx, double sy)
672 { 672 {
673 SkCanvas* c = drawingCanvas(); 673 SkCanvas* c = drawingCanvas();
674 if (!c) 674 if (!c)
675 return; 675 return;
676 676
677 if (!std::isfinite(sx) || !std::isfinite(sy)) 677 if (!std::isfinite(sx) || !std::isfinite(sy))
678 return; 678 return;
679 679
680 AffineTransform newTransform = state().transform(); 680 AffineTransform newTransform = state().transform();
681 newTransform.scaleNonUniform(sx, sy); 681 newTransform.scaleNonUniform(sx, sy);
682 if (state().transform() == newTransform) 682 if (state().transform() == newTransform)
683 return; 683 return;
684 684
685 modifiableState().setTransform(newTransform); 685 modifiableState().setTransform(newTransform);
686 if (!state().isTransformInvertible()) 686 if (!state().isTransformInvertible())
687 return; 687 return;
688 688
689 c->scale(sx, sy); 689 c->scale(sx, sy);
690 m_path.transform(AffineTransform().scaleNonUniform(1.0 / sx, 1.0 / sy)); 690 m_path.transform(AffineTransform().scaleNonUniform(1.0 / sx, 1.0 / sy));
691 } 691 }
692 692
693 void CanvasRenderingContext2D::rotate(float angleInRadians) 693 void CanvasRenderingContext2D::rotate(double angleInRadians)
694 { 694 {
695 SkCanvas* c = drawingCanvas(); 695 SkCanvas* c = drawingCanvas();
696 if (!c) 696 if (!c)
697 return; 697 return;
698 698
699 if (!std::isfinite(angleInRadians)) 699 if (!std::isfinite(angleInRadians))
700 return; 700 return;
701 701
702 AffineTransform newTransform = state().transform(); 702 AffineTransform newTransform = state().transform();
703 newTransform.rotateRadians(angleInRadians); 703 newTransform.rotateRadians(angleInRadians);
704 if (state().transform() == newTransform) 704 if (state().transform() == newTransform)
705 return; 705 return;
706 706
707 modifiableState().setTransform(newTransform); 707 modifiableState().setTransform(newTransform);
708 if (!state().isTransformInvertible()) 708 if (!state().isTransformInvertible())
709 return; 709 return;
710 c->rotate(angleInRadians * (180.0f / piFloat)); 710 c->rotate(angleInRadians * (180.0 / piFloat));
711 m_path.transform(AffineTransform().rotateRadians(-angleInRadians)); 711 m_path.transform(AffineTransform().rotateRadians(-angleInRadians));
712 } 712 }
713 713
714 void CanvasRenderingContext2D::translate(float tx, float ty) 714 void CanvasRenderingContext2D::translate(double tx, double ty)
715 { 715 {
716 SkCanvas* c = drawingCanvas(); 716 SkCanvas* c = drawingCanvas();
717 if (!c) 717 if (!c)
718 return; 718 return;
719 if (!state().isTransformInvertible()) 719 if (!state().isTransformInvertible())
720 return; 720 return;
721 721
722 if (!std::isfinite(tx) || !std::isfinite(ty)) 722 if (!std::isfinite(tx) || !std::isfinite(ty))
723 return; 723 return;
724 724
725 AffineTransform newTransform = state().transform(); 725 AffineTransform newTransform = state().transform();
726 newTransform.translate(tx, ty); 726 newTransform.translate(tx, ty);
727 if (state().transform() == newTransform) 727 if (state().transform() == newTransform)
728 return; 728 return;
729 729
730 modifiableState().setTransform(newTransform); 730 modifiableState().setTransform(newTransform);
731 if (!state().isTransformInvertible()) 731 if (!state().isTransformInvertible())
732 return; 732 return;
733 c->translate(tx, ty); 733 c->translate(tx, ty);
734 m_path.transform(AffineTransform().translate(-tx, -ty)); 734 m_path.transform(AffineTransform().translate(-tx, -ty));
735 } 735 }
736 736
737 void CanvasRenderingContext2D::transform(float m11, float m12, float m21, float m22, float dx, float dy) 737 void CanvasRenderingContext2D::transform(double m11, double m12, double m21, dou ble m22, double dx, double dy)
738 { 738 {
739 SkCanvas* c = drawingCanvas(); 739 SkCanvas* c = drawingCanvas();
740 if (!c) 740 if (!c)
741 return; 741 return;
742 742
743 if (!std::isfinite(m11) || !std::isfinite(m21) || !std::isfinite(dx) || !std ::isfinite(m12) || !std::isfinite(m22) || !std::isfinite(dy)) 743 if (!std::isfinite(m11) || !std::isfinite(m21) || !std::isfinite(dx) || !std ::isfinite(m12) || !std::isfinite(m22) || !std::isfinite(dy))
744 return; 744 return;
745 745
746 AffineTransform transform(m11, m12, m21, m22, dx, dy); 746 AffineTransform transform(m11, m12, m21, m22, dx, dy);
747 AffineTransform newTransform = state().transform() * transform; 747 AffineTransform newTransform = state().transform() * transform;
(...skipping 24 matching lines...) Expand all
772 // resetTransform() resolves the non-invertible CTM state. 772 // resetTransform() resolves the non-invertible CTM state.
773 modifiableState().resetTransform(); 773 modifiableState().resetTransform();
774 c->setMatrix(affineTransformToSkMatrix(canvas()->baseTransform())); 774 c->setMatrix(affineTransformToSkMatrix(canvas()->baseTransform()));
775 775
776 if (invertibleCTM) 776 if (invertibleCTM)
777 m_path.transform(ctm); 777 m_path.transform(ctm);
778 // When else, do nothing because all transform methods didn't update m_path when CTM became non-invertible. 778 // When else, do nothing because all transform methods didn't update m_path when CTM became non-invertible.
779 // It means that resetTransform() restores m_path just before CTM became non -invertible. 779 // It means that resetTransform() restores m_path just before CTM became non -invertible.
780 } 780 }
781 781
782 void CanvasRenderingContext2D::setTransform(float m11, float m12, float m21, flo at m22, float dx, float dy) 782 void CanvasRenderingContext2D::setTransform(double m11, double m12, double m21, double m22, double dx, double dy)
783 { 783 {
784 SkCanvas* c = drawingCanvas(); 784 SkCanvas* c = drawingCanvas();
785 if (!c) 785 if (!c)
786 return; 786 return;
787 787
788 if (!std::isfinite(m11) || !std::isfinite(m21) || !std::isfinite(dx) || !std ::isfinite(m12) || !std::isfinite(m22) || !std::isfinite(dy)) 788 if (!std::isfinite(m11) || !std::isfinite(m21) || !std::isfinite(dx) || !std ::isfinite(m12) || !std::isfinite(m22) || !std::isfinite(dy))
789 return; 789 return;
790 790
791 resetTransform(); 791 resetTransform();
792 transform(m11, m12, m21, m22, dx, dy); 792 transform(m11, m12, m21, m22, dx, dy);
793 } 793 }
794 794
795 void CanvasRenderingContext2D::beginPath() 795 void CanvasRenderingContext2D::beginPath()
796 { 796 {
797 m_path.clear(); 797 m_path.clear();
798 } 798 }
799 799
800 static bool validateRectForCanvas(float& x, float& y, float& width, float& heigh t) 800 static bool validateRectForCanvas(double& x, double& y, double& width, double& h eight)
801 { 801 {
802 if (!std::isfinite(x) || !std::isfinite(y) || !std::isfinite(width) || !std: :isfinite(height)) 802 if (!std::isfinite(x) || !std::isfinite(y) || !std::isfinite(width) || !std: :isfinite(height))
803 return false; 803 return false;
804 804
805 if (!width && !height) 805 if (!width && !height)
806 return false; 806 return false;
807 807
808 if (width < 0) { 808 if (width < 0) {
809 width = -width; 809 width = -width;
810 x -= width; 810 x -= width;
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 void CanvasRenderingContext2D::stroke() 978 void CanvasRenderingContext2D::stroke()
979 { 979 {
980 drawPathInternal(m_path, CanvasRenderingContext2DState::StrokePaintType); 980 drawPathInternal(m_path, CanvasRenderingContext2DState::StrokePaintType);
981 } 981 }
982 982
983 void CanvasRenderingContext2D::stroke(Path2D* domPath) 983 void CanvasRenderingContext2D::stroke(Path2D* domPath)
984 { 984 {
985 drawPathInternal(domPath->path(), CanvasRenderingContext2DState::StrokePaint Type); 985 drawPathInternal(domPath->path(), CanvasRenderingContext2DState::StrokePaint Type);
986 } 986 }
987 987
988 void CanvasRenderingContext2D::fillRect(float x, float y, float width, float hei ght) 988 void CanvasRenderingContext2D::fillRect(double x, double y, double width, double height)
989 { 989 {
990 if (!validateRectForCanvas(x, y, width, height)) 990 if (!validateRectForCanvas(x, y, width, height))
991 return; 991 return;
992 992
993 if (!drawingCanvas()) 993 if (!drawingCanvas())
994 return; 994 return;
995 995
996 SkRect rect = SkRect::MakeXYWH(x, y, width, height); 996 SkRect rect = SkRect::MakeXYWH(x, y, width, height);
997 draw( 997 draw(
998 [&rect, this](SkCanvas* c, const SkPaint* paint) // draw lambda 998 [&rect, this](SkCanvas* c, const SkPaint* paint) // draw lambda
(...skipping 14 matching lines...) Expand all
1013 SkPath path; 1013 SkPath path;
1014 path.moveTo(rect.x(), rect.y()); 1014 path.moveTo(rect.x(), rect.y());
1015 path.lineTo(rect.maxX(), rect.maxY()); 1015 path.lineTo(rect.maxX(), rect.maxY());
1016 path.close(); 1016 path.close();
1017 canvas->drawPath(path, *paint); 1017 canvas->drawPath(path, *paint);
1018 return; 1018 return;
1019 } 1019 }
1020 canvas->drawRect(rect, *paint); 1020 canvas->drawRect(rect, *paint);
1021 } 1021 }
1022 1022
1023 void CanvasRenderingContext2D::strokeRect(float x, float y, float width, float h eight) 1023 void CanvasRenderingContext2D::strokeRect(double x, double y, double width, doub le height)
1024 { 1024 {
1025 if (!validateRectForCanvas(x, y, width, height)) 1025 if (!validateRectForCanvas(x, y, width, height))
1026 return; 1026 return;
1027 1027
1028 if (!drawingCanvas()) 1028 if (!drawingCanvas())
1029 return; 1029 return;
1030 1030
1031 SkRect rect = SkRect::MakeXYWH(x, y, width, height); 1031 SkRect rect = SkRect::MakeXYWH(x, y, width, height);
1032 FloatRect bounds = rect; 1032 FloatRect bounds = rect;
1033 inflateStrokeRect(bounds); 1033 inflateStrokeRect(bounds);
(...skipping 30 matching lines...) Expand all
1064 void CanvasRenderingContext2D::clip(const String& windingRuleString) 1064 void CanvasRenderingContext2D::clip(const String& windingRuleString)
1065 { 1065 {
1066 clipInternal(m_path, windingRuleString); 1066 clipInternal(m_path, windingRuleString);
1067 } 1067 }
1068 1068
1069 void CanvasRenderingContext2D::clip(Path2D* domPath, const String& windingRuleSt ring) 1069 void CanvasRenderingContext2D::clip(Path2D* domPath, const String& windingRuleSt ring)
1070 { 1070 {
1071 clipInternal(domPath->path(), windingRuleString); 1071 clipInternal(domPath->path(), windingRuleString);
1072 } 1072 }
1073 1073
1074 bool CanvasRenderingContext2D::isPointInPath(const float x, const float y, const String& windingRuleString) 1074 bool CanvasRenderingContext2D::isPointInPath(const double x, const double y, con st String& windingRuleString)
1075 { 1075 {
1076 return isPointInPathInternal(m_path, x, y, windingRuleString); 1076 return isPointInPathInternal(m_path, x, y, windingRuleString);
1077 } 1077 }
1078 1078
1079 bool CanvasRenderingContext2D::isPointInPath(Path2D* domPath, const float x, con st float y, const String& windingRuleString) 1079 bool CanvasRenderingContext2D::isPointInPath(Path2D* domPath, const double x, co nst double y, const String& windingRuleString)
1080 { 1080 {
1081 return isPointInPathInternal(domPath->path(), x, y, windingRuleString); 1081 return isPointInPathInternal(domPath->path(), x, y, windingRuleString);
1082 } 1082 }
1083 1083
1084 bool CanvasRenderingContext2D::isPointInPathInternal(const Path& path, const flo at x, const float y, const String& windingRuleString) 1084 bool CanvasRenderingContext2D::isPointInPathInternal(const Path& path, const dou ble x, const double y, const String& windingRuleString)
1085 { 1085 {
1086 SkCanvas* c = drawingCanvas(); 1086 SkCanvas* c = drawingCanvas();
1087 if (!c) 1087 if (!c)
1088 return false; 1088 return false;
1089 if (!state().isTransformInvertible()) 1089 if (!state().isTransformInvertible())
1090 return false; 1090 return false;
1091 1091
1092 FloatPoint point(x, y); 1092 FloatPoint point(x, y);
1093 if (!std::isfinite(point.x()) || !std::isfinite(point.y())) 1093 if (!std::isfinite(point.x()) || !std::isfinite(point.y()))
1094 return false; 1094 return false;
1095 AffineTransform ctm = state().transform(); 1095 AffineTransform ctm = state().transform();
1096 FloatPoint transformedPoint = ctm.inverse().mapPoint(point); 1096 FloatPoint transformedPoint = ctm.inverse().mapPoint(point);
1097 1097
1098 return path.contains(transformedPoint, SkFillTypeToWindRule(parseWinding(win dingRuleString))); 1098 return path.contains(transformedPoint, SkFillTypeToWindRule(parseWinding(win dingRuleString)));
1099 } 1099 }
1100 1100
1101 bool CanvasRenderingContext2D::isPointInStroke(const float x, const float y) 1101 bool CanvasRenderingContext2D::isPointInStroke(const double x, const double y)
1102 { 1102 {
1103 return isPointInStrokeInternal(m_path, x, y); 1103 return isPointInStrokeInternal(m_path, x, y);
1104 } 1104 }
1105 1105
1106 bool CanvasRenderingContext2D::isPointInStroke(Path2D* domPath, const float x, c onst float y) 1106 bool CanvasRenderingContext2D::isPointInStroke(Path2D* domPath, const double x, const double y)
1107 { 1107 {
1108 return isPointInStrokeInternal(domPath->path(), x, y); 1108 return isPointInStrokeInternal(domPath->path(), x, y);
1109 } 1109 }
1110 1110
1111 bool CanvasRenderingContext2D::isPointInStrokeInternal(const Path& path, const f loat x, const float y) 1111 bool CanvasRenderingContext2D::isPointInStrokeInternal(const Path& path, const d ouble x, const double y)
1112 { 1112 {
1113 SkCanvas* c = drawingCanvas(); 1113 SkCanvas* c = drawingCanvas();
1114 if (!c) 1114 if (!c)
1115 return false; 1115 return false;
1116 if (!state().isTransformInvertible()) 1116 if (!state().isTransformInvertible())
1117 return false; 1117 return false;
1118 1118
1119 FloatPoint point(x, y); 1119 FloatPoint point(x, y);
1120 if (!std::isfinite(point.x()) || !std::isfinite(point.y())) 1120 if (!std::isfinite(point.x()) || !std::isfinite(point.y()))
1121 return false; 1121 return false;
1122 AffineTransform ctm = state().transform(); 1122 AffineTransform ctm = state().transform();
1123 FloatPoint transformedPoint = ctm.inverse().mapPoint(point); 1123 FloatPoint transformedPoint = ctm.inverse().mapPoint(point);
1124 1124
1125 StrokeData strokeData; 1125 StrokeData strokeData;
1126 strokeData.setThickness(state().lineWidth()); 1126 strokeData.setThickness(state().lineWidth());
1127 strokeData.setLineCap(state().lineCap()); 1127 strokeData.setLineCap(state().lineCap());
1128 strokeData.setLineJoin(state().lineJoin()); 1128 strokeData.setLineJoin(state().lineJoin());
1129 strokeData.setMiterLimit(state().miterLimit()); 1129 strokeData.setMiterLimit(state().miterLimit());
1130 strokeData.setLineDash(state().lineDash(), state().lineDashOffset()); 1130 Vector<float> lineDash(state().lineDash().size());
1131 std::copy(state().lineDash().begin(), state().lineDash().end(), lineDash.beg in());
1132 strokeData.setLineDash(lineDash, state().lineDashOffset());
1131 return path.strokeContains(transformedPoint, strokeData); 1133 return path.strokeContains(transformedPoint, strokeData);
1132 } 1134 }
1133 1135
1134 void CanvasRenderingContext2D::scrollPathIntoView() 1136 void CanvasRenderingContext2D::scrollPathIntoView()
1135 { 1137 {
1136 scrollPathIntoViewInternal(m_path); 1138 scrollPathIntoViewInternal(m_path);
1137 } 1139 }
1138 1140
1139 void CanvasRenderingContext2D::scrollPathIntoView(Path2D* path2d) 1141 void CanvasRenderingContext2D::scrollPathIntoView(Path2D* path2d)
1140 { 1142 {
(...skipping 22 matching lines...) Expand all
1163 IntRect canvasRect = layoutBox->absoluteContentBox(); 1165 IntRect canvasRect = layoutBox->absoluteContentBox();
1164 pathRect.move(canvasRect.x(), canvasRect.y()); 1166 pathRect.move(canvasRect.x(), canvasRect.y());
1165 1167
1166 renderer->scrollRectToVisible( 1168 renderer->scrollRectToVisible(
1167 pathRect, ScrollAlignment::alignCenterAlways, ScrollAlignment::alignTopA lways); 1169 pathRect, ScrollAlignment::alignCenterAlways, ScrollAlignment::alignTopA lways);
1168 1170
1169 // TODO: should implement "inform the user" that the caret and/or 1171 // TODO: should implement "inform the user" that the caret and/or
1170 // selection the specified rectangle of the canvas. See http://crbug.com/357 987 1172 // selection the specified rectangle of the canvas. See http://crbug.com/357 987
1171 } 1173 }
1172 1174
1173 void CanvasRenderingContext2D::clearRect(float x, float y, float width, float he ight) 1175 void CanvasRenderingContext2D::clearRect(double x, double y, double width, doubl e height)
1174 { 1176 {
1175 if (!validateRectForCanvas(x, y, width, height)) 1177 if (!validateRectForCanvas(x, y, width, height))
1176 return; 1178 return;
1177 1179
1178 SkCanvas* c = drawingCanvas(); 1180 SkCanvas* c = drawingCanvas();
1179 if (!c) 1181 if (!c)
1180 return; 1182 return;
1181 if (!state().isTransformInvertible()) 1183 if (!state().isTransformInvertible())
1182 return; 1184 return;
1183 1185
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 if (value.isHTMLVideoElement()) 1244 if (value.isHTMLVideoElement())
1243 return value.getAsHTMLVideoElement().get(); 1245 return value.getAsHTMLVideoElement().get();
1244 if (value.isHTMLCanvasElement()) 1246 if (value.isHTMLCanvasElement())
1245 return value.getAsHTMLCanvasElement().get(); 1247 return value.getAsHTMLCanvasElement().get();
1246 if (value.isImageBitmap()) 1248 if (value.isImageBitmap())
1247 return value.getAsImageBitmap().get(); 1249 return value.getAsImageBitmap().get();
1248 ASSERT_NOT_REACHED(); 1250 ASSERT_NOT_REACHED();
1249 return nullptr; 1251 return nullptr;
1250 } 1252 }
1251 1253
1252 void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSour ce, float x, float y, ExceptionState& exceptionState) 1254 void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSour ce, double x, double y, ExceptionState& exceptionState)
1253 { 1255 {
1254 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); 1256 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
1255 FloatSize sourceRectSize = imageSourceInternal->elementSize(); 1257 FloatSize sourceRectSize = imageSourceInternal->elementSize();
1256 FloatSize destRectSize = imageSourceInternal->defaultDestinationSize(); 1258 FloatSize destRectSize = imageSourceInternal->defaultDestinationSize();
1257 drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize. height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState); 1259 drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize. height(), x, y, destRectSize.width(), destRectSize.height(), exceptionState);
1258 } 1260 }
1259 1261
1260 void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSour ce, 1262 void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSour ce,
1261 float x, float y, float width, float height, ExceptionState& exceptionState) 1263 double x, double y, double width, double height, ExceptionState& exceptionSt ate)
1262 { 1264 {
1263 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); 1265 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
1264 FloatSize sourceRectSize = imageSourceInternal->elementSize(); 1266 FloatSize sourceRectSize = imageSourceInternal->elementSize();
1265 drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize. height(), x, y, width, height, exceptionState); 1267 drawImage(imageSourceInternal, 0, 0, sourceRectSize.width(), sourceRectSize. height(), x, y, width, height, exceptionState);
1266 } 1268 }
1267 1269
1268 void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSour ce, 1270 void CanvasRenderingContext2D::drawImage(const CanvasImageSourceUnion& imageSour ce,
1269 float sx, float sy, float sw, float sh, 1271 double sx, double sy, double sw, double sh,
1270 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) 1272 double dx, double dy, double dw, double dh, ExceptionState& exceptionState)
1271 { 1273 {
1272 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource); 1274 CanvasImageSource* imageSourceInternal = toImageSourceInternal(imageSource);
1273 drawImage(imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat e); 1275 drawImage(imageSourceInternal, sx, sy, sw, sh, dx, dy, dw, dh, exceptionStat e);
1274 } 1276 }
1275 1277
1276 bool CanvasRenderingContext2D::shouldDrawImageAntialiased(const FloatRect& destR ect) const 1278 bool CanvasRenderingContext2D::shouldDrawImageAntialiased(const FloatRect& destR ect) const
1277 { 1279 {
1278 if (!shouldAntialias()) 1280 if (!shouldAntialias())
1279 return false; 1281 return false;
1280 SkCanvas* c = drawingCanvas(); 1282 SkCanvas* c = drawingCanvas();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1352 return true; 1354 return true;
1353 if (imageSource->isCanvasElement()) { 1355 if (imageSource->isCanvasElement()) {
1354 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(imageSource) ; 1356 HTMLCanvasElement* canvas = static_cast<HTMLCanvasElement*>(imageSource) ;
1355 if (canvas->isAnimated2D()) 1357 if (canvas->isAnimated2D())
1356 return true; 1358 return true;
1357 } 1359 }
1358 return false; 1360 return false;
1359 } 1361 }
1360 1362
1361 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource, 1363 void CanvasRenderingContext2D::drawImage(CanvasImageSource* imageSource,
1362 float sx, float sy, float sw, float sh, 1364 double sx, double sy, double sw, double sh,
1363 float dx, float dy, float dw, float dh, ExceptionState& exceptionState) 1365 double dx, double dy, double dw, double dh, ExceptionState& exceptionState)
1364 { 1366 {
1365 if (!drawingCanvas()) 1367 if (!drawingCanvas())
1366 return; 1368 return;
1367 1369
1368 RefPtr<Image> image; 1370 RefPtr<Image> image;
1369 SourceImageStatus sourceImageStatus = InvalidSourceImageStatus; 1371 SourceImageStatus sourceImageStatus = InvalidSourceImageStatus;
1370 if (!imageSource->isVideoElement()) { 1372 if (!imageSource->isVideoElement()) {
1371 AccelerationHint hint = canvas()->buffer()->isAccelerated() ? PreferAcce leration : PreferNoAcceleration; 1373 AccelerationHint hint = canvas()->buffer()->isAccelerated() ? PreferAcce leration : PreferNoAcceleration;
1372 image = imageSource->getSourceImageForCanvas(&sourceImageStatus, hint); 1374 image = imageSource->getSourceImageForCanvas(&sourceImageStatus, hint);
1373 if (sourceImageStatus == UndecodableSourceImageStatus) 1375 if (sourceImageStatus == UndecodableSourceImageStatus)
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1445 c->clear(m_hasAlpha ? SK_ColorTRANSPARENT : SK_ColorBLACK); 1447 c->clear(m_hasAlpha ? SK_ColorTRANSPARENT : SK_ColorBLACK);
1446 } 1448 }
1447 1449
1448 bool CanvasRenderingContext2D::rectContainsTransformedRect(const FloatRect& rect , const SkIRect& transformedRect) const 1450 bool CanvasRenderingContext2D::rectContainsTransformedRect(const FloatRect& rect , const SkIRect& transformedRect) const
1449 { 1451 {
1450 FloatQuad quad(rect); 1452 FloatQuad quad(rect);
1451 FloatQuad transformedQuad(FloatRect(transformedRect.x(), transformedRect.y() , transformedRect.width(), transformedRect.height())); 1453 FloatQuad transformedQuad(FloatRect(transformedRect.x(), transformedRect.y() , transformedRect.width(), transformedRect.height()));
1452 return state().transform().mapQuad(quad).containsQuad(transformedQuad); 1454 return state().transform().mapQuad(quad).containsQuad(transformedQuad);
1453 } 1455 }
1454 1456
1455 CanvasGradient* CanvasRenderingContext2D::createLinearGradient(float x0, float y 0, float x1, float y1) 1457 CanvasGradient* CanvasRenderingContext2D::createLinearGradient(double x0, double y0, double x1, double y1)
1456 { 1458 {
1457 CanvasGradient* gradient = CanvasGradient::create(FloatPoint(x0, y0), FloatP oint(x1, y1)); 1459 CanvasGradient* gradient = CanvasGradient::create(FloatPoint(x0, y0), FloatP oint(x1, y1));
1458 return gradient; 1460 return gradient;
1459 } 1461 }
1460 1462
1461 CanvasGradient* CanvasRenderingContext2D::createRadialGradient(float x0, float y 0, float r0, float x1, float y1, float r1, ExceptionState& exceptionState) 1463 CanvasGradient* CanvasRenderingContext2D::createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, ExceptionState& exceptionState)
1462 { 1464 {
1463 if (r0 < 0 || r1 < 0) { 1465 if (r0 < 0 || r1 < 0) {
1464 exceptionState.throwDOMException(IndexSizeError, String::format("The %s provided is less than 0.", r0 < 0 ? "r0" : "r1")); 1466 exceptionState.throwDOMException(IndexSizeError, String::format("The %s provided is less than 0.", r0 < 0 ? "r0" : "r1"));
1465 return nullptr; 1467 return nullptr;
1466 } 1468 }
1467 1469
1468 CanvasGradient* gradient = CanvasGradient::create(FloatPoint(x0, y0), r0, Fl oatPoint(x1, y1), r1); 1470 CanvasGradient* gradient = CanvasGradient::create(FloatPoint(x0, y0), r0, Fl oatPoint(x1, y1), r1);
1469 return gradient; 1471 return gradient;
1470 } 1472 }
1471 1473
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1553 if (isContextLost()) 1555 if (isContextLost())
1554 return nullptr; 1556 return nullptr;
1555 return canvas()->drawingCanvas(); 1557 return canvas()->drawingCanvas();
1556 } 1558 }
1557 1559
1558 ImageData* CanvasRenderingContext2D::createImageData(ImageData* imageData) const 1560 ImageData* CanvasRenderingContext2D::createImageData(ImageData* imageData) const
1559 { 1561 {
1560 return ImageData::create(imageData->size()); 1562 return ImageData::create(imageData->size());
1561 } 1563 }
1562 1564
1563 ImageData* CanvasRenderingContext2D::createImageData(float sw, float sh, Excepti onState& exceptionState) const 1565 ImageData* CanvasRenderingContext2D::createImageData(double sw, double sh, Excep tionState& exceptionState) const
1564 { 1566 {
1565 if (!sw || !sh) { 1567 if (!sw || !sh) {
1566 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width")); 1568 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width"));
1567 return nullptr; 1569 return nullptr;
1568 } 1570 }
1569 1571
1570 FloatSize logicalSize(fabs(sw), fabs(sh)); 1572 FloatSize logicalSize(fabs(sw), fabs(sh));
1571 if (!logicalSize.isExpressibleAsIntSize()) 1573 if (!logicalSize.isExpressibleAsIntSize())
1572 return nullptr; 1574 return nullptr;
1573 1575
1574 IntSize size = expandedIntSize(logicalSize); 1576 IntSize size = expandedIntSize(logicalSize);
1575 if (size.width() < 1) 1577 if (size.width() < 1)
1576 size.setWidth(1); 1578 size.setWidth(1);
1577 if (size.height() < 1) 1579 if (size.height() < 1)
1578 size.setHeight(1); 1580 size.setHeight(1);
1579 1581
1580 return ImageData::create(size); 1582 return ImageData::create(size);
1581 } 1583 }
1582 1584
1583 ImageData* CanvasRenderingContext2D::getImageData(float sx, float sy, float sw, float sh, ExceptionState& exceptionState) const 1585 ImageData* CanvasRenderingContext2D::getImageData(double sx, double sy, double s w, double sh, ExceptionState& exceptionState) const
1584 { 1586 {
1585 if (!canvas()->originClean()) 1587 if (!canvas()->originClean())
1586 exceptionState.throwSecurityError("The canvas has been tainted by cross- origin data."); 1588 exceptionState.throwSecurityError("The canvas has been tainted by cross- origin data.");
1587 else if (!sw || !sh) 1589 else if (!sw || !sh)
1588 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width")); 1590 exceptionState.throwDOMException(IndexSizeError, String::format("The sou rce %s is 0.", sw ? "height" : "width"));
1589 1591
1590 if (exceptionState.hadException()) 1592 if (exceptionState.hadException())
1591 return nullptr; 1593 return nullptr;
1592 1594
1593 if (sw < 0) { 1595 if (sw < 0) {
(...skipping 21 matching lines...) Expand all
1615 WTF::ArrayBufferContents contents; 1617 WTF::ArrayBufferContents contents;
1616 if (!buffer->getImageData(Unmultiplied, imageDataRect, contents)) 1618 if (!buffer->getImageData(Unmultiplied, imageDataRect, contents))
1617 return nullptr; 1619 return nullptr;
1618 1620
1619 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(contents); 1621 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(contents);
1620 return ImageData::create( 1622 return ImageData::create(
1621 imageDataRect.size(), 1623 imageDataRect.size(),
1622 DOMUint8ClampedArray::create(arrayBuffer, 0, arrayBuffer->byteLength())) ; 1624 DOMUint8ClampedArray::create(arrayBuffer, 0, arrayBuffer->byteLength())) ;
1623 } 1625 }
1624 1626
1625 void CanvasRenderingContext2D::putImageData(ImageData* data, float dx, float dy, ExceptionState& exceptionState) 1627 void CanvasRenderingContext2D::putImageData(ImageData* data, double dx, double d y, ExceptionState& exceptionState)
1626 { 1628 {
1627 putImageData(data, dx, dy, 0, 0, data->width(), data->height(), exceptionSta te); 1629 putImageData(data, dx, dy, 0, 0, data->width(), data->height(), exceptionSta te);
1628 } 1630 }
1629 1631
1630 void CanvasRenderingContext2D::putImageData(ImageData* data, float dx, float dy, float dirtyX, float dirtyY, float dirtyWidth, float dirtyHeight, ExceptionState & exceptionState) 1632 void CanvasRenderingContext2D::putImageData(ImageData* data, double dx, double d y, double dirtyX, double dirtyY, double dirtyWidth, double dirtyHeight, Exceptio nState& exceptionState)
1631 { 1633 {
1632 if (data->data()->bufferBase()->isNeutered()) { 1634 if (data->data()->bufferBase()->isNeutered()) {
1633 exceptionState.throwDOMException(InvalidStateError, "The source data has been neutered."); 1635 exceptionState.throwDOMException(InvalidStateError, "The source data has been neutered.");
1634 return; 1636 return;
1635 } 1637 }
1636 ImageBuffer* buffer = canvas()->buffer(); 1638 ImageBuffer* buffer = canvas()->buffer();
1637 if (!buffer) 1639 if (!buffer)
1638 return; 1640 return;
1639 1641
1640 if (dirtyWidth < 0) { 1642 if (dirtyWidth < 0) {
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1866 direction = CanvasRenderingContext2DState::DirectionLTR; 1868 direction = CanvasRenderingContext2DState::DirectionLTR;
1867 else 1869 else
1868 return; 1870 return;
1869 1871
1870 if (state().direction() == direction) 1872 if (state().direction() == direction)
1871 return; 1873 return;
1872 1874
1873 modifiableState().setDirection(direction); 1875 modifiableState().setDirection(direction);
1874 } 1876 }
1875 1877
1876 void CanvasRenderingContext2D::fillText(const String& text, float x, float y) 1878 void CanvasRenderingContext2D::fillText(const String& text, double x, double y)
1877 { 1879 {
1878 drawTextInternal(text, x, y, CanvasRenderingContext2DState::FillPaintType); 1880 drawTextInternal(text, x, y, CanvasRenderingContext2DState::FillPaintType);
1879 } 1881 }
1880 1882
1881 void CanvasRenderingContext2D::fillText(const String& text, float x, float y, fl oat maxWidth) 1883 void CanvasRenderingContext2D::fillText(const String& text, double x, double y, double maxWidth)
1882 { 1884 {
1883 drawTextInternal(text, x, y, CanvasRenderingContext2DState::FillPaintType, & maxWidth); 1885 drawTextInternal(text, x, y, CanvasRenderingContext2DState::FillPaintType, & maxWidth);
1884 } 1886 }
1885 1887
1886 void CanvasRenderingContext2D::strokeText(const String& text, float x, float y) 1888 void CanvasRenderingContext2D::strokeText(const String& text, double x, double y )
1887 { 1889 {
1888 drawTextInternal(text, x, y, CanvasRenderingContext2DState::StrokePaintType) ; 1890 drawTextInternal(text, x, y, CanvasRenderingContext2DState::StrokePaintType) ;
1889 } 1891 }
1890 1892
1891 void CanvasRenderingContext2D::strokeText(const String& text, float x, float y, float maxWidth) 1893 void CanvasRenderingContext2D::strokeText(const String& text, double x, double y , double maxWidth)
1892 { 1894 {
1893 drawTextInternal(text, x, y, CanvasRenderingContext2DState::StrokePaintType, &maxWidth); 1895 drawTextInternal(text, x, y, CanvasRenderingContext2DState::StrokePaintType, &maxWidth);
1894 } 1896 }
1895 1897
1896 TextMetrics* CanvasRenderingContext2D::measureText(const String& text) 1898 TextMetrics* CanvasRenderingContext2D::measureText(const String& text)
1897 { 1899 {
1898 TextMetrics* metrics = TextMetrics::create(); 1900 TextMetrics* metrics = TextMetrics::create();
1899 1901
1900 // The style resolution required for rendering text is not available in fram e-less documents. 1902 // The style resolution required for rendering text is not available in fram e-less documents.
1901 if (!canvas()->document().frame()) 1903 if (!canvas()->document().frame())
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 // between the EM box's top and bottom and the font's ascend and desc end 1935 // between the EM box's top and bottom and the font's ascend and desc end
1934 metrics->setEmHeightAscent(0); 1936 metrics->setEmHeightAscent(0);
1935 metrics->setEmHeightDescent(0); 1937 metrics->setEmHeightDescent(0);
1936 1938
1937 metrics->setHangingBaseline(-0.8f * ascent + baselineY); 1939 metrics->setHangingBaseline(-0.8f * ascent + baselineY);
1938 metrics->setAlphabeticBaseline(baselineY); 1940 metrics->setAlphabeticBaseline(baselineY);
1939 metrics->setIdeographicBaseline(descent + baselineY); 1941 metrics->setIdeographicBaseline(descent + baselineY);
1940 return metrics; 1942 return metrics;
1941 } 1943 }
1942 1944
1943 void CanvasRenderingContext2D::drawTextInternal(const String& text, float x, flo at y, CanvasRenderingContext2DState::PaintType paintType, float* maxWidth) 1945 void CanvasRenderingContext2D::drawTextInternal(const String& text, double x, do uble y, CanvasRenderingContext2DState::PaintType paintType, double* maxWidth)
1944 { 1946 {
1945 // The style resolution required for rendering text is not available in fram e-less documents. 1947 // The style resolution required for rendering text is not available in fram e-less documents.
1946 if (!canvas()->document().frame()) 1948 if (!canvas()->document().frame())
1947 return; 1949 return;
1948 1950
1949 // accessFont needs the style to be up to date, but updating style can cause script to run, 1951 // accessFont needs the style to be up to date, but updating style can cause script to run,
1950 // (e.g. due to autofocus) which can free the canvas (set size to 0, for exa mple), so update 1952 // (e.g. due to autofocus) which can free the canvas (set size to 0, for exa mple), so update
1951 // style before grabbing the drawingCanvas. 1953 // style before grabbing the drawingCanvas.
1952 canvas()->document().updateLayoutTreeForNodeIfNeeded(canvas()); 1954 canvas()->document().updateLayoutTreeForNodeIfNeeded(canvas());
1953 1955
(...skipping 13 matching lines...) Expand all
1967 1969
1968 const ComputedStyle* computedStyle = 0; 1970 const ComputedStyle* computedStyle = 0;
1969 TextDirection direction = toTextDirection(state().direction(), canvas(), &co mputedStyle); 1971 TextDirection direction = toTextDirection(state().direction(), canvas(), &co mputedStyle);
1970 bool isRTL = direction == RTL; 1972 bool isRTL = direction == RTL;
1971 bool override = computedStyle ? isOverride(computedStyle->unicodeBidi()) : f alse; 1973 bool override = computedStyle ? isOverride(computedStyle->unicodeBidi()) : f alse;
1972 1974
1973 TextRun textRun(text, 0, 0, TextRun::AllowTrailingExpansion, direction, over ride); 1975 TextRun textRun(text, 0, 0, TextRun::AllowTrailingExpansion, direction, over ride);
1974 textRun.setNormalizeSpace(true); 1976 textRun.setNormalizeSpace(true);
1975 // Draw the item text at the correct point. 1977 // Draw the item text at the correct point.
1976 FloatPoint location(x, y + getFontBaseline(fontMetrics)); 1978 FloatPoint location(x, y + getFontBaseline(fontMetrics));
1977 float fontWidth = font.width(textRun); 1979 double fontWidth = font.width(textRun);
1978 1980
1979 bool useMaxWidth = (maxWidth && *maxWidth < fontWidth); 1981 bool useMaxWidth = (maxWidth && *maxWidth < fontWidth);
1980 float width = useMaxWidth ? *maxWidth : fontWidth; 1982 double width = useMaxWidth ? *maxWidth : fontWidth;
1981 1983
1982 TextAlign align = state().textAlign(); 1984 TextAlign align = state().textAlign();
1983 if (align == StartTextAlign) 1985 if (align == StartTextAlign)
1984 align = isRTL ? RightTextAlign : LeftTextAlign; 1986 align = isRTL ? RightTextAlign : LeftTextAlign;
1985 else if (align == EndTextAlign) 1987 else if (align == EndTextAlign)
1986 align = isRTL ? LeftTextAlign : RightTextAlign; 1988 align = isRTL ? LeftTextAlign : RightTextAlign;
1987 1989
1988 switch (align) { 1990 switch (align) {
1989 case CenterTextAlign: 1991 case CenterTextAlign:
1990 location.setX(location.x() - width / 2); 1992 location.setX(location.x() - width / 2);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2024 return false; 2026 return false;
2025 }, 2027 },
2026 textRunPaintInfo.bounds, paintType); 2028 textRunPaintInfo.bounds, paintType);
2027 } 2029 }
2028 2030
2029 void CanvasRenderingContext2D::inflateStrokeRect(FloatRect& rect) const 2031 void CanvasRenderingContext2D::inflateStrokeRect(FloatRect& rect) const
2030 { 2032 {
2031 // Fast approximation of the stroke's bounding rect. 2033 // Fast approximation of the stroke's bounding rect.
2032 // This yields a slightly oversized rect but is very fast 2034 // This yields a slightly oversized rect but is very fast
2033 // compared to Path::strokeBoundingRect(). 2035 // compared to Path::strokeBoundingRect().
2034 static const float root2 = sqrtf(2); 2036 static const double root2 = sqrtf(2);
2035 float delta = state().lineWidth() / 2; 2037 double delta = state().lineWidth() / 2;
2036 if (state().lineJoin() == MiterJoin) 2038 if (state().lineJoin() == MiterJoin)
2037 delta *= state().miterLimit(); 2039 delta *= state().miterLimit();
2038 else if (state().lineCap() == SquareCap) 2040 else if (state().lineCap() == SquareCap)
2039 delta *= root2; 2041 delta *= root2;
2040 2042
2041 rect.inflate(delta); 2043 rect.inflate(delta);
2042 } 2044 }
2043 2045
2044 const Font& CanvasRenderingContext2D::accessFont() 2046 const Font& CanvasRenderingContext2D::accessFont()
2045 { 2047 {
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
2333 if (imageType == CanvasRenderingContext2DState::NonOpaqueImage) 2335 if (imageType == CanvasRenderingContext2DState::NonOpaqueImage)
2334 return; 2336 return;
2335 if (alpha < 0xFF) 2337 if (alpha < 0xFF)
2336 return; 2338 return;
2337 } 2339 }
2338 2340
2339 canvas()->buffer()->willOverwriteCanvas(); 2341 canvas()->buffer()->willOverwriteCanvas();
2340 } 2342 }
2341 2343
2342 } // namespace blink 2344 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698