OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
9 #include "SkData.h" | 9 #include "SkData.h" |
| 10 #include "SkDrawFilter.h" |
10 #include "SkImageFilter.h" | 11 #include "SkImageFilter.h" |
11 #include "SkLiteDL.h" | 12 #include "SkLiteDL.h" |
12 #include "SkMath.h" | 13 #include "SkMath.h" |
13 #include "SkPicture.h" | 14 #include "SkPicture.h" |
14 #include "SkRSXform.h" | 15 #include "SkRSXform.h" |
15 #include "SkTextBlob.h" | 16 #include "SkTextBlob.h" |
16 | 17 |
17 #ifndef SKLITEDL_PAGE | 18 #ifndef SKLITEDL_PAGE |
18 #define SKLITEDL_PAGE 4096 | 19 #define SKLITEDL_PAGE 4096 |
19 #endif | 20 #endif |
(...skipping 25 matching lines...) Expand all Loading... |
45 static void make_threadsafe(SkPath* path, SkMatrix* matrix) { | 46 static void make_threadsafe(SkPath* path, SkMatrix* matrix) { |
46 if (path) { | 47 if (path) { |
47 path->updateBoundsCache(); | 48 path->updateBoundsCache(); |
48 (void)path->getConvexity(); | 49 (void)path->getConvexity(); |
49 } | 50 } |
50 if (matrix) { (void)matrix->getType(); } | 51 if (matrix) { (void)matrix->getType(); } |
51 } | 52 } |
52 | 53 |
53 namespace { | 54 namespace { |
54 #define TYPES(M)
\ | 55 #define TYPES(M)
\ |
55 M(Save) M(Restore) M(SaveLayer)
\ | 56 M(SetDrawFilter) M(Save) M(Restore) M(SaveLayer)
\ |
56 M(Concat) M(SetMatrix) M(Translate) M(TranslateZ)
\ | 57 M(Concat) M(SetMatrix) M(Translate) M(TranslateZ)
\ |
57 M(ClipPath) M(ClipRect) M(ClipRRect) M(ClipRegion)
\ | 58 M(ClipPath) M(ClipRect) M(ClipRRect) M(ClipRegion)
\ |
58 M(DrawPaint) M(DrawPath) M(DrawRect) M(DrawRegion) M(DrawOval) M(DrawArc)
\ | 59 M(DrawPaint) M(DrawPath) M(DrawRect) M(DrawRegion) M(DrawOval) M(DrawArc)
\ |
59 M(DrawRRect) M(DrawDRRect) M(DrawAnnotation) M(DrawDrawable) M(DrawPicture)
\ | 60 M(DrawRRect) M(DrawDRRect) M(DrawAnnotation) M(DrawDrawable) M(DrawPicture)
\ |
60 M(DrawShadowedPicture)
\ | 61 M(DrawShadowedPicture)
\ |
61 M(DrawImage) M(DrawImageNine) M(DrawImageRect) M(DrawImageLattice)
\ | 62 M(DrawImage) M(DrawImageNine) M(DrawImageRect) M(DrawImageLattice)
\ |
62 M(DrawText) M(DrawPosText) M(DrawPosTextH)
\ | 63 M(DrawText) M(DrawPosText) M(DrawPosTextH)
\ |
63 M(DrawTextOnPath) M(DrawTextRSXform) M(DrawTextBlob)
\ | 64 M(DrawTextOnPath) M(DrawTextRSXform) M(DrawTextBlob)
\ |
64 M(DrawPatch) M(DrawPoints) M(DrawVertices) M(DrawAtlas) | 65 M(DrawPatch) M(DrawPoints) M(DrawVertices) M(DrawAtlas) |
65 | 66 |
66 #define M(T) T, | 67 #define M(T) T, |
67 enum class Type : uint8_t { TYPES(M) }; | 68 enum class Type : uint8_t { TYPES(M) }; |
68 #undef M | 69 #undef M |
69 | 70 |
70 struct Op { | 71 struct Op { |
71 void makeThreadsafe() {} | 72 void makeThreadsafe() {} |
72 | 73 |
73 uint32_t type : 8; | 74 uint32_t type : 8; |
74 uint32_t skip : 24; | 75 uint32_t skip : 24; |
75 }; | 76 }; |
76 static_assert(sizeof(Op) == 4, ""); | 77 static_assert(sizeof(Op) == 4, ""); |
77 | 78 |
| 79 struct SetDrawFilter final : Op { |
| 80 #ifdef SK_SUPPORT_LEGACY_DRAWFILTER |
| 81 static const auto kType = Type::SetDrawFilter; |
| 82 SetDrawFilter(SkDrawFilter* df) : drawFilter(sk_ref_sp(df)) {} |
| 83 sk_sp<SkDrawFilter> drawFilter; |
| 84 #endif |
| 85 void draw(SkCanvas* c, const SkMatrix&) { |
| 86 #ifdef SK_SUPPORT_LEGACY_DRAWFILTER |
| 87 c->setDrawFilter(drawFilter.get()); |
| 88 #endif |
| 89 } |
| 90 }; |
| 91 |
78 struct Save final : Op { | 92 struct Save final : Op { |
79 static const auto kType = Type::Save; | 93 static const auto kType = Type::Save; |
80 void draw(SkCanvas* c, const SkMatrix&) { c->save(); } | 94 void draw(SkCanvas* c, const SkMatrix&) { c->save(); } |
81 }; | 95 }; |
82 struct Restore final : Op { | 96 struct Restore final : Op { |
83 static const auto kType = Type::Restore; | 97 static const auto kType = Type::Restore; |
84 void draw(SkCanvas* c, const SkMatrix&) { c->restore(); } | 98 void draw(SkCanvas* c, const SkMatrix&) { c->restore(); } |
85 }; | 99 }; |
86 struct SaveLayer final : Op { | 100 struct SaveLayer final : Op { |
87 static const auto kType = Type::SaveLayer; | 101 static const auto kType = Type::SaveLayer; |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 auto op = (Op*)ptr; | 573 auto op = (Op*)ptr; |
560 auto type = op->type; | 574 auto type = op->type; |
561 auto skip = op->skip; | 575 auto skip = op->skip; |
562 if (auto fn = fns[type]) { // We replace no-op functions with nullptrs | 576 if (auto fn = fns[type]) { // We replace no-op functions with nullptrs |
563 fn(op, args...); // to avoid the overhead of a pointless call
. | 577 fn(op, args...); // to avoid the overhead of a pointless call
. |
564 } | 578 } |
565 ptr += skip; | 579 ptr += skip; |
566 } | 580 } |
567 } | 581 } |
568 | 582 |
| 583 #ifdef SK_SUPPORT_LEGACY_DRAWFILTER |
| 584 void SkLiteDL::setDrawFilter(SkDrawFilter* df) { |
| 585 this->push<SetDrawFilter>(0, df); |
| 586 } |
| 587 #endif |
| 588 |
569 void SkLiteDL:: save() { this->push <Save>(0); } | 589 void SkLiteDL:: save() { this->push <Save>(0); } |
570 void SkLiteDL::restore() { this->push<Restore>(0); } | 590 void SkLiteDL::restore() { this->push<Restore>(0); } |
571 void SkLiteDL::saveLayer(const SkRect* bounds, const SkPaint* paint, | 591 void SkLiteDL::saveLayer(const SkRect* bounds, const SkPaint* paint, |
572 const SkImageFilter* backdrop, SkCanvas::SaveLayerFlags
flags) { | 592 const SkImageFilter* backdrop, SkCanvas::SaveLayerFlags
flags) { |
573 this->push<SaveLayer>(0, bounds, paint, backdrop, flags); | 593 this->push<SaveLayer>(0, bounds, paint, backdrop, flags); |
574 } | 594 } |
575 | 595 |
576 void SkLiteDL:: concat(const SkMatrix& matrix) { this->push <Concat>(0, ma
trix); } | 596 void SkLiteDL:: concat(const SkMatrix& matrix) { this->push <Concat>(0, ma
trix); } |
577 void SkLiteDL::setMatrix(const SkMatrix& matrix) { this->push<SetMatrix>(0, ma
trix); } | 597 void SkLiteDL::setMatrix(const SkMatrix& matrix) { this->push<SetMatrix>(0, ma
trix); } |
578 void SkLiteDL::translate(SkScalar dx, SkScalar dy) { this->push<Translate>(0, dx
, dy); } | 598 void SkLiteDL::translate(SkScalar dx, SkScalar dy) { this->push<Translate>(0, dx
, dy); } |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
786 } | 806 } |
787 | 807 |
788 void SkLiteDL::reset(SkRect bounds) { | 808 void SkLiteDL::reset(SkRect bounds) { |
789 SkASSERT(this->unique()); | 809 SkASSERT(this->unique()); |
790 this->map(dtor_fns); | 810 this->map(dtor_fns); |
791 | 811 |
792 // Leave fBytes and fReserved alone. | 812 // Leave fBytes and fReserved alone. |
793 fUsed = 0; | 813 fUsed = 0; |
794 fBounds = bounds; | 814 fBounds = bounds; |
795 } | 815 } |
OLD | NEW |