OLD | NEW |
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 852 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 if (windingRuleString == "nonzero") | 863 if (windingRuleString == "nonzero") |
864 windRule = RULE_NONZERO; | 864 windRule = RULE_NONZERO; |
865 else if (windingRuleString == "evenodd") | 865 else if (windingRuleString == "evenodd") |
866 windRule = RULE_EVENODD; | 866 windRule = RULE_EVENODD; |
867 else | 867 else |
868 return false; | 868 return false; |
869 | 869 |
870 return true; | 870 return true; |
871 } | 871 } |
872 | 872 |
| 873 void CanvasRenderingContext2D::fillInternal(const Path& path, const String& wind
ingRuleString) |
| 874 { |
| 875 if (path.isEmpty()) { |
| 876 return; |
| 877 } |
| 878 GraphicsContext* c = drawingContext(); |
| 879 if (!c) { |
| 880 return; |
| 881 } |
| 882 if (!state().m_invertibleCTM) { |
| 883 return; |
| 884 } |
| 885 FloatRect clipBounds; |
| 886 if (!drawingContext()->getTransformedClipBounds(&clipBounds)) { |
| 887 return; |
| 888 } |
| 889 |
| 890 // If gradient size is zero, then paint nothing. |
| 891 Gradient* gradient = c->fillGradient(); |
| 892 if (gradient && gradient->isZeroSize()) { |
| 893 return; |
| 894 } |
| 895 |
| 896 WindRule windRule = c->fillRule(); |
| 897 WindRule newWindRule = RULE_NONZERO; |
| 898 if (!parseWinding(windingRuleString, newWindRule)) { |
| 899 return; |
| 900 } |
| 901 c->setFillRule(newWindRule); |
| 902 |
| 903 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
| 904 fullCanvasCompositedFill(path); |
| 905 didDraw(clipBounds); |
| 906 } else if (state().m_globalComposite == CompositeCopy) { |
| 907 clearCanvas(); |
| 908 c->fillPath(path); |
| 909 didDraw(clipBounds); |
| 910 } else { |
| 911 FloatRect dirtyRect; |
| 912 if (computeDirtyRect(path.boundingRect(), clipBounds, &dirtyRect)) { |
| 913 c->fillPath(path); |
| 914 didDraw(dirtyRect); |
| 915 } |
| 916 } |
| 917 |
| 918 c->setFillRule(windRule); |
| 919 } |
| 920 |
873 void CanvasRenderingContext2D::fill(const String& windingRuleString) | 921 void CanvasRenderingContext2D::fill(const String& windingRuleString) |
874 { | 922 { |
| 923 fillInternal(m_path, windingRuleString); |
| 924 } |
| 925 |
| 926 void CanvasRenderingContext2D::fill(DOMPath* domPath, const String& windingRuleS
tring) |
| 927 { |
| 928 fillInternal(domPath->path(), windingRuleString); |
| 929 } |
| 930 |
| 931 void CanvasRenderingContext2D::strokeInternal(const Path& path) |
| 932 { |
| 933 if (path.isEmpty()) { |
| 934 return; |
| 935 } |
875 GraphicsContext* c = drawingContext(); | 936 GraphicsContext* c = drawingContext(); |
876 if (!c) | 937 if (!c) { |
877 return; | 938 return; |
878 if (!state().m_invertibleCTM) | 939 } |
| 940 if (!state().m_invertibleCTM) { |
879 return; | 941 return; |
880 FloatRect clipBounds; | 942 } |
881 if (!drawingContext()->getTransformedClipBounds(&clipBounds)) | |
882 return; | |
883 | 943 |
884 // If gradient size is zero, then paint nothing. | 944 // If gradient size is zero, then paint nothing. |
885 Gradient* gradient = c->fillGradient(); | 945 Gradient* gradient = c->strokeGradient(); |
886 if (gradient && gradient->isZeroSize()) | 946 if (gradient && gradient->isZeroSize()) { |
887 return; | 947 return; |
| 948 } |
888 | 949 |
889 if (!m_path.isEmpty()) { | 950 FloatRect bounds = path.boundingRect(); |
890 WindRule windRule = c->fillRule(); | 951 inflateStrokeRect(bounds); |
891 WindRule newWindRule = RULE_NONZERO; | 952 FloatRect dirtyRect; |
892 if (!parseWinding(windingRuleString, newWindRule)) | 953 if (computeDirtyRect(bounds, &dirtyRect)) { |
893 return; | 954 c->strokePath(path); |
894 c->setFillRule(newWindRule); | 955 didDraw(dirtyRect); |
895 | |
896 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | |
897 fullCanvasCompositedFill(m_path); | |
898 didDraw(clipBounds); | |
899 } else if (state().m_globalComposite == CompositeCopy) { | |
900 clearCanvas(); | |
901 c->fillPath(m_path); | |
902 didDraw(clipBounds); | |
903 } else { | |
904 FloatRect dirtyRect; | |
905 if (computeDirtyRect(m_path.boundingRect(), clipBounds, &dirtyRect))
{ | |
906 c->fillPath(m_path); | |
907 didDraw(dirtyRect); | |
908 } | |
909 } | |
910 | |
911 c->setFillRule(windRule); | |
912 } | 956 } |
913 } | 957 } |
914 | 958 |
915 void CanvasRenderingContext2D::stroke() | 959 void CanvasRenderingContext2D::stroke() |
916 { | 960 { |
| 961 strokeInternal(m_path); |
| 962 } |
| 963 |
| 964 void CanvasRenderingContext2D::stroke(DOMPath* domPath) |
| 965 { |
| 966 strokeInternal(domPath->path()); |
| 967 } |
| 968 |
| 969 void CanvasRenderingContext2D::clipInternal(const Path& path, const String& wind
ingRuleString) |
| 970 { |
917 GraphicsContext* c = drawingContext(); | 971 GraphicsContext* c = drawingContext(); |
918 if (!c) | 972 if (!c) { |
919 return; | 973 return; |
920 if (!state().m_invertibleCTM) | 974 } |
| 975 if (!state().m_invertibleCTM) { |
921 return; | 976 return; |
| 977 } |
922 | 978 |
923 // If gradient size is zero, then paint nothing. | 979 WindRule newWindRule = RULE_NONZERO; |
924 Gradient* gradient = c->strokeGradient(); | 980 if (!parseWinding(windingRuleString, newWindRule)) { |
925 if (gradient && gradient->isZeroSize()) | |
926 return; | 981 return; |
| 982 } |
927 | 983 |
928 if (!m_path.isEmpty()) { | 984 realizeSaves(); |
929 FloatRect bounds = m_path.boundingRect(); | 985 c->canvasClip(path, newWindRule); |
930 inflateStrokeRect(bounds); | |
931 FloatRect dirtyRect; | |
932 if (computeDirtyRect(bounds, &dirtyRect)) { | |
933 c->strokePath(m_path); | |
934 didDraw(dirtyRect); | |
935 } | |
936 } | |
937 } | 986 } |
938 | 987 |
939 void CanvasRenderingContext2D::clip(const String& windingRuleString) | 988 void CanvasRenderingContext2D::clip(const String& windingRuleString) |
940 { | 989 { |
941 GraphicsContext* c = drawingContext(); | 990 clipInternal(m_path, windingRuleString); |
942 if (!c) | 991 } |
943 return; | |
944 if (!state().m_invertibleCTM) | |
945 return; | |
946 | 992 |
947 WindRule newWindRule = RULE_NONZERO; | 993 void CanvasRenderingContext2D::clip(DOMPath* domPath, const String& windingRuleS
tring) |
948 if (!parseWinding(windingRuleString, newWindRule)) | 994 { |
949 return; | 995 clipInternal(domPath->path(), windingRuleString); |
950 | |
951 realizeSaves(); | |
952 c->canvasClip(m_path, newWindRule); | |
953 } | 996 } |
954 | 997 |
955 bool CanvasRenderingContext2D::isPointInPath(const float x, const float y, const
String& windingRuleString) | 998 bool CanvasRenderingContext2D::isPointInPath(const float x, const float y, const
String& windingRuleString) |
956 { | 999 { |
957 GraphicsContext* c = drawingContext(); | 1000 GraphicsContext* c = drawingContext(); |
958 if (!c) | 1001 if (!c) |
959 return false; | 1002 return false; |
960 if (!state().m_invertibleCTM) | 1003 if (!state().m_invertibleCTM) |
961 return false; | 1004 return false; |
962 | 1005 |
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2392 const int focusRingWidth = 5; | 2435 const int focusRingWidth = 5; |
2393 const int focusRingOutline = 0; | 2436 const int focusRingOutline = 0; |
2394 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); | 2437 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
2395 | 2438 |
2396 c->restore(); | 2439 c->restore(); |
2397 | 2440 |
2398 didDraw(dirtyRect); | 2441 didDraw(dirtyRect); |
2399 } | 2442 } |
2400 | 2443 |
2401 } // namespace WebCore | 2444 } // namespace WebCore |
OLD | NEW |