OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2004, 2005, 2006, 2009 Apple Inc. All rights reserved. |
3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 } // unnamed namespace | 91 } // unnamed namespace |
92 | 92 |
93 struct GraphicsContext::CanvasSaveState { | 93 struct GraphicsContext::CanvasSaveState { |
94 CanvasSaveState(bool pendingSave, int count) | 94 CanvasSaveState(bool pendingSave, int count) |
95 : m_pendingSave(pendingSave), m_restoreCount(count) { } | 95 : m_pendingSave(pendingSave), m_restoreCount(count) { } |
96 | 96 |
97 bool m_pendingSave; | 97 bool m_pendingSave; |
98 int m_restoreCount; | 98 int m_restoreCount; |
99 }; | 99 }; |
100 | 100 |
101 struct GraphicsContext::RecordingState { | |
102 RecordingState(SkCanvas* currentCanvas, const SkMatrix& currentMatrix, PassR
efPtr<DisplayList> displayList) | |
103 : m_savedCanvas(currentCanvas) | |
104 , m_displayList(displayList) | |
105 , m_savedMatrix(currentMatrix) | |
106 { | |
107 } | |
108 | |
109 SkCanvas* m_savedCanvas; | |
110 RefPtr<DisplayList> m_displayList; | |
111 const SkMatrix m_savedMatrix; | |
112 }; | |
113 | |
114 GraphicsContext::GraphicsContext(SkCanvas* canvas, DisabledMode disableContextOr
Painting) | 101 GraphicsContext::GraphicsContext(SkCanvas* canvas, DisabledMode disableContextOr
Painting) |
115 : m_canvas(canvas) | 102 : m_canvas(canvas) |
116 , m_paintStateStack() | 103 , m_paintStateStack() |
117 , m_paintStateIndex(0) | 104 , m_paintStateIndex(0) |
118 , m_pendingCanvasSave(false) | 105 , m_pendingCanvasSave(false) |
119 #if ENABLE(ASSERT) | 106 #if ENABLE(ASSERT) |
120 , m_layerCount(0) | 107 , m_layerCount(0) |
121 , m_disableDestructionChecks(false) | 108 , m_disableDestructionChecks(false) |
122 #endif | 109 #endif |
123 , m_disabledState(disableContextOrPainting) | 110 , m_disabledState(disableContextOrPainting) |
(...skipping 13 matching lines...) Expand all Loading... |
137 m_paintState = m_paintStateStack.last().get(); | 124 m_paintState = m_paintStateStack.last().get(); |
138 } | 125 } |
139 | 126 |
140 GraphicsContext::~GraphicsContext() | 127 GraphicsContext::~GraphicsContext() |
141 { | 128 { |
142 #if ENABLE(ASSERT) | 129 #if ENABLE(ASSERT) |
143 if (!m_disableDestructionChecks) { | 130 if (!m_disableDestructionChecks) { |
144 ASSERT(!m_paintStateIndex); | 131 ASSERT(!m_paintStateIndex); |
145 ASSERT(!m_paintState->saveCount()); | 132 ASSERT(!m_paintState->saveCount()); |
146 ASSERT(!m_layerCount); | 133 ASSERT(!m_layerCount); |
147 ASSERT(m_recordingStateStack.isEmpty()); | |
148 ASSERT(m_canvasStateStack.isEmpty()); | 134 ASSERT(m_canvasStateStack.isEmpty()); |
149 } | 135 } |
150 #endif | 136 #endif |
151 } | 137 } |
152 | 138 |
153 void GraphicsContext::resetCanvas(SkCanvas* canvas) | 139 void GraphicsContext::resetCanvas(SkCanvas* canvas) |
154 { | 140 { |
155 ASSERT(canvas); | 141 ASSERT(canvas); |
156 m_canvas = canvas; | 142 m_canvas = canvas; |
157 m_trackedRegion.reset(); | 143 m_trackedRegion.reset(); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 SkRect skBounds = SkRect::Make(skIBounds); | 311 SkRect skBounds = SkRect::Make(skIBounds); |
326 *bounds = FloatRect(skBounds); | 312 *bounds = FloatRect(skBounds); |
327 return true; | 313 return true; |
328 } | 314 } |
329 | 315 |
330 SkMatrix GraphicsContext::getTotalMatrix() const | 316 SkMatrix GraphicsContext::getTotalMatrix() const |
331 { | 317 { |
332 if (contextDisabled()) | 318 if (contextDisabled()) |
333 return SkMatrix::I(); | 319 return SkMatrix::I(); |
334 | 320 |
335 if (!isRecording()) | 321 return m_canvas->getTotalMatrix(); |
336 return m_canvas->getTotalMatrix(); | |
337 | |
338 const RecordingState& recordingState = m_recordingStateStack.last(); | |
339 SkMatrix totalMatrix = recordingState.m_savedMatrix; | |
340 totalMatrix.preConcat(m_canvas->getTotalMatrix()); | |
341 | |
342 return totalMatrix; | |
343 } | 322 } |
344 | 323 |
345 void GraphicsContext::adjustTextRenderMode(SkPaint* paint) | 324 void GraphicsContext::adjustTextRenderMode(SkPaint* paint) |
346 { | 325 { |
347 if (contextDisabled()) | 326 if (contextDisabled()) |
348 return; | 327 return; |
349 | 328 |
350 if (!paint->isLCDRenderText()) | 329 if (!paint->isLCDRenderText()) |
351 return; | 330 return; |
352 | 331 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 return; | 419 return; |
441 | 420 |
442 restoreLayer(); | 421 restoreLayer(); |
443 | 422 |
444 ASSERT(m_layerCount > 0); | 423 ASSERT(m_layerCount > 0); |
445 #if ENABLE(ASSERT) | 424 #if ENABLE(ASSERT) |
446 --m_layerCount; | 425 --m_layerCount; |
447 #endif | 426 #endif |
448 } | 427 } |
449 | 428 |
450 void GraphicsContext::beginRecording(const FloatRect& bounds) | 429 void GraphicsContext::drawDisplayList(DisplayList* displayList, const FloatPoint
& point) |
451 { | |
452 RefPtr<DisplayList> displayList = adoptRef(new DisplayList(bounds)); | |
453 | |
454 SkCanvas* savedCanvas = m_canvas; | |
455 SkMatrix savedMatrix = getTotalMatrix(); | |
456 | |
457 if (!contextDisabled()) { | |
458 IntRect recordingRect = enclosingIntRect(bounds); | |
459 m_canvas = displayList->beginRecording(recordingRect.size()); | |
460 | |
461 // We want the bounds offset mapped to (0, 0), such that the display lis
t content | |
462 // is fully contained within the SkPictureRecord's bounds. | |
463 if (!toFloatSize(bounds.location()).isZero()) { | |
464 m_canvas->translate(-bounds.x(), -bounds.y()); | |
465 // To avoid applying the offset repeatedly in getTotalMatrix(), we p
re-apply it here. | |
466 savedMatrix.preTranslate(bounds.x(), bounds.y()); | |
467 } | |
468 } | |
469 | |
470 m_recordingStateStack.append(RecordingState(savedCanvas, savedMatrix, displa
yList)); | |
471 } | |
472 | |
473 PassRefPtr<DisplayList> GraphicsContext::endRecording() | |
474 { | |
475 ASSERT(!m_recordingStateStack.isEmpty()); | |
476 | |
477 RecordingState recording = m_recordingStateStack.last(); | |
478 if (!contextDisabled()) { | |
479 ASSERT(recording.m_displayList->isRecording()); | |
480 recording.m_displayList->endRecording(); | |
481 } | |
482 | |
483 m_recordingStateStack.removeLast(); | |
484 m_canvas = recording.m_savedCanvas; | |
485 | |
486 return recording.m_displayList.release(); | |
487 } | |
488 | |
489 bool GraphicsContext::isRecording() const | |
490 { | |
491 return !m_recordingStateStack.isEmpty(); | |
492 } | |
493 | |
494 void GraphicsContext::drawDisplayList(DisplayList* displayList) | |
495 { | 430 { |
496 ASSERT(displayList); | 431 ASSERT(displayList); |
497 ASSERT(!displayList->isRecording()); | |
498 | 432 |
499 if (contextDisabled() || displayList->bounds().isEmpty()) | 433 if (contextDisabled()) |
500 return; | 434 return; |
501 | 435 |
502 realizeCanvasSave(); | 436 realizeCanvasSave(); |
503 | 437 |
504 const FloatRect& bounds = displayList->bounds(); | 438 if (point.x() || point.y()) { |
505 if (bounds.x() || bounds.y()) { | |
506 SkMatrix m; | 439 SkMatrix m; |
507 m.setTranslate(bounds.x(), bounds.y()); | 440 m.setTranslate(point.x(), point.y()); |
508 m_canvas->drawPicture(displayList->picture(), &m, 0); | 441 m_canvas->drawPicture(displayList->picture(), &m, 0); |
509 } else { | 442 } else { |
510 m_canvas->drawPicture(displayList->picture()); | 443 m_canvas->drawPicture(displayList->picture()); |
511 } | 444 } |
512 } | 445 } |
513 | 446 |
514 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin
ts, bool shouldAntialias) | 447 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin
ts, bool shouldAntialias) |
515 { | 448 { |
516 if (contextDisabled()) | 449 if (contextDisabled()) |
517 return; | 450 return; |
(...skipping 1270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1788 // FIXME: This is to not break tests (it results in the filter bitmap fl
ag | 1721 // FIXME: This is to not break tests (it results in the filter bitmap fl
ag |
1789 // being set to true). We need to decide if we respect InterpolationNone | 1722 // being set to true). We need to decide if we respect InterpolationNone |
1790 // being returned from computeInterpolationQuality. | 1723 // being returned from computeInterpolationQuality. |
1791 resampling = InterpolationLow; | 1724 resampling = InterpolationLow; |
1792 } | 1725 } |
1793 resampling = limitInterpolationQuality(this, resampling); | 1726 resampling = limitInterpolationQuality(this, resampling); |
1794 paint->setFilterQuality(static_cast<SkFilterQuality>(resampling)); | 1727 paint->setFilterQuality(static_cast<SkFilterQuality>(resampling)); |
1795 } | 1728 } |
1796 | 1729 |
1797 } // namespace blink | 1730 } // namespace blink |
OLD | NEW |