| 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 26 matching lines...) Expand all Loading... |
| 37 #include "platform/graphics/skia/SkiaUtils.h" | 37 #include "platform/graphics/skia/SkiaUtils.h" |
| 38 #include "platform/text/BidiResolver.h" | 38 #include "platform/text/BidiResolver.h" |
| 39 #include "platform/text/TextRunIterator.h" | 39 #include "platform/text/TextRunIterator.h" |
| 40 #include "platform/weborigin/KURL.h" | 40 #include "platform/weborigin/KURL.h" |
| 41 #include "third_party/skia/include/core/SkAnnotation.h" | 41 #include "third_party/skia/include/core/SkAnnotation.h" |
| 42 #include "third_party/skia/include/core/SkClipStack.h" | 42 #include "third_party/skia/include/core/SkClipStack.h" |
| 43 #include "third_party/skia/include/core/SkColorFilter.h" | 43 #include "third_party/skia/include/core/SkColorFilter.h" |
| 44 #include "third_party/skia/include/core/SkData.h" | 44 #include "third_party/skia/include/core/SkData.h" |
| 45 #include "third_party/skia/include/core/SkDevice.h" | 45 #include "third_party/skia/include/core/SkDevice.h" |
| 46 #include "third_party/skia/include/core/SkPicture.h" | 46 #include "third_party/skia/include/core/SkPicture.h" |
| 47 #include "third_party/skia/include/core/SkPictureRecorder.h" |
| 47 #include "third_party/skia/include/core/SkRRect.h" | 48 #include "third_party/skia/include/core/SkRRect.h" |
| 48 #include "third_party/skia/include/core/SkRefCnt.h" | 49 #include "third_party/skia/include/core/SkRefCnt.h" |
| 49 #include "third_party/skia/include/core/SkSurface.h" | 50 #include "third_party/skia/include/core/SkSurface.h" |
| 50 #include "third_party/skia/include/effects/SkBlurMaskFilter.h" | 51 #include "third_party/skia/include/effects/SkBlurMaskFilter.h" |
| 51 #include "third_party/skia/include/effects/SkCornerPathEffect.h" | 52 #include "third_party/skia/include/effects/SkCornerPathEffect.h" |
| 52 #include "third_party/skia/include/effects/SkLumaColorFilter.h" | 53 #include "third_party/skia/include/effects/SkLumaColorFilter.h" |
| 53 #include "third_party/skia/include/effects/SkMatrixImageFilter.h" | 54 #include "third_party/skia/include/effects/SkMatrixImageFilter.h" |
| 54 #include "third_party/skia/include/effects/SkPictureImageFilter.h" | 55 #include "third_party/skia/include/effects/SkPictureImageFilter.h" |
| 55 #include "third_party/skia/include/gpu/GrRenderTarget.h" | 56 #include "third_party/skia/include/gpu/GrRenderTarget.h" |
| 56 #include "third_party/skia/include/gpu/GrTexture.h" | 57 #include "third_party/skia/include/gpu/GrTexture.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 92 | 93 |
| 93 struct GraphicsContext::CanvasSaveState { | 94 struct GraphicsContext::CanvasSaveState { |
| 94 CanvasSaveState(bool pendingSave, int count) | 95 CanvasSaveState(bool pendingSave, int count) |
| 95 : m_pendingSave(pendingSave), m_restoreCount(count) { } | 96 : m_pendingSave(pendingSave), m_restoreCount(count) { } |
| 96 | 97 |
| 97 bool m_pendingSave; | 98 bool m_pendingSave; |
| 98 int m_restoreCount; | 99 int m_restoreCount; |
| 99 }; | 100 }; |
| 100 | 101 |
| 101 struct GraphicsContext::RecordingState { | 102 struct GraphicsContext::RecordingState { |
| 102 RecordingState(SkCanvas* currentCanvas, const SkMatrix& currentMatrix, PassR
efPtr<DisplayList> displayList) | 103 RecordingState(SkPictureRecorder* recorder, SkCanvas* currentCanvas, const S
kMatrix& currentMatrix, PassRefPtr<DisplayList> displayList) |
| 103 : m_savedCanvas(currentCanvas) | 104 : m_displayList(displayList) |
| 104 , m_displayList(displayList) | 105 , m_recorder(recorder) |
| 105 , m_savedMatrix(currentMatrix) | 106 , m_savedCanvas(currentCanvas) |
| 106 { | 107 , m_savedMatrix(currentMatrix) { } |
| 107 } | |
| 108 | 108 |
| 109 ~RecordingState() { } |
| 110 |
| 111 RefPtr<DisplayList> m_displayList; |
| 112 SkPictureRecorder* m_recorder; |
| 109 SkCanvas* m_savedCanvas; | 113 SkCanvas* m_savedCanvas; |
| 110 RefPtr<DisplayList> m_displayList; | |
| 111 const SkMatrix m_savedMatrix; | 114 const SkMatrix m_savedMatrix; |
| 112 }; | 115 }; |
| 113 | 116 |
| 114 GraphicsContext::GraphicsContext(SkCanvas* canvas, DisabledMode disableContextOr
Painting) | 117 GraphicsContext::GraphicsContext(SkCanvas* canvas, DisabledMode disableContextOr
Painting) |
| 115 : m_canvas(canvas) | 118 : m_canvas(canvas) |
| 116 , m_paintStateStack() | 119 , m_paintStateStack() |
| 117 , m_paintStateIndex(0) | 120 , m_paintStateIndex(0) |
| 118 , m_pendingCanvasSave(false) | 121 , m_pendingCanvasSave(false) |
| 119 , m_annotationMode(0) | 122 , m_annotationMode(0) |
| 120 #if ENABLE(ASSERT) | 123 #if ENABLE(ASSERT) |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 return; | 488 return; |
| 486 | 489 |
| 487 restoreLayer(); | 490 restoreLayer(); |
| 488 | 491 |
| 489 ASSERT(m_layerCount > 0); | 492 ASSERT(m_layerCount > 0); |
| 490 #if ENABLE(ASSERT) | 493 #if ENABLE(ASSERT) |
| 491 --m_layerCount; | 494 --m_layerCount; |
| 492 #endif | 495 #endif |
| 493 } | 496 } |
| 494 | 497 |
| 495 void GraphicsContext::beginRecording(const FloatRect& bounds) | 498 PassRefPtr<DisplayList> GraphicsContext::beginRecording(const FloatRect& bounds,
uint32_t recordFlags) |
| 496 { | 499 { |
| 497 RefPtr<DisplayList> displayList = adoptRef(new DisplayList(bounds)); | 500 RefPtr<DisplayList> displayList = DisplayList::create(bounds); |
| 501 |
| 502 SkPictureRecorder* recorder = 0; |
| 498 | 503 |
| 499 SkCanvas* savedCanvas = m_canvas; | 504 SkCanvas* savedCanvas = m_canvas; |
| 500 SkMatrix savedMatrix = getTotalMatrix(); | 505 SkMatrix savedMatrix = getTotalMatrix(); |
| 501 | 506 |
| 502 if (!contextDisabled()) { | 507 if (!contextDisabled()) { |
| 503 IntRect recordingRect = enclosingIntRect(bounds); | 508 FloatRect bounds = displayList->bounds(); |
| 504 m_canvas = displayList->beginRecording(recordingRect.size()); | 509 IntSize recordingSize = enclosingIntRect(bounds).size(); |
| 510 recorder = new SkPictureRecorder; |
| 511 m_canvas = recorder->beginRecording(recordingSize.width(), recordingSize
.height(), 0, recordFlags); |
| 505 | 512 |
| 506 // We want the bounds offset mapped to (0, 0), such that the display lis
t content | 513 // We want the bounds offset mapped to (0, 0), such that the display lis
t content |
| 507 // is fully contained within the SkPictureRecord's bounds. | 514 // is fully contained within the SkPictureRecord's bounds. |
| 508 if (!toFloatSize(bounds.location()).isZero()) { | 515 if (!toFloatSize(bounds.location()).isZero()) { |
| 509 m_canvas->translate(-bounds.x(), -bounds.y()); | 516 m_canvas->translate(-bounds.x(), -bounds.y()); |
| 510 // To avoid applying the offset repeatedly in getTotalMatrix(), we p
re-apply it here. | 517 // To avoid applying the offset repeatedly in getTotalMatrix(), we p
re-apply it here. |
| 511 savedMatrix.preTranslate(bounds.x(), bounds.y()); | 518 savedMatrix.preTranslate(bounds.x(), bounds.y()); |
| 512 } | 519 } |
| 513 } | 520 } |
| 514 | 521 |
| 515 m_recordingStateStack.append(RecordingState(savedCanvas, savedMatrix, displa
yList)); | 522 m_recordingStateStack.append(RecordingState(recorder, savedCanvas, savedMatr
ix, displayList)); |
| 523 |
| 524 return displayList; |
| 516 } | 525 } |
| 517 | 526 |
| 518 PassRefPtr<DisplayList> GraphicsContext::endRecording() | 527 void GraphicsContext::endRecording() |
| 519 { | 528 { |
| 520 ASSERT(!m_recordingStateStack.isEmpty()); | 529 ASSERT(!m_recordingStateStack.isEmpty()); |
| 521 | 530 |
| 522 RecordingState recording = m_recordingStateStack.last(); | 531 RecordingState recording = m_recordingStateStack.last(); |
| 523 if (!contextDisabled()) { | 532 if (!contextDisabled()) |
| 524 ASSERT(recording.m_displayList->isRecording()); | 533 recording.m_displayList->setPicture(recording.m_recorder->endRecording()
); |
| 525 recording.m_displayList->endRecording(); | |
| 526 } | |
| 527 | 534 |
| 535 m_canvas = recording.m_savedCanvas; |
| 536 delete recording.m_recorder; |
| 528 m_recordingStateStack.removeLast(); | 537 m_recordingStateStack.removeLast(); |
| 529 m_canvas = recording.m_savedCanvas; | |
| 530 | |
| 531 return recording.m_displayList.release(); | |
| 532 } | 538 } |
| 533 | 539 |
| 534 bool GraphicsContext::isRecording() const | 540 bool GraphicsContext::isRecording() const |
| 535 { | 541 { |
| 536 return !m_recordingStateStack.isEmpty(); | 542 return !m_recordingStateStack.isEmpty(); |
| 537 } | 543 } |
| 538 | 544 |
| 539 void GraphicsContext::drawDisplayList(DisplayList* displayList) | 545 void GraphicsContext::drawDisplayList(DisplayList* displayList) |
| 540 { | 546 { |
| 541 ASSERT(displayList); | 547 ASSERT(displayList); |
| 542 ASSERT(!displayList->isRecording()); | |
| 543 | 548 |
| 544 if (contextDisabled() || displayList->bounds().isEmpty()) | 549 if (contextDisabled() || displayList->bounds().isEmpty()) |
| 545 return; | 550 return; |
| 546 | 551 |
| 552 bool performClip = !displayList->clip().isEmpty(); |
| 553 bool performTransform = !displayList->transform().isIdentity(); |
| 554 if (performClip || performTransform) { |
| 555 save(); |
| 556 if (performTransform) |
| 557 concat(displayList->transform()); |
| 558 if (performClip) |
| 559 clipRect(displayList->clip()); |
| 560 } |
| 561 |
| 547 realizeCanvasSave(); | 562 realizeCanvasSave(); |
| 548 | 563 |
| 549 const FloatRect& bounds = displayList->bounds(); | 564 const FloatPoint& location = displayList->bounds().location(); |
| 550 if (bounds.x() || bounds.y()) { | 565 if (location.x() || location.y()) { |
| 551 SkMatrix m; | 566 SkMatrix m; |
| 552 m.setTranslate(bounds.x(), bounds.y()); | 567 m.setTranslate(location.x(), location.y()); |
| 553 m_canvas->drawPicture(displayList->picture(), &m, 0); | 568 m_canvas->drawPicture(displayList->picture(), &m, 0); |
| 554 } else { | 569 } else { |
| 555 m_canvas->drawPicture(displayList->picture()); | 570 m_canvas->drawPicture(displayList->picture()); |
| 556 } | 571 } |
| 572 |
| 573 if (performClip || performTransform) |
| 574 restore(); |
| 557 } | 575 } |
| 558 | 576 |
| 559 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin
ts, bool shouldAntialias) | 577 void GraphicsContext::drawConvexPolygon(size_t numPoints, const FloatPoint* poin
ts, bool shouldAntialias) |
| 560 { | 578 { |
| 561 if (contextDisabled()) | 579 if (contextDisabled()) |
| 562 return; | 580 return; |
| 563 | 581 |
| 564 if (numPoints <= 1) | 582 if (numPoints <= 1) |
| 565 return; | 583 return; |
| 566 | 584 |
| (...skipping 1394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1961 // FIXME: This is to not break tests (it results in the filter bitmap fl
ag | 1979 // FIXME: This is to not break tests (it results in the filter bitmap fl
ag |
| 1962 // being set to true). We need to decide if we respect InterpolationNone | 1980 // being set to true). We need to decide if we respect InterpolationNone |
| 1963 // being returned from computeInterpolationQuality. | 1981 // being returned from computeInterpolationQuality. |
| 1964 resampling = InterpolationLow; | 1982 resampling = InterpolationLow; |
| 1965 } | 1983 } |
| 1966 resampling = limitInterpolationQuality(this, resampling); | 1984 resampling = limitInterpolationQuality(this, resampling); |
| 1967 paint->setFilterLevel(static_cast<SkPaint::FilterLevel>(resampling)); | 1985 paint->setFilterLevel(static_cast<SkPaint::FilterLevel>(resampling)); |
| 1968 } | 1986 } |
| 1969 | 1987 |
| 1970 } // namespace blink | 1988 } // namespace blink |
| OLD | NEW |