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

Side by Side Diff: Source/core/html/canvas/CanvasRenderingContext2D.cpp

Issue 137353004: Add versions of stroke, fill, and clip that take a Path parameter. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add tests for null Path object passed in. Created 6 years, 10 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
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 865 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 if (windingRuleString == "nonzero") 876 if (windingRuleString == "nonzero")
877 windRule = RULE_NONZERO; 877 windRule = RULE_NONZERO;
878 else if (windingRuleString == "evenodd") 878 else if (windingRuleString == "evenodd")
879 windRule = RULE_EVENODD; 879 windRule = RULE_EVENODD;
880 else 880 else
881 return false; 881 return false;
882 882
883 return true; 883 return true;
884 } 884 }
885 885
886 void CanvasRenderingContext2D::fill(const String& windingRuleString) 886 void CanvasRenderingContext2D::fillImpl(const Path& path, const String& windingR uleString)
887 { 887 {
888 if (path.isEmpty()) {
889 return;
890 }
888 GraphicsContext* c = drawingContext(); 891 GraphicsContext* c = drawingContext();
889 if (!c) 892 if (!c)
890 return; 893 return;
891 if (!state().m_invertibleCTM) 894 if (!state().m_invertibleCTM)
892 return; 895 return;
893 FloatRect clipBounds; 896 FloatRect clipBounds;
894 if (!drawingContext()->getTransformedClipBounds(&clipBounds)) 897 if (!drawingContext()->getTransformedClipBounds(&clipBounds))
895 return; 898 return;
896 899
897 // If gradient size is zero, then paint nothing. 900 // If gradient size is zero, then paint nothing.
898 Gradient* gradient = c->fillGradient(); 901 Gradient* gradient = c->fillGradient();
899 if (gradient && gradient->isZeroSize()) 902 if (gradient && gradient->isZeroSize())
900 return; 903 return;
901 904
902 if (!m_path.isEmpty()) { 905 WindRule windRule = c->fillRule();
903 WindRule windRule = c->fillRule(); 906 WindRule newWindRule = RULE_NONZERO;
904 WindRule newWindRule = RULE_NONZERO; 907 if (!parseWinding(windingRuleString, newWindRule))
905 if (!parseWinding(windingRuleString, newWindRule)) 908 return;
906 return; 909 c->setFillRule(newWindRule);
907 c->setFillRule(newWindRule);
908 910
909 if (isFullCanvasCompositeMode(state().m_globalComposite)) { 911 if (isFullCanvasCompositeMode(state().m_globalComposite)) {
910 fullCanvasCompositedFill(m_path); 912 fullCanvasCompositedFill(path);
911 didDraw(clipBounds); 913 didDraw(clipBounds);
912 } else if (state().m_globalComposite == CompositeCopy) { 914 } else if (state().m_globalComposite == CompositeCopy) {
913 clearCanvas(); 915 clearCanvas();
914 c->fillPath(m_path); 916 c->fillPath(path);
915 didDraw(clipBounds); 917 didDraw(clipBounds);
916 } else { 918 } else {
917 FloatRect dirtyRect; 919 FloatRect dirtyRect;
918 if (computeDirtyRect(m_path.boundingRect(), clipBounds, &dirtyRect)) { 920 if (computeDirtyRect(path.boundingRect(), clipBounds, &dirtyRect)) {
919 c->fillPath(m_path); 921 c->fillPath(path);
920 didDraw(dirtyRect); 922 didDraw(dirtyRect);
921 }
922 } 923 }
924 }
923 925
924 c->setFillRule(windRule); 926 c->setFillRule(windRule);
925 }
926 } 927 }
927 928
928 void CanvasRenderingContext2D::stroke() 929 void CanvasRenderingContext2D::fill(const String& windingRuleString)
929 { 930 {
931 this->fillImpl(m_path, windingRuleString);
932 }
933
934 void CanvasRenderingContext2D::fill(DOMPath* domPath, const String& windingRuleS tring)
935 {
936 this->fillImpl(domPath->path(), windingRuleString);
937 }
938
939 void CanvasRenderingContext2D::strokeImpl(const Path& path)
940 {
941 if (path.isEmpty()) {
942 return;
943 }
930 GraphicsContext* c = drawingContext(); 944 GraphicsContext* c = drawingContext();
931 if (!c) 945 if (!c)
932 return; 946 return;
933 if (!state().m_invertibleCTM) 947 if (!state().m_invertibleCTM)
934 return; 948 return;
935 949
936 // If gradient size is zero, then paint nothing. 950 // If gradient size is zero, then paint nothing.
937 Gradient* gradient = c->strokeGradient(); 951 Gradient* gradient = c->strokeGradient();
938 if (gradient && gradient->isZeroSize()) 952 if (gradient && gradient->isZeroSize())
939 return; 953 return;
940 954
941 if (!m_path.isEmpty()) { 955 FloatRect bounds = path.boundingRect();
942 FloatRect bounds = m_path.boundingRect(); 956 inflateStrokeRect(bounds);
943 inflateStrokeRect(bounds); 957 FloatRect dirtyRect;
944 FloatRect dirtyRect; 958 if (computeDirtyRect(bounds, &dirtyRect)) {
945 if (computeDirtyRect(bounds, &dirtyRect)) { 959 c->strokePath(path);
946 c->strokePath(m_path); 960 didDraw(dirtyRect);
947 didDraw(dirtyRect);
948 }
949 } 961 }
950 } 962 }
951 963
952 void CanvasRenderingContext2D::clip(const String& windingRuleString) 964 void CanvasRenderingContext2D::stroke()
965 {
966 this->strokeImpl(m_path);
967 }
968
969 void CanvasRenderingContext2D::stroke(DOMPath* domPath)
970 {
971 this->strokeImpl(domPath->path());
972 }
973
974 void CanvasRenderingContext2D::clipImpl(const Path& path, const String& windingR uleString)
953 { 975 {
954 GraphicsContext* c = drawingContext(); 976 GraphicsContext* c = drawingContext();
955 if (!c) 977 if (!c)
956 return; 978 return;
957 if (!state().m_invertibleCTM) 979 if (!state().m_invertibleCTM)
958 return; 980 return;
959 981
960 WindRule newWindRule = RULE_NONZERO; 982 WindRule newWindRule = RULE_NONZERO;
961 if (!parseWinding(windingRuleString, newWindRule)) 983 if (!parseWinding(windingRuleString, newWindRule))
962 return; 984 return;
963 985
964 realizeSaves(); 986 realizeSaves();
965 c->canvasClip(m_path, newWindRule); 987 c->canvasClip(path, newWindRule);
988 }
989
990 void CanvasRenderingContext2D::clip(const String& windingRuleString)
991 {
992 this->clipImpl(m_path, windingRuleString);
993 }
994
995 void CanvasRenderingContext2D::clip(DOMPath* domPath, const String& windingRuleS tring)
996 {
997 this->clipImpl(domPath->path(), windingRuleString);
966 } 998 }
967 999
968 bool CanvasRenderingContext2D::isPointInPath(const float x, const float y, const String& windingRuleString) 1000 bool CanvasRenderingContext2D::isPointInPath(const float x, const float y, const String& windingRuleString)
969 { 1001 {
970 GraphicsContext* c = drawingContext(); 1002 GraphicsContext* c = drawingContext();
971 if (!c) 1003 if (!c)
972 return false; 1004 return false;
973 if (!state().m_invertibleCTM) 1005 if (!state().m_invertibleCTM)
974 return false; 1006 return false;
975 1007
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after
2427 const int focusRingWidth = 5; 2459 const int focusRingWidth = 5;
2428 const int focusRingOutline = 0; 2460 const int focusRingOutline = 0;
2429 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); 2461 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor);
2430 2462
2431 c->restore(); 2463 c->restore();
2432 2464
2433 didDraw(dirtyRect); 2465 didDraw(dirtyRect);
2434 } 2466 }
2435 2467
2436 } // namespace WebCore 2468 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698