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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 : m_unrealizedSaveCount(0) | 268 : m_unrealizedSaveCount(0) |
269 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black)) | 269 , m_strokeStyle(CanvasStyle::createFromRGBA(Color::black)) |
270 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black)) | 270 , m_fillStyle(CanvasStyle::createFromRGBA(Color::black)) |
271 , m_lineWidth(1) | 271 , m_lineWidth(1) |
272 , m_lineCap(ButtCap) | 272 , m_lineCap(ButtCap) |
273 , m_lineJoin(MiterJoin) | 273 , m_lineJoin(MiterJoin) |
274 , m_miterLimit(10) | 274 , m_miterLimit(10) |
275 , m_shadowBlur(0) | 275 , m_shadowBlur(0) |
276 , m_shadowColor(Color::transparent) | 276 , m_shadowColor(Color::transparent) |
277 , m_globalAlpha(1) | 277 , m_globalAlpha(1) |
278 , m_globalComposite(CompositeSourceOver) | 278 , m_globalComposite(SkXfermode::kSrcOver_Mode) |
279 , m_globalBlend(WebBlendModeNormal) | |
280 , m_invertibleCTM(true) | 279 , m_invertibleCTM(true) |
281 , m_lineDashOffset(0) | 280 , m_lineDashOffset(0) |
282 , m_imageSmoothingEnabled(true) | 281 , m_imageSmoothingEnabled(true) |
283 , m_textAlign(StartTextAlign) | 282 , m_textAlign(StartTextAlign) |
284 , m_textBaseline(AlphabeticTextBaseline) | 283 , m_textBaseline(AlphabeticTextBaseline) |
285 , m_direction(DirectionInherit) | 284 , m_direction(DirectionInherit) |
286 , m_unparsedFont(defaultFont) | 285 , m_unparsedFont(defaultFont) |
287 , m_realizedFont(false) | 286 , m_realizedFont(false) |
288 , m_hasClip(false) | 287 , m_hasClip(false) |
289 { | 288 { |
290 } | 289 } |
291 | 290 |
292 CanvasRenderingContext2D::State::State(const State& other, ClipListCopyMode mode
) | 291 CanvasRenderingContext2D::State::State(const State& other, ClipListCopyMode mode
) |
293 : CSSFontSelectorClient() | 292 : CSSFontSelectorClient() |
294 , m_unrealizedSaveCount(other.m_unrealizedSaveCount) | 293 , m_unrealizedSaveCount(other.m_unrealizedSaveCount) |
295 , m_unparsedStrokeColor(other.m_unparsedStrokeColor) | 294 , m_unparsedStrokeColor(other.m_unparsedStrokeColor) |
296 , m_unparsedFillColor(other.m_unparsedFillColor) | 295 , m_unparsedFillColor(other.m_unparsedFillColor) |
297 , m_strokeStyle(other.m_strokeStyle) | 296 , m_strokeStyle(other.m_strokeStyle) |
298 , m_fillStyle(other.m_fillStyle) | 297 , m_fillStyle(other.m_fillStyle) |
299 , m_lineWidth(other.m_lineWidth) | 298 , m_lineWidth(other.m_lineWidth) |
300 , m_lineCap(other.m_lineCap) | 299 , m_lineCap(other.m_lineCap) |
301 , m_lineJoin(other.m_lineJoin) | 300 , m_lineJoin(other.m_lineJoin) |
302 , m_miterLimit(other.m_miterLimit) | 301 , m_miterLimit(other.m_miterLimit) |
303 , m_shadowOffset(other.m_shadowOffset) | 302 , m_shadowOffset(other.m_shadowOffset) |
304 , m_shadowBlur(other.m_shadowBlur) | 303 , m_shadowBlur(other.m_shadowBlur) |
305 , m_shadowColor(other.m_shadowColor) | 304 , m_shadowColor(other.m_shadowColor) |
306 , m_globalAlpha(other.m_globalAlpha) | 305 , m_globalAlpha(other.m_globalAlpha) |
307 , m_globalComposite(other.m_globalComposite) | 306 , m_globalComposite(other.m_globalComposite) |
308 , m_globalBlend(other.m_globalBlend) | |
309 , m_transform(other.m_transform) | 307 , m_transform(other.m_transform) |
310 , m_invertibleCTM(other.m_invertibleCTM) | 308 , m_invertibleCTM(other.m_invertibleCTM) |
311 , m_lineDashOffset(other.m_lineDashOffset) | 309 , m_lineDashOffset(other.m_lineDashOffset) |
312 , m_imageSmoothingEnabled(other.m_imageSmoothingEnabled) | 310 , m_imageSmoothingEnabled(other.m_imageSmoothingEnabled) |
313 , m_textAlign(other.m_textAlign) | 311 , m_textAlign(other.m_textAlign) |
314 , m_textBaseline(other.m_textBaseline) | 312 , m_textBaseline(other.m_textBaseline) |
315 , m_direction(other.m_direction) | 313 , m_direction(other.m_direction) |
316 , m_unparsedFont(other.m_unparsedFont) | 314 , m_unparsedFont(other.m_unparsedFont) |
317 , m_font(other.m_font) | 315 , m_font(other.m_font) |
318 , m_realizedFont(other.m_realizedFont) | 316 , m_realizedFont(other.m_realizedFont) |
(...skipping 23 matching lines...) Expand all Loading... |
342 m_fillStyle = other.m_fillStyle; | 340 m_fillStyle = other.m_fillStyle; |
343 m_lineWidth = other.m_lineWidth; | 341 m_lineWidth = other.m_lineWidth; |
344 m_lineCap = other.m_lineCap; | 342 m_lineCap = other.m_lineCap; |
345 m_lineJoin = other.m_lineJoin; | 343 m_lineJoin = other.m_lineJoin; |
346 m_miterLimit = other.m_miterLimit; | 344 m_miterLimit = other.m_miterLimit; |
347 m_shadowOffset = other.m_shadowOffset; | 345 m_shadowOffset = other.m_shadowOffset; |
348 m_shadowBlur = other.m_shadowBlur; | 346 m_shadowBlur = other.m_shadowBlur; |
349 m_shadowColor = other.m_shadowColor; | 347 m_shadowColor = other.m_shadowColor; |
350 m_globalAlpha = other.m_globalAlpha; | 348 m_globalAlpha = other.m_globalAlpha; |
351 m_globalComposite = other.m_globalComposite; | 349 m_globalComposite = other.m_globalComposite; |
352 m_globalBlend = other.m_globalBlend; | |
353 m_transform = other.m_transform; | 350 m_transform = other.m_transform; |
354 m_invertibleCTM = other.m_invertibleCTM; | 351 m_invertibleCTM = other.m_invertibleCTM; |
355 m_imageSmoothingEnabled = other.m_imageSmoothingEnabled; | 352 m_imageSmoothingEnabled = other.m_imageSmoothingEnabled; |
356 m_textAlign = other.m_textAlign; | 353 m_textAlign = other.m_textAlign; |
357 m_textBaseline = other.m_textBaseline; | 354 m_textBaseline = other.m_textBaseline; |
358 m_direction = other.m_direction; | 355 m_direction = other.m_direction; |
359 m_unparsedFont = other.m_unparsedFont; | 356 m_unparsedFont = other.m_unparsedFont; |
360 m_font = other.m_font; | 357 m_font = other.m_font; |
361 m_realizedFont = other.m_realizedFont; | 358 m_realizedFont = other.m_realizedFont; |
362 m_hasClip = other.m_hasClip; | 359 m_hasClip = other.m_hasClip; |
(...skipping 387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 GraphicsContext* c = drawingContext(); | 747 GraphicsContext* c = drawingContext(); |
751 realizeSaves(c); | 748 realizeSaves(c); |
752 modifiableState().m_globalAlpha = alpha; | 749 modifiableState().m_globalAlpha = alpha; |
753 if (!c) | 750 if (!c) |
754 return; | 751 return; |
755 c->setAlphaAsFloat(alpha); | 752 c->setAlphaAsFloat(alpha); |
756 } | 753 } |
757 | 754 |
758 String CanvasRenderingContext2D::globalCompositeOperation() const | 755 String CanvasRenderingContext2D::globalCompositeOperation() const |
759 { | 756 { |
760 return compositeOperatorName(state().m_globalComposite, state().m_globalBlen
d); | 757 return compositeOperatorName(compositeOperatorFromSkia(state().m_globalCompo
site), blendModeFromSkia(state().m_globalComposite)); |
761 } | 758 } |
762 | 759 |
763 void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operati
on) | 760 void CanvasRenderingContext2D::setGlobalCompositeOperation(const String& operati
on) |
764 { | 761 { |
765 CompositeOperator op = CompositeSourceOver; | 762 CompositeOperator op = CompositeSourceOver; |
766 WebBlendMode blendMode = WebBlendModeNormal; | 763 WebBlendMode blendMode = WebBlendModeNormal; |
767 if (!parseCompositeAndBlendOperator(operation, op, blendMode)) | 764 if (!parseCompositeAndBlendOperator(operation, op, blendMode)) |
768 return; | 765 return; |
769 if ((state().m_globalComposite == op) && (state().m_globalBlend == blendMode
)) | 766 SkXfermode::Mode xfermode = WebCoreCompositeToSkiaComposite(op, blendMode); |
| 767 if (state().m_globalComposite == xfermode) |
770 return; | 768 return; |
771 GraphicsContext* c = drawingContext(); | 769 GraphicsContext* c = drawingContext(); |
772 realizeSaves(c); | 770 realizeSaves(c); |
773 modifiableState().m_globalComposite = op; | 771 modifiableState().m_globalComposite = xfermode; |
774 modifiableState().m_globalBlend = blendMode; | |
775 if (!c) | 772 if (!c) |
776 return; | 773 return; |
777 c->setCompositeOperation(op, blendMode); | 774 c->setCompositeOperation(xfermode); |
778 } | 775 } |
779 | 776 |
780 void CanvasRenderingContext2D::setCurrentTransform(PassRefPtrWillBeRawPtr<SVGMat
rixTearOff> passMatrixTearOff) | 777 void CanvasRenderingContext2D::setCurrentTransform(PassRefPtrWillBeRawPtr<SVGMat
rixTearOff> passMatrixTearOff) |
781 { | 778 { |
782 RefPtrWillBeRawPtr<SVGMatrixTearOff> matrixTearOff = passMatrixTearOff; | 779 RefPtrWillBeRawPtr<SVGMatrixTearOff> matrixTearOff = passMatrixTearOff; |
783 const AffineTransform& transform = matrixTearOff->value(); | 780 const AffineTransform& transform = matrixTearOff->value(); |
784 setTransform(transform.a(), transform.b(), transform.c(), transform.d(), tra
nsform.e(), transform.f()); | 781 setTransform(transform.a(), transform.b(), transform.c(), transform.d(), tra
nsform.e(), transform.f()); |
785 } | 782 } |
786 | 783 |
787 void CanvasRenderingContext2D::scale(float sx, float sy) | 784 void CanvasRenderingContext2D::scale(float sx, float sy) |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
953 } | 950 } |
954 | 951 |
955 if (height < 0) { | 952 if (height < 0) { |
956 height = -height; | 953 height = -height; |
957 y -= height; | 954 y -= height; |
958 } | 955 } |
959 | 956 |
960 return true; | 957 return true; |
961 } | 958 } |
962 | 959 |
963 static bool isFullCanvasCompositeMode(CompositeOperator op) | 960 static bool isFullCanvasCompositeMode(SkXfermode::Mode op) |
964 { | 961 { |
965 // See 4.8.11.1.3 Compositing | 962 // See 4.8.11.1.3 Compositing |
966 // CompositeSourceAtop and CompositeDestinationOut are not listed here as th
e platforms already | 963 // CompositeSourceAtop and CompositeDestinationOut are not listed here as th
e platforms already |
967 // implement the specification's behavior. | 964 // implement the specification's behavior. |
968 return op == CompositeSourceIn || op == CompositeSourceOut || op == Composit
eDestinationIn || op == CompositeDestinationAtop; | 965 return op == SkXfermode::kSrcIn_Mode || op == SkXfermode::kSrcOut_Mode || op
== SkXfermode::kDstIn_Mode || op == SkXfermode::kDstATop_Mode; |
969 } | 966 } |
970 | 967 |
971 static WindRule parseWinding(const String& windingRuleString) | 968 static WindRule parseWinding(const String& windingRuleString) |
972 { | 969 { |
973 if (windingRuleString == "nonzero") | 970 if (windingRuleString == "nonzero") |
974 return RULE_NONZERO; | 971 return RULE_NONZERO; |
975 if (windingRuleString == "evenodd") | 972 if (windingRuleString == "evenodd") |
976 return RULE_EVENODD; | 973 return RULE_EVENODD; |
977 | 974 |
978 ASSERT_NOT_REACHED(); | 975 ASSERT_NOT_REACHED(); |
(...skipping 22 matching lines...) Expand all Loading... |
1001 if (gradient && gradient->isZeroSize()) { | 998 if (gradient && gradient->isZeroSize()) { |
1002 return; | 999 return; |
1003 } | 1000 } |
1004 | 1001 |
1005 WindRule windRule = c->fillRule(); | 1002 WindRule windRule = c->fillRule(); |
1006 c->setFillRule(parseWinding(windingRuleString)); | 1003 c->setFillRule(parseWinding(windingRuleString)); |
1007 | 1004 |
1008 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1005 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1009 fullCanvasCompositedDraw(bind(&GraphicsContext::fillPath, c, path)); | 1006 fullCanvasCompositedDraw(bind(&GraphicsContext::fillPath, c, path)); |
1010 didDraw(clipBounds); | 1007 didDraw(clipBounds); |
1011 } else if (state().m_globalComposite == CompositeCopy) { | 1008 } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) { |
1012 clearCanvas(); | 1009 clearCanvas(); |
1013 c->clearShadow(); | 1010 c->clearShadow(); |
1014 c->fillPath(path); | 1011 c->fillPath(path); |
1015 applyShadow(DrawShadowAndForeground); | 1012 applyShadow(DrawShadowAndForeground); |
1016 didDraw(clipBounds); | 1013 didDraw(clipBounds); |
1017 } else { | 1014 } else { |
1018 FloatRect dirtyRect; | 1015 FloatRect dirtyRect; |
1019 if (computeDirtyRect(path.boundingRect(), clipBounds, &dirtyRect)) { | 1016 if (computeDirtyRect(path.boundingRect(), clipBounds, &dirtyRect)) { |
1020 c->fillPath(path); | 1017 c->fillPath(path); |
1021 didDraw(dirtyRect); | 1018 didDraw(dirtyRect); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1053 | 1050 |
1054 // If gradient size is zero, then paint nothing. | 1051 // If gradient size is zero, then paint nothing. |
1055 Gradient* gradient = c->strokeGradient(); | 1052 Gradient* gradient = c->strokeGradient(); |
1056 if (gradient && gradient->isZeroSize()) { | 1053 if (gradient && gradient->isZeroSize()) { |
1057 return; | 1054 return; |
1058 } | 1055 } |
1059 | 1056 |
1060 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1057 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1061 fullCanvasCompositedDraw(bind(&GraphicsContext::strokePath, c, path)); | 1058 fullCanvasCompositedDraw(bind(&GraphicsContext::strokePath, c, path)); |
1062 didDraw(clipBounds); | 1059 didDraw(clipBounds); |
1063 } else if (state().m_globalComposite == CompositeCopy) { | 1060 } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) { |
1064 clearCanvas(); | 1061 clearCanvas(); |
1065 c->clearShadow(); | 1062 c->clearShadow(); |
1066 c->strokePath(path); | 1063 c->strokePath(path); |
1067 applyShadow(DrawShadowAndForeground); | 1064 applyShadow(DrawShadowAndForeground); |
1068 didDraw(clipBounds); | 1065 didDraw(clipBounds); |
1069 } else { | 1066 } else { |
1070 FloatRect bounds = path.boundingRect(); | 1067 FloatRect bounds = path.boundingRect(); |
1071 inflateStrokeRect(bounds); | 1068 inflateStrokeRect(bounds); |
1072 FloatRect dirtyRect; | 1069 FloatRect dirtyRect; |
1073 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) { | 1070 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) { |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 saved = true; | 1232 saved = true; |
1236 context->clearShadow(); | 1233 context->clearShadow(); |
1237 } | 1234 } |
1238 if (state().m_globalAlpha != 1) { | 1235 if (state().m_globalAlpha != 1) { |
1239 if (!saved) { | 1236 if (!saved) { |
1240 context->save(); | 1237 context->save(); |
1241 saved = true; | 1238 saved = true; |
1242 } | 1239 } |
1243 context->setAlphaAsFloat(1); | 1240 context->setAlphaAsFloat(1); |
1244 } | 1241 } |
1245 if (state().m_globalComposite != CompositeSourceOver) { | 1242 if (state().m_globalComposite != SkXfermode::kSrcOver_Mode) { |
1246 if (!saved) { | 1243 if (!saved) { |
1247 context->save(); | 1244 context->save(); |
1248 saved = true; | 1245 saved = true; |
1249 } | 1246 } |
1250 context->setCompositeOperation(CompositeSourceOver); | 1247 context->setCompositeOperation(SkXfermode::kSrcOver_Mode); |
1251 } | 1248 } |
1252 context->clearRect(rect); | 1249 context->clearRect(rect); |
1253 if (m_hitRegionManager) | 1250 if (m_hitRegionManager) |
1254 m_hitRegionManager->removeHitRegionsInRect(rect, state().m_transform); | 1251 m_hitRegionManager->removeHitRegionsInRect(rect, state().m_transform); |
1255 if (saved) | 1252 if (saved) |
1256 context->restore(); | 1253 context->restore(); |
1257 | 1254 |
1258 validateStateStack(); | 1255 validateStateStack(); |
1259 didDraw(dirtyRect); | 1256 didDraw(dirtyRect); |
1260 } | 1257 } |
(...skipping 30 matching lines...) Expand all Loading... |
1291 if (gradient && gradient->isZeroSize()) | 1288 if (gradient && gradient->isZeroSize()) |
1292 return; | 1289 return; |
1293 | 1290 |
1294 FloatRect rect(x, y, width, height); | 1291 FloatRect rect(x, y, width, height); |
1295 if (rectContainsTransformedRect(rect, clipBounds)) { | 1292 if (rectContainsTransformedRect(rect, clipBounds)) { |
1296 c->fillRect(rect); | 1293 c->fillRect(rect); |
1297 didDraw(clipBounds); | 1294 didDraw(clipBounds); |
1298 } else if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1295 } else if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1299 fullCanvasCompositedDraw(bind(&fillRectOnContext, c, rect)); | 1296 fullCanvasCompositedDraw(bind(&fillRectOnContext, c, rect)); |
1300 didDraw(clipBounds); | 1297 didDraw(clipBounds); |
1301 } else if (state().m_globalComposite == CompositeCopy) { | 1298 } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) { |
1302 clearCanvas(); | 1299 clearCanvas(); |
1303 c->clearShadow(); | 1300 c->clearShadow(); |
1304 c->fillRect(rect); | 1301 c->fillRect(rect); |
1305 applyShadow(DrawShadowAndForeground); | 1302 applyShadow(DrawShadowAndForeground); |
1306 didDraw(clipBounds); | 1303 didDraw(clipBounds); |
1307 } else { | 1304 } else { |
1308 FloatRect dirtyRect; | 1305 FloatRect dirtyRect; |
1309 if (computeDirtyRect(rect, clipBounds, &dirtyRect)) { | 1306 if (computeDirtyRect(rect, clipBounds, &dirtyRect)) { |
1310 c->fillRect(rect); | 1307 c->fillRect(rect); |
1311 didDraw(dirtyRect); | 1308 didDraw(dirtyRect); |
(...skipping 20 matching lines...) Expand all Loading... |
1332 | 1329 |
1333 // If gradient size is zero, then paint nothing. | 1330 // If gradient size is zero, then paint nothing. |
1334 Gradient* gradient = c->strokeGradient(); | 1331 Gradient* gradient = c->strokeGradient(); |
1335 if (gradient && gradient->isZeroSize()) | 1332 if (gradient && gradient->isZeroSize()) |
1336 return; | 1333 return; |
1337 | 1334 |
1338 FloatRect rect(x, y, width, height); | 1335 FloatRect rect(x, y, width, height); |
1339 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 1336 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1340 fullCanvasCompositedDraw(bind(&strokeRectOnContext, c, rect)); | 1337 fullCanvasCompositedDraw(bind(&strokeRectOnContext, c, rect)); |
1341 didDraw(clipBounds); | 1338 didDraw(clipBounds); |
1342 } else if (state().m_globalComposite == CompositeCopy) { | 1339 } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) { |
1343 clearCanvas(); | 1340 clearCanvas(); |
1344 c->clearShadow(); | 1341 c->clearShadow(); |
1345 c->strokeRect(rect); | 1342 c->strokeRect(rect); |
1346 applyShadow(DrawShadowAndForeground); | 1343 applyShadow(DrawShadowAndForeground); |
1347 didDraw(clipBounds); | 1344 didDraw(clipBounds); |
1348 } else { | 1345 } else { |
1349 FloatRect boundingRect = rect; | 1346 FloatRect boundingRect = rect; |
1350 boundingRect.inflate(state().m_lineWidth / 2); | 1347 boundingRect.inflate(state().m_lineWidth / 2); |
1351 FloatRect dirtyRect; | 1348 FloatRect dirtyRect; |
1352 if (computeDirtyRect(boundingRect, clipBounds, &dirtyRect)) { | 1349 if (computeDirtyRect(boundingRect, clipBounds, &dirtyRect)) { |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1506 canvas()->buffer()->willDrawVideo(); | 1503 canvas()->buffer()->willDrawVideo(); |
1507 | 1504 |
1508 // FIXME: crbug.com/447218 | 1505 // FIXME: crbug.com/447218 |
1509 // We make the destination canvas fall out of display list mode by calling | 1506 // We make the destination canvas fall out of display list mode by calling |
1510 // willAccessPixels. This is to prevent run-away memory consumption caused b
y SkSurface | 1507 // willAccessPixels. This is to prevent run-away memory consumption caused b
y SkSurface |
1511 // copyOnWrite when the source canvas is animated and consumed at a rate hig
her than the | 1508 // copyOnWrite when the source canvas is animated and consumed at a rate hig
her than the |
1512 // presentation frame rate of the destination canvas. | 1509 // presentation frame rate of the destination canvas. |
1513 if (imageSource->isCanvasElement()) | 1510 if (imageSource->isCanvasElement()) |
1514 canvas()->buffer()->willAccessPixels(); | 1511 canvas()->buffer()->willAccessPixels(); |
1515 | 1512 |
1516 CompositeOperator op = state().m_globalComposite; | |
1517 if (rectContainsTransformedRect(dstRect, clipBounds)) { | 1513 if (rectContainsTransformedRect(dstRect, clipBounds)) { |
1518 drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect); | 1514 drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect); |
1519 didDraw(clipBounds); | 1515 didDraw(clipBounds); |
1520 } else if (isFullCanvasCompositeMode(op)) { | 1516 } else if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
1521 fullCanvasCompositedDraw(bind(&drawImageOnContext, c, imageSource, image
.get(), srcRect, dstRect)); | 1517 fullCanvasCompositedDraw(bind(&drawImageOnContext, c, imageSource, image
.get(), srcRect, dstRect)); |
1522 didDraw(clipBounds); | 1518 didDraw(clipBounds); |
1523 } else if (op == CompositeCopy) { | 1519 } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) { |
1524 clearCanvas(); | 1520 clearCanvas(); |
1525 drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect); | 1521 drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect); |
1526 didDraw(clipBounds); | 1522 didDraw(clipBounds); |
1527 } else { | 1523 } else { |
1528 FloatRect dirtyRect; | 1524 FloatRect dirtyRect; |
1529 if (computeDirtyRect(dstRect, clipBounds, &dirtyRect)) { | 1525 if (computeDirtyRect(dstRect, clipBounds, &dirtyRect)) { |
1530 drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect); | 1526 drawImageOnContext(c, imageSource, image.get(), srcRect, dstRect); |
1531 didDraw(dirtyRect); | 1527 didDraw(dirtyRect); |
1532 } | 1528 } |
1533 } | 1529 } |
(...skipping 26 matching lines...) Expand all Loading... |
1560 return state().m_transform.mapQuad(quad).containsQuad(transformedQuad); | 1556 return state().m_transform.mapQuad(quad).containsQuad(transformedQuad); |
1561 } | 1557 } |
1562 | 1558 |
1563 void CanvasRenderingContext2D::fullCanvasCompositedDraw(PassOwnPtr<Closure> draw
) | 1559 void CanvasRenderingContext2D::fullCanvasCompositedDraw(PassOwnPtr<Closure> draw
) |
1564 { | 1560 { |
1565 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); | 1561 ASSERT(isFullCanvasCompositeMode(state().m_globalComposite)); |
1566 | 1562 |
1567 GraphicsContext* c = drawingContext(); | 1563 GraphicsContext* c = drawingContext(); |
1568 ASSERT(c); | 1564 ASSERT(c); |
1569 | 1565 |
1570 CompositeOperator previousOperator = c->compositeOperation(); | |
1571 if (shouldDrawShadows()) { | 1566 if (shouldDrawShadows()) { |
1572 // unroll into two independently composited passes if drawing shadows | 1567 // unroll into two independently composited passes if drawing shadows |
1573 c->beginLayer(1, state().m_globalComposite); | 1568 c->beginLayer(1, state().m_globalComposite); |
1574 c->setCompositeOperation(CompositeSourceOver); | 1569 c->setCompositeOperation(SkXfermode::kSrcOver_Mode); |
1575 applyShadow(DrawShadowOnly); | 1570 applyShadow(DrawShadowOnly); |
1576 (*draw)(); | 1571 (*draw)(); |
1577 c->setCompositeOperation(previousOperator); | 1572 c->setCompositeOperation(state().m_globalComposite); |
1578 c->endLayer(); | 1573 c->endLayer(); |
1579 } | 1574 } |
1580 | 1575 |
1581 c->beginLayer(1, state().m_globalComposite); | 1576 c->beginLayer(1, state().m_globalComposite); |
1582 c->clearShadow(); | 1577 c->clearShadow(); |
1583 c->setCompositeOperation(CompositeSourceOver); | 1578 c->setCompositeOperation(SkXfermode::kSrcOver_Mode); |
1584 (*draw)(); | 1579 (*draw)(); |
1585 c->setCompositeOperation(previousOperator); | 1580 c->setCompositeOperation(state().m_globalComposite); |
1586 c->endLayer(); | 1581 c->endLayer(); |
1587 applyShadow(DrawShadowAndForeground); // go back to normal shadows mode | 1582 applyShadow(DrawShadowAndForeground); // go back to normal shadows mode |
1588 } | 1583 } |
1589 | 1584 |
1590 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGra
dient(float x0, float y0, float x1, float y1) | 1585 PassRefPtrWillBeRawPtr<CanvasGradient> CanvasRenderingContext2D::createLinearGra
dient(float x0, float y0, float x1, float y1) |
1591 { | 1586 { |
1592 RefPtrWillBeRawPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPo
int(x0, y0), FloatPoint(x1, y1)); | 1587 RefPtrWillBeRawPtr<CanvasGradient> gradient = CanvasGradient::create(FloatPo
int(x0, y0), FloatPoint(x1, y1)); |
1593 return gradient.release(); | 1588 return gradient.release(); |
1594 } | 1589 } |
1595 | 1590 |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2139 } | 2134 } |
2140 | 2135 |
2141 FloatRect clipBounds; | 2136 FloatRect clipBounds; |
2142 if (!c->getTransformedClipBounds(&clipBounds)) { | 2137 if (!c->getTransformedClipBounds(&clipBounds)) { |
2143 return; | 2138 return; |
2144 } | 2139 } |
2145 | 2140 |
2146 if (isFullCanvasCompositeMode(state().m_globalComposite)) { | 2141 if (isFullCanvasCompositeMode(state().m_globalComposite)) { |
2147 fullCanvasCompositedDraw(bind(&GraphicsContext::drawBidiText, c, font, t
extRunPaintInfo, location, Font::UseFallbackIfFontNotReady)); | 2142 fullCanvasCompositedDraw(bind(&GraphicsContext::drawBidiText, c, font, t
extRunPaintInfo, location, Font::UseFallbackIfFontNotReady)); |
2148 didDraw(clipBounds); | 2143 didDraw(clipBounds); |
2149 } else if (state().m_globalComposite == CompositeCopy) { | 2144 } else if (state().m_globalComposite == SkXfermode::kSrc_Mode) { |
2150 clearCanvas(); | 2145 clearCanvas(); |
2151 c->clearShadow(); | 2146 c->clearShadow(); |
2152 c->drawBidiText(font, textRunPaintInfo, location, Font::UseFallbackIfFon
tNotReady); | 2147 c->drawBidiText(font, textRunPaintInfo, location, Font::UseFallbackIfFon
tNotReady); |
2153 applyShadow(DrawShadowAndForeground); | 2148 applyShadow(DrawShadowAndForeground); |
2154 didDraw(clipBounds); | 2149 didDraw(clipBounds); |
2155 } else { | 2150 } else { |
2156 FloatRect dirtyRect; | 2151 FloatRect dirtyRect; |
2157 if (computeDirtyRect(textRunPaintInfo.bounds, clipBounds, &dirtyRect)) { | 2152 if (computeDirtyRect(textRunPaintInfo.bounds, clipBounds, &dirtyRect)) { |
2158 c->drawBidiText(font, textRunPaintInfo, location, Font::UseFallbackI
fFontNotReady); | 2153 c->drawBidiText(font, textRunPaintInfo, location, Font::UseFallbackI
fFontNotReady); |
2159 didDraw(dirtyRect); | 2154 didDraw(dirtyRect); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2291 StrokeData strokeData; | 2286 StrokeData strokeData; |
2292 strokeData.setThickness(focusRingWidth); | 2287 strokeData.setThickness(focusRingWidth); |
2293 | 2288 |
2294 FloatRect dirtyRect; | 2289 FloatRect dirtyRect; |
2295 if (!computeDirtyRect(path.strokeBoundingRect(strokeData), &dirtyRect)) | 2290 if (!computeDirtyRect(path.strokeBoundingRect(strokeData), &dirtyRect)) |
2296 return; | 2291 return; |
2297 | 2292 |
2298 c->save(); | 2293 c->save(); |
2299 c->setAlphaAsFloat(1.0); | 2294 c->setAlphaAsFloat(1.0); |
2300 c->clearShadow(); | 2295 c->clearShadow(); |
2301 c->setCompositeOperation(CompositeSourceOver, WebBlendModeNormal); | 2296 c->setCompositeOperation(SkXfermode::kSrcOver_Mode); |
2302 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); | 2297 c->drawFocusRing(path, focusRingWidth, focusRingOutline, focusRingColor); |
2303 c->restore(); | 2298 c->restore(); |
2304 validateStateStack(); | 2299 validateStateStack(); |
2305 didDraw(dirtyRect); | 2300 didDraw(dirtyRect); |
2306 } | 2301 } |
2307 | 2302 |
2308 void CanvasRenderingContext2D::addHitRegion(const HitRegionOptions& options, Exc
eptionState& exceptionState) | 2303 void CanvasRenderingContext2D::addHitRegion(const HitRegionOptions& options, Exc
eptionState& exceptionState) |
2309 { | 2304 { |
2310 if (options.id().isEmpty() && !options.control()) { | 2305 if (options.id().isEmpty() && !options.control()) { |
2311 exceptionState.throwDOMException(NotSupportedError, "Both id and control
are null."); | 2306 exceptionState.throwDOMException(NotSupportedError, "Both id and control
are null."); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2367 | 2362 |
2368 unsigned CanvasRenderingContext2D::hitRegionsCount() const | 2363 unsigned CanvasRenderingContext2D::hitRegionsCount() const |
2369 { | 2364 { |
2370 if (m_hitRegionManager) | 2365 if (m_hitRegionManager) |
2371 return m_hitRegionManager->getHitRegionsCount(); | 2366 return m_hitRegionManager->getHitRegionsCount(); |
2372 | 2367 |
2373 return 0; | 2368 return 0; |
2374 } | 2369 } |
2375 | 2370 |
2376 } // namespace blink | 2371 } // namespace blink |
OLD | NEW |