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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/BaseRenderingContext2D.h

Issue 2523673004: [NOT FOR COMMIT] Fully replace SkCanvas uses.
Patch Set: Support Android build. Created 3 years, 12 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 // 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698