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

Side by Side Diff: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp

Issue 2653933003: Make stream captures work on canvases that are not in the DOM. (Closed)
Patch Set: fix test + review comments Created 3 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. 2 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
3 * All rights reserved. 3 * All rights reserved.
4 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies) 4 * Copyright (C) 2008, 2010 Nokia Corporation and/or its subsidiary(-ies)
5 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 5 * Copyright (C) 2007 Alp Toker <alp@atoker.com>
6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org> 6 * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
7 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org> 7 * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
8 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved. 8 * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
9 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved. 9 * Copyright (C) 2012, 2013 Intel Corporation. All rights reserved.
10 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 10 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 m_tryRestoreContextAttemptCount(0), 120 m_tryRestoreContextAttemptCount(0),
121 m_dispatchContextLostEventTimer( 121 m_dispatchContextLostEventTimer(
122 this, 122 this,
123 &CanvasRenderingContext2D::dispatchContextLostEvent), 123 &CanvasRenderingContext2D::dispatchContextLostEvent),
124 m_dispatchContextRestoredEventTimer( 124 m_dispatchContextRestoredEventTimer(
125 this, 125 this,
126 &CanvasRenderingContext2D::dispatchContextRestoredEvent), 126 &CanvasRenderingContext2D::dispatchContextRestoredEvent),
127 m_tryRestoreContextEventTimer( 127 m_tryRestoreContextEventTimer(
128 this, 128 this,
129 &CanvasRenderingContext2D::tryRestoreContextEvent), 129 &CanvasRenderingContext2D::tryRestoreContextEvent),
130 m_pruneLocalFontCacheScheduled(false) { 130 m_shouldPruneLocalFontCache(false) {
131 if (document.settings() && 131 if (document.settings() &&
132 document.settings()->getAntialiasedClips2dCanvasEnabled()) 132 document.settings()->getAntialiasedClips2dCanvasEnabled())
133 m_clipAntialiasing = AntiAliased; 133 m_clipAntialiasing = AntiAliased;
134 setShouldAntialias(true); 134 setShouldAntialias(true);
135 validateStateStack(); 135 validateStateStack();
136 } 136 }
137 137
138 void CanvasRenderingContext2D::setCanvasGetContextResult( 138 void CanvasRenderingContext2D::setCanvasGetContextResult(
139 RenderingContext& result) { 139 RenderingContext& result) {
140 result.setCanvasRenderingContext2D(this); 140 result.setCanvasRenderingContext2D(this);
141 } 141 }
142 142
143 CanvasRenderingContext2D::~CanvasRenderingContext2D() {} 143 CanvasRenderingContext2D::~CanvasRenderingContext2D() {}
144 144
145 void CanvasRenderingContext2D::dispose() {
146 if (m_pruneLocalFontCacheScheduled)
147 Platform::current()->currentThread()->removeTaskObserver(this);
148 }
149
150 void CanvasRenderingContext2D::validateStateStack() const { 145 void CanvasRenderingContext2D::validateStateStack() const {
151 #if DCHECK_IS_ON() 146 #if DCHECK_IS_ON()
152 if (PaintCanvas* skCanvas = canvas()->existingDrawingCanvas()) { 147 if (PaintCanvas* skCanvas = canvas()->existingDrawingCanvas()) {
153 // The canvas should always have an initial save frame, to support 148 // The canvas should always have an initial save frame, to support
154 // resetting the top level matrix and clip. 149 // resetting the top level matrix and clip.
155 DCHECK_GT(skCanvas->getSaveCount(), 1); 150 DCHECK_GT(skCanvas->getSaveCount(), 1);
156 151
157 if (m_contextLostMode == NotLostContext) { 152 if (m_contextLostMode == NotLostContext) {
158 DCHECK_EQ(static_cast<size_t>(skCanvas->getSaveCount()), 153 DCHECK_EQ(static_cast<size_t>(skCanvas->getSaveCount()),
159 m_stateStack.size() + 1); 154 m_stateStack.size() + 1);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
348 if (dirtyRect.isEmpty()) 343 if (dirtyRect.isEmpty())
349 return; 344 return;
350 345
351 if (ExpensiveCanvasHeuristicParameters::BlurredShadowsAreExpensive && 346 if (ExpensiveCanvasHeuristicParameters::BlurredShadowsAreExpensive &&
352 state().shouldDrawShadows() && state().shadowBlur() > 0) { 347 state().shouldDrawShadows() && state().shadowBlur() > 0) {
353 ImageBuffer* buffer = canvas()->buffer(); 348 ImageBuffer* buffer = canvas()->buffer();
354 if (buffer) 349 if (buffer)
355 buffer->setHasExpensiveOp(); 350 buffer->setHasExpensiveOp();
356 } 351 }
357 352
358 canvas()->didDraw(SkRect::Make(dirtyRect)); 353 CanvasRenderingContext::didDraw(dirtyRect);
359 } 354 }
360 355
361 bool CanvasRenderingContext2D::stateHasFilter() { 356 bool CanvasRenderingContext2D::stateHasFilter() {
362 return state().hasFilter(canvas(), canvas()->size(), this); 357 return state().hasFilter(canvas(), canvas()->size(), this);
363 } 358 }
364 359
365 sk_sp<SkImageFilter> CanvasRenderingContext2D::stateGetFilter() { 360 sk_sp<SkImageFilter> CanvasRenderingContext2D::stateGetFilter() {
366 return state().getFilter(canvas(), canvas()->size(), this); 361 return state().getFilter(canvas(), canvas()->size(), this);
367 } 362 }
368 363
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 elementFontDescription.setComputedSize( 471 elementFontDescription.setComputedSize(
477 elementFontDescription.specifiedSize()); 472 elementFontDescription.specifiedSize());
478 fontStyle->setFontDescription(elementFontDescription); 473 fontStyle->setFontDescription(elementFontDescription);
479 fontStyle->font().update(fontStyle->font().getFontSelector()); 474 fontStyle->font().update(fontStyle->font().getFontSelector());
480 canvas()->document().ensureStyleResolver().computeFont(fontStyle.get(), 475 canvas()->document().ensureStyleResolver().computeFont(fontStyle.get(),
481 *parsedStyle); 476 *parsedStyle);
482 m_fontsResolvedUsingCurrentStyle.add(newFont, fontStyle->font()); 477 m_fontsResolvedUsingCurrentStyle.add(newFont, fontStyle->font());
483 DCHECK(!m_fontLRUList.contains(newFont)); 478 DCHECK(!m_fontLRUList.contains(newFont));
484 m_fontLRUList.add(newFont); 479 m_fontLRUList.add(newFont);
485 pruneLocalFontCache(canvasFontCache->hardMaxFonts()); // hard limit 480 pruneLocalFontCache(canvasFontCache->hardMaxFonts()); // hard limit
486 schedulePruneLocalFontCacheIfNeeded(); // soft limit 481 m_shouldPruneLocalFontCache = true; // apply soft limit
487 modifiableState().setFont( 482 modifiableState().setFont(
488 fontStyle->font(), canvas()->document().styleEngine().fontSelector()); 483 fontStyle->font(), canvas()->document().styleEngine().fontSelector());
489 } 484 }
490 } else { 485 } else {
491 Font resolvedFont; 486 Font resolvedFont;
492 if (!canvasFontCache->getFontUsingDefaultStyle(newFont, resolvedFont)) 487 if (!canvasFontCache->getFontUsingDefaultStyle(newFont, resolvedFont))
493 return; 488 return;
494 modifiableState().setFont( 489 modifiableState().setFont(
495 resolvedFont, canvas()->document().styleEngine().fontSelector()); 490 resolvedFont, canvas()->document().styleEngine().fontSelector());
496 } 491 }
497 492
498 // The parse succeeded. 493 // The parse succeeded.
499 String newFontSafeCopy(newFont); // Create a string copy since newFont can be 494 String newFontSafeCopy(newFont); // Create a string copy since newFont can be
500 // deleted inside realizeSaves. 495 // deleted inside realizeSaves.
501 modifiableState().setUnparsedFont(newFontSafeCopy); 496 modifiableState().setUnparsedFont(newFontSafeCopy);
502 } 497 }
503 498
504 void CanvasRenderingContext2D::schedulePruneLocalFontCacheIfNeeded() {
505 if (m_pruneLocalFontCacheScheduled)
506 return;
507 m_pruneLocalFontCacheScheduled = true;
508 Platform::current()->currentThread()->addTaskObserver(this);
509 }
510
511 void CanvasRenderingContext2D::didProcessTask() { 499 void CanvasRenderingContext2D::didProcessTask() {
512 Platform::current()->currentThread()->removeTaskObserver(this); 500 CanvasRenderingContext::didProcessTask();
513
514 // This should be the only place where canvas() needs to be checked for 501 // This should be the only place where canvas() needs to be checked for
515 // nullness because the circular refence with HTMLCanvasElement mean the 502 // nullness because the circular refence with HTMLCanvasElement means the
516 // canvas and the context keep each other alive as long as the pair is 503 // canvas and the context keep each other alive. As long as the pair is
517 // referenced the task observer is the only persisten refernce to this object 504 // referenced, the task observer is the only persistent refernce to this
518 // that is not traced, so didProcessTask() may be call at a time when the 505 // object
506 // that is not traced, so didProcessTask() may be called at a time when the
519 // canvas has been garbage collected but not the context. 507 // canvas has been garbage collected but not the context.
520 if (!canvas()) 508 if (m_shouldPruneLocalFontCache && canvas()) {
521 return; 509 m_shouldPruneLocalFontCache = false;
522 510 pruneLocalFontCache(canvas()->document().canvasFontCache()->maxFonts());
523 // The rendering surface needs to be prepared now because it will be too late 511 }
524 // to create a layer once we are in the paint invalidation phase.
525 canvas()->prepareSurfaceForPaintingIfNeeded();
526
527 pruneLocalFontCache(canvas()->document().canvasFontCache()->maxFonts());
528 m_pruneLocalFontCacheScheduled = false;
529 } 512 }
530 513
531 void CanvasRenderingContext2D::pruneLocalFontCache(size_t targetSize) { 514 void CanvasRenderingContext2D::pruneLocalFontCache(size_t targetSize) {
532 if (targetSize == 0) { 515 if (targetSize == 0) {
533 // Short cut: LRU does not matter when evicting everything 516 // Short cut: LRU does not matter when evicting everything
534 m_fontLRUList.clear(); 517 m_fontLRUList.clear();
535 m_fontsResolvedUsingCurrentStyle.clear(); 518 m_fontsResolvedUsingCurrentStyle.clear();
536 return; 519 return;
537 } 520 }
538 while (m_fontLRUList.size() > targetSize) { 521 while (m_fontLRUList.size() > targetSize) {
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 } 1150 }
1168 return true; 1151 return true;
1169 } 1152 }
1170 1153
1171 void CanvasRenderingContext2D::resetUsageTracking() { 1154 void CanvasRenderingContext2D::resetUsageTracking() {
1172 UsageCounters newCounters; 1155 UsageCounters newCounters;
1173 m_usageCounters = newCounters; 1156 m_usageCounters = newCounters;
1174 } 1157 }
1175 1158
1176 } // namespace blink 1159 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698