| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BaseRenderingContext2D_h | 5 #ifndef BaseRenderingContext2D_h |
| 6 #define BaseRenderingContext2D_h | 6 #define BaseRenderingContext2D_h |
| 7 | 7 |
| 8 #include "bindings/modules/v8/CSSImageValueOrHTMLImageElementOrHTMLVideoElementO
rHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h" | 8 #include "bindings/modules/v8/CSSImageValueOrHTMLImageElementOrHTMLVideoElementO
rHTMLCanvasElementOrImageBitmapOrOffscreenCanvas.h" |
| 9 #include "bindings/modules/v8/StringOrCanvasGradientOrCanvasPattern.h" | 9 #include "bindings/modules/v8/StringOrCanvasGradientOrCanvasPattern.h" |
| 10 #include "core/html/ImageData.h" | 10 #include "core/html/ImageData.h" |
| 11 #include "modules/ModulesExport.h" | 11 #include "modules/ModulesExport.h" |
| 12 #include "modules/canvas2d/CanvasGradient.h" | 12 #include "modules/canvas2d/CanvasGradient.h" |
| 13 #include "modules/canvas2d/CanvasPathMethods.h" | 13 #include "modules/canvas2d/CanvasPathMethods.h" |
| 14 #include "modules/canvas2d/CanvasRenderingContext2DState.h" | 14 #include "modules/canvas2d/CanvasRenderingContext2DState.h" |
| 15 #include "modules/canvas2d/CanvasStyle.h" | 15 #include "modules/canvas2d/CanvasStyle.h" |
| 16 #include "platform/graphics/ExpensiveCanvasHeuristicParameters.h" | 16 #include "platform/graphics/ExpensiveCanvasHeuristicParameters.h" |
| 17 #include "skia/ext/cdl_canvas.h" |
| 17 #include "third_party/skia/include/core/SkCanvas.h" | 18 #include "third_party/skia/include/core/SkCanvas.h" |
| 18 #include "third_party/skia/include/effects/SkComposeImageFilter.h" | 19 #include "third_party/skia/include/effects/SkComposeImageFilter.h" |
| 19 | 20 |
| 20 namespace blink { | 21 namespace blink { |
| 21 | 22 |
| 22 class CanvasImageSource; | 23 class CanvasImageSource; |
| 23 class Color; | 24 class Color; |
| 24 class Image; | 25 class Image; |
| 25 class ImageBuffer; | 26 class ImageBuffer; |
| 26 class Path2D; | 27 class Path2D; |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 | 215 |
| 215 virtual int width() const = 0; | 216 virtual int width() const = 0; |
| 216 virtual int height() const = 0; | 217 virtual int height() const = 0; |
| 217 | 218 |
| 218 virtual bool hasImageBuffer() const = 0; | 219 virtual bool hasImageBuffer() const = 0; |
| 219 virtual ImageBuffer* imageBuffer() const = 0; | 220 virtual ImageBuffer* imageBuffer() const = 0; |
| 220 | 221 |
| 221 virtual bool parseColorOrCurrentColor(Color&, | 222 virtual bool parseColorOrCurrentColor(Color&, |
| 222 const String& colorString) const = 0; | 223 const String& colorString) const = 0; |
| 223 | 224 |
| 224 virtual SkCanvas* drawingCanvas() const = 0; | 225 virtual CdlCanvas* drawingCanvas() const = 0; |
| 225 virtual SkCanvas* existingDrawingCanvas() const = 0; | 226 virtual CdlCanvas* existingDrawingCanvas() const = 0; |
| 226 virtual void disableDeferral(DisableDeferralReason) = 0; | 227 virtual void disableDeferral(DisableDeferralReason) = 0; |
| 227 | 228 |
| 228 virtual AffineTransform baseTransform() const = 0; | 229 virtual AffineTransform baseTransform() const = 0; |
| 229 | 230 |
| 230 virtual void didDraw(const SkIRect& dirtyRect) = 0; | 231 virtual void didDraw(const SkIRect& dirtyRect) = 0; |
| 231 | 232 |
| 232 virtual bool stateHasFilter() = 0; | 233 virtual bool stateHasFilter() = 0; |
| 233 virtual sk_sp<SkImageFilter> stateGetFilter() = 0; | 234 virtual sk_sp<SkImageFilter> stateGetFilter() = 0; |
| 234 virtual void snapshotStateForFilter() = 0; | 235 virtual void snapshotStateForFilter() = 0; |
| 235 | 236 |
| 236 virtual void validateStateStack() const = 0; | 237 virtual void validateStateStack() const = 0; |
| 237 | 238 |
| 238 virtual bool hasAlpha() const = 0; | 239 virtual bool hasAlpha() const = 0; |
| 239 | 240 |
| 240 virtual bool isContextLost() const = 0; | 241 virtual bool isContextLost() const = 0; |
| 241 | 242 |
| 242 void restoreMatrixClipStack(SkCanvas*) const; | 243 void restoreMatrixClipStack(CdlCanvas*) const; |
| 243 | 244 |
| 244 DECLARE_VIRTUAL_TRACE(); | 245 DECLARE_VIRTUAL_TRACE(); |
| 245 | 246 |
| 246 enum DrawCallType { | 247 enum DrawCallType { |
| 247 StrokePath = 0, | 248 StrokePath = 0, |
| 248 FillPath, | 249 FillPath, |
| 249 DrawVectorImage, | 250 DrawVectorImage, |
| 250 DrawBitmapImage, | 251 DrawBitmapImage, |
| 251 FillText, | 252 FillText, |
| 252 StrokeText, | 253 StrokeText, |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 void inflateStrokeRect(FloatRect&) const; | 316 void inflateStrokeRect(FloatRect&) const; |
| 316 | 317 |
| 317 void unwindStateStack(); | 318 void unwindStateStack(); |
| 318 | 319 |
| 319 enum DrawType { | 320 enum DrawType { |
| 320 ClipFill, // Fill that is already known to cover the current clip | 321 ClipFill, // Fill that is already known to cover the current clip |
| 321 UntransformedUnclippedFill | 322 UntransformedUnclippedFill |
| 322 }; | 323 }; |
| 323 | 324 |
| 324 void checkOverdraw(const SkRect&, | 325 void checkOverdraw(const SkRect&, |
| 325 const SkPaint*, | 326 const CdlPaint*, |
| 326 CanvasRenderingContext2DState::ImageType, | 327 CanvasRenderingContext2DState::ImageType, |
| 327 DrawType); | 328 DrawType); |
| 328 | 329 |
| 329 HeapVector<Member<CanvasRenderingContext2DState>> m_stateStack; | 330 HeapVector<Member<CanvasRenderingContext2DState>> m_stateStack; |
| 330 AntiAliasingMode m_clipAntialiasing; | 331 AntiAliasingMode m_clipAntialiasing; |
| 331 | 332 |
| 332 void trackDrawCall(DrawCallType, | 333 void trackDrawCall(DrawCallType, |
| 333 Path2D* path2d = nullptr, | 334 Path2D* path2d = nullptr, |
| 334 int width = 0, | 335 int width = 0, |
| 335 int height = 0); | 336 int height = 0); |
| 336 | 337 |
| 337 mutable UsageCounters m_usageCounters; | 338 mutable UsageCounters m_usageCounters; |
| 338 | 339 |
| 339 float estimateRenderingCost( | 340 float estimateRenderingCost( |
| 340 ExpensiveCanvasHeuristicParameters::RenderingModeCostIndex) const; | 341 ExpensiveCanvasHeuristicParameters::RenderingModeCostIndex) const; |
| 341 | 342 |
| 342 private: | 343 private: |
| 343 void realizeSaves(); | 344 void realizeSaves(); |
| 344 | 345 |
| 345 bool shouldDrawImageAntialiased(const FloatRect& destRect) const; | 346 bool shouldDrawImageAntialiased(const FloatRect& destRect) const; |
| 346 | 347 |
| 347 void drawPathInternal(const Path&, | 348 void drawPathInternal(const Path&, |
| 348 CanvasRenderingContext2DState::PaintType, | 349 CanvasRenderingContext2DState::PaintType, |
| 349 SkPath::FillType = SkPath::kWinding_FillType); | 350 SkPath::FillType = SkPath::kWinding_FillType); |
| 350 void drawImageInternal(SkCanvas*, | 351 void drawImageInternal(CdlCanvas*, |
| 351 CanvasImageSource*, | 352 CanvasImageSource*, |
| 352 Image*, | 353 Image*, |
| 353 const FloatRect& srcRect, | 354 const FloatRect& srcRect, |
| 354 const FloatRect& dstRect, | 355 const FloatRect& dstRect, |
| 355 const SkPaint*); | 356 const CdlPaint*); |
| 356 void clipInternal(const Path&, const String& windingRuleString); | 357 void clipInternal(const Path&, const String& windingRuleString); |
| 357 | 358 |
| 358 bool isPointInPathInternal(const Path&, | 359 bool isPointInPathInternal(const Path&, |
| 359 const double x, | 360 const double x, |
| 360 const double y, | 361 const double y, |
| 361 const String& windingRuleString); | 362 const String& windingRuleString); |
| 362 bool isPointInStrokeInternal(const Path&, const double x, const double y); | 363 bool isPointInStrokeInternal(const Path&, const double x, const double y); |
| 363 | 364 |
| 364 static bool isFullCanvasCompositeMode(SkBlendMode); | 365 static bool isFullCanvasCompositeMode(SkBlendMode); |
| 365 | 366 |
| 366 template <typename DrawFunc> | 367 template <typename DrawFunc> |
| 367 void compositedDraw(const DrawFunc&, | 368 void compositedDraw(const DrawFunc&, |
| 368 SkCanvas*, | 369 CdlCanvas*, |
| 369 CanvasRenderingContext2DState::PaintType, | 370 CanvasRenderingContext2DState::PaintType, |
| 370 CanvasRenderingContext2DState::ImageType); | 371 CanvasRenderingContext2DState::ImageType); |
| 371 | 372 |
| 372 void clearCanvas(); | 373 void clearCanvas(); |
| 373 bool rectContainsTransformedRect(const FloatRect&, const SkIRect&) const; | 374 bool rectContainsTransformedRect(const FloatRect&, const SkIRect&) const; |
| 374 }; | 375 }; |
| 375 | 376 |
| 376 template <typename DrawFunc, typename ContainsFunc> | 377 template <typename DrawFunc, typename ContainsFunc> |
| 377 bool BaseRenderingContext2D::draw( | 378 bool BaseRenderingContext2D::draw( |
| 378 const DrawFunc& drawFunc, | 379 const DrawFunc& drawFunc, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 394 if (gradient && gradient->getGradient()->isZeroSize()) | 395 if (gradient && gradient->getGradient()->isZeroSize()) |
| 395 return false; | 396 return false; |
| 396 } | 397 } |
| 397 | 398 |
| 398 if (isFullCanvasCompositeMode(state().globalComposite()) || | 399 if (isFullCanvasCompositeMode(state().globalComposite()) || |
| 399 stateHasFilter()) { | 400 stateHasFilter()) { |
| 400 compositedDraw(drawFunc, drawingCanvas(), paintType, imageType); | 401 compositedDraw(drawFunc, drawingCanvas(), paintType, imageType); |
| 401 didDraw(clipBounds); | 402 didDraw(clipBounds); |
| 402 } else if (state().globalComposite() == SkBlendMode::kSrc) { | 403 } else if (state().globalComposite() == SkBlendMode::kSrc) { |
| 403 clearCanvas(); // takes care of checkOverdraw() | 404 clearCanvas(); // takes care of checkOverdraw() |
| 404 const SkPaint* paint = | 405 const CdlPaint* paint = |
| 405 state().getPaint(paintType, DrawForegroundOnly, imageType); | 406 state().getPaint(paintType, DrawForegroundOnly, imageType); |
| 406 drawFunc(drawingCanvas(), paint); | 407 drawFunc(drawingCanvas(), paint); |
| 407 didDraw(clipBounds); | 408 didDraw(clipBounds); |
| 408 } else { | 409 } else { |
| 409 SkIRect dirtyRect; | 410 SkIRect dirtyRect; |
| 410 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) { | 411 if (computeDirtyRect(bounds, clipBounds, &dirtyRect)) { |
| 411 const SkPaint* paint = | 412 const CdlPaint* paint = |
| 412 state().getPaint(paintType, DrawShadowAndForeground, imageType); | 413 state().getPaint(paintType, DrawShadowAndForeground, imageType); |
| 413 if (paintType != CanvasRenderingContext2DState::StrokePaintType && | 414 if (paintType != CanvasRenderingContext2DState::StrokePaintType && |
| 414 drawCoversClipBounds(clipBounds)) | 415 drawCoversClipBounds(clipBounds)) |
| 415 checkOverdraw(bounds, paint, imageType, ClipFill); | 416 checkOverdraw(bounds, paint, imageType, ClipFill); |
| 416 drawFunc(drawingCanvas(), paint); | 417 drawFunc(drawingCanvas(), paint); |
| 417 didDraw(dirtyRect); | 418 didDraw(dirtyRect); |
| 418 } | 419 } |
| 419 } | 420 } |
| 420 return true; | 421 return true; |
| 421 } | 422 } |
| 422 | 423 |
| 423 template <typename DrawFunc> | 424 template <typename DrawFunc> |
| 424 void BaseRenderingContext2D::compositedDraw( | 425 void BaseRenderingContext2D::compositedDraw( |
| 425 const DrawFunc& drawFunc, | 426 const DrawFunc& drawFunc, |
| 426 SkCanvas* c, | 427 CdlCanvas* c, |
| 427 CanvasRenderingContext2DState::PaintType paintType, | 428 CanvasRenderingContext2DState::PaintType paintType, |
| 428 CanvasRenderingContext2DState::ImageType imageType) { | 429 CanvasRenderingContext2DState::ImageType imageType) { |
| 429 sk_sp<SkImageFilter> filter = stateGetFilter(); | 430 sk_sp<SkImageFilter> filter = stateGetFilter(); |
| 430 ASSERT(isFullCanvasCompositeMode(state().globalComposite()) || filter); | 431 ASSERT(isFullCanvasCompositeMode(state().globalComposite()) || filter); |
| 431 SkMatrix ctm = c->getTotalMatrix(); | 432 SkMatrix ctm = c->getTotalMatrix(); |
| 432 c->resetMatrix(); | 433 c->resetMatrix(); |
| 433 SkPaint compositePaint; | 434 CdlPaint compositePaint; |
| 434 compositePaint.setBlendMode((SkBlendMode)state().globalComposite()); | 435 compositePaint.setBlendMode((SkBlendMode)state().globalComposite()); |
| 435 if (state().shouldDrawShadows()) { | 436 if (state().shouldDrawShadows()) { |
| 436 // unroll into two independently composited passes if drawing shadows | 437 // unroll into two independently composited passes if drawing shadows |
| 437 SkPaint shadowPaint = | 438 CdlPaint shadowPaint = |
| 438 *state().getPaint(paintType, DrawShadowOnly, imageType); | 439 *state().getPaint(paintType, DrawShadowOnly, imageType); |
| 439 int saveCount = c->getSaveCount(); | 440 int saveCount = c->getSaveCount(); |
| 440 if (filter) { | 441 if (filter) { |
| 441 SkPaint foregroundPaint = | 442 CdlPaint foregroundPaint = |
| 442 *state().getPaint(paintType, DrawForegroundOnly, imageType); | 443 *state().getPaint(paintType, DrawForegroundOnly, imageType); |
| 443 sk_sp<SkImageFilter> composedFilter = | 444 sk_sp<SkImageFilter> composedFilter = |
| 444 sk_ref_sp(foregroundPaint.getImageFilter()); | 445 sk_ref_sp(foregroundPaint.getImageFilter()); |
| 445 composedFilter = SkComposeImageFilter::Make( | 446 composedFilter = SkComposeImageFilter::Make( |
| 446 std::move(composedFilter), sk_ref_sp(shadowPaint.getImageFilter())); | 447 std::move(composedFilter), sk_ref_sp(shadowPaint.getImageFilter())); |
| 447 composedFilter = | 448 composedFilter = |
| 448 SkComposeImageFilter::Make(std::move(composedFilter), filter); | 449 SkComposeImageFilter::Make(std::move(composedFilter), filter); |
| 449 foregroundPaint.setImageFilter(std::move(composedFilter)); | 450 foregroundPaint.setImageFilter(std::move(composedFilter)); |
| 450 c->setMatrix(ctm); | 451 c->setMatrix(ctm); |
| 451 drawFunc(c, &foregroundPaint); | 452 drawFunc(c, &foregroundPaint); |
| 452 } else { | 453 } else { |
| 453 ASSERT(isFullCanvasCompositeMode(state().globalComposite())); | 454 ASSERT(isFullCanvasCompositeMode(state().globalComposite())); |
| 454 c->saveLayer(nullptr, &compositePaint); | 455 c->saveLayer(nullptr, &compositePaint); |
| 455 shadowPaint.setBlendMode(SkBlendMode::kSrcOver); | 456 shadowPaint.setBlendMode(SkBlendMode::kSrcOver); |
| 456 c->setMatrix(ctm); | 457 c->setMatrix(ctm); |
| 457 drawFunc(c, &shadowPaint); | 458 drawFunc(c, &shadowPaint); |
| 458 } | 459 } |
| 459 c->restoreToCount(saveCount); | 460 c->restoreToCount(saveCount); |
| 460 } | 461 } |
| 461 | 462 |
| 462 compositePaint.setImageFilter(std::move(filter)); | 463 compositePaint.setImageFilter(std::move(filter)); |
| 463 c->saveLayer(nullptr, &compositePaint); | 464 c->saveLayer(nullptr, &compositePaint); |
| 464 SkPaint foregroundPaint = | 465 CdlPaint foregroundPaint = |
| 465 *state().getPaint(paintType, DrawForegroundOnly, imageType); | 466 *state().getPaint(paintType, DrawForegroundOnly, imageType); |
| 466 foregroundPaint.setBlendMode(SkBlendMode::kSrcOver); | 467 foregroundPaint.setBlendMode(SkBlendMode::kSrcOver); |
| 467 c->setMatrix(ctm); | 468 c->setMatrix(ctm); |
| 468 drawFunc(c, &foregroundPaint); | 469 drawFunc(c, &foregroundPaint); |
| 469 c->restore(); | 470 c->restore(); |
| 470 c->setMatrix(ctm); | 471 c->setMatrix(ctm); |
| 471 } | 472 } |
| 472 | 473 |
| 473 } // namespace blink | 474 } // namespace blink |
| 474 | 475 |
| 475 #endif // BaseRenderingContext2D_h | 476 #endif // BaseRenderingContext2D_h |
| OLD | NEW |