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 #ifndef SkLinearBitmapPipeline_DEFINED | 8 #ifndef SkLinearBitmapPipeline_DEFINED |
9 #define SkLinearBitmapPipeline_DEFINED | 9 #define SkLinearBitmapPipeline_DEFINED |
10 | 10 |
11 | 11 |
12 #include "SkColor.h" | 12 #include "SkColor.h" |
13 #include "SkImageInfo.h" | 13 #include "SkImageInfo.h" |
14 #include "SkMatrix.h" | 14 #include "SkMatrix.h" |
15 #include "SkNx.h" | 15 #include "SkNx.h" |
16 #include "SkShader.h" | 16 #include "SkShader.h" |
17 | 17 |
18 using Sk4fArg = const Sk4f&; | |
19 | |
20 class PointProcessorInterface { | |
21 public: | |
22 virtual ~PointProcessorInterface() { } | |
23 virtual void pointListFew(int n, Sk4fArg xs, Sk4fArg ys) = 0; | |
24 virtual void pointList4(Sk4fArg xs, Sk4fArg ys) = 0; | |
25 | |
26 // The pointSpan method efficiently process horizontal spans of pixels. | |
27 // * start - the point where to start the span. | |
28 // * length - the number of pixels to traverse in source space. | |
29 // * count - the number of pixels to produce in destination space. | |
30 // Both start and length are mapped through the inversion matrix to produce
values in source | |
31 // space. After the matrix operation, the tilers may break the spans up into
smaller spans. | |
32 // The tilers can produce spans that seem nonsensical. | |
33 // * The clamp tiler can create spans with length of 0. This indicates to co
py an edge pixel out | |
34 // to the edge of the destination scan. | |
35 // * The mirror tiler can produce spans with negative length. This indicates
that the source | |
36 // should be traversed in the opposite direction to the destination pixels
. | |
37 virtual void pointSpan(SkPoint start, SkScalar length, int count) = 0; | |
38 }; | |
39 | |
40 class BilerpProcessorInterface : public PointProcessorInterface { | |
41 public: | |
42 // The x's and y's are setup in the following order: | |
43 // +--------+--------+ | |
44 // | | | | |
45 // | px00 | px10 | | |
46 // | 0 | 1 | | |
47 // +--------+--------+ | |
48 // | | | | |
49 // | px01 | px11 | | |
50 // | 2 | 3 | | |
51 // +--------+--------+ | |
52 // These pixels coordinates are arranged in the following order in xs and ys
: | |
53 // px00 px10 px01 px11 | |
54 virtual void bilerpList(Sk4fArg xs, Sk4fArg ys) = 0; | |
55 }; | |
56 | |
57 class PixelPlacerInterface { | |
58 public: | |
59 virtual ~PixelPlacerInterface() { } | |
60 virtual void setDestination(SkPM4f* dst) = 0; | |
61 virtual void placePixel(Sk4fArg pixel0) = 0; | |
62 virtual void place4Pixels(Sk4fArg p0, Sk4fArg p1, Sk4fArg p2, Sk4fArg p3) =
0; | |
63 }; | |
64 | |
65 class SkLinearBitmapPipeline { | 18 class SkLinearBitmapPipeline { |
66 public: | 19 public: |
67 SkLinearBitmapPipeline( | 20 SkLinearBitmapPipeline( |
68 const SkMatrix& inverse, | 21 const SkMatrix& inverse, |
69 SkFilterQuality filterQuality, | 22 SkFilterQuality filterQuality, |
70 SkShader::TileMode xTile, SkShader::TileMode yTile, | 23 SkShader::TileMode xTile, SkShader::TileMode yTile, |
71 const SkPixmap& srcPixmap); | 24 const SkPixmap& srcPixmap); |
| 25 ~SkLinearBitmapPipeline(); |
72 | 26 |
73 void shadeSpan4f(int x, int y, SkPM4f* dst, int count); | 27 void shadeSpan4f(int x, int y, SkPM4f* dst, int count); |
74 | 28 |
75 template<typename Base, size_t kSize> | 29 template<typename Base, size_t kSize> |
76 class PolymorphicUnion { | 30 class PolymorphicUnion { |
77 public: | 31 public: |
78 PolymorphicUnion() {} | 32 PolymorphicUnion() {} |
79 | 33 |
80 ~PolymorphicUnion() { get()->~Base(); } | 34 ~PolymorphicUnion() { get()->~Base(); } |
81 | 35 |
82 template<typename Variant, typename... Args> | 36 template<typename Variant, typename... Args> |
83 void Initialize(Args&&... args) { | 37 void Initialize(Args&&... args) { |
84 SkASSERTF(sizeof(Variant) <= sizeof(fSpace), | 38 SkASSERTF(sizeof(Variant) <= sizeof(fSpace), |
85 "Size Variant: %d, Space: %d", sizeof(Variant), sizeof(fSp
ace)); | 39 "Size Variant: %d, Space: %d", sizeof(Variant), sizeof(fSp
ace)); |
86 | 40 |
87 new(&fSpace) Variant(std::forward<Args>(args)...); | 41 new(&fSpace) Variant(std::forward<Args>(args)...); |
88 }; | 42 }; |
89 | 43 |
90 Base* get() const { return reinterpret_cast<Base*>(&fSpace); } | 44 Base* get() const { return reinterpret_cast<Base*>(&fSpace); } |
91 Base* operator->() const { return get(); } | 45 Base* operator->() const { return get(); } |
92 Base& operator*() const { return *get(); } | 46 Base& operator*() const { return *get(); } |
93 | 47 |
94 private: | 48 private: |
95 struct SK_STRUCT_ALIGN(16) Space { | 49 struct SK_STRUCT_ALIGN(16) Space { |
96 char space[kSize]; | 50 char space[kSize]; |
97 }; | 51 }; |
98 mutable Space fSpace; | 52 mutable Space fSpace; |
99 }; | 53 }; |
100 | 54 |
| 55 class PointProcessorInterface; |
| 56 class BilerpProcessorInterface; |
| 57 class PixelPlacerInterface; |
| 58 |
101 using MatrixStage = PolymorphicUnion<PointProcessorInterface, 112>; | 59 using MatrixStage = PolymorphicUnion<PointProcessorInterface, 112>; |
102 using FilterStage = PolymorphicUnion<PointProcessorInterface, 8>; | 60 using FilterStage = PolymorphicUnion<PointProcessorInterface, 8>; |
103 using TileStage = PolymorphicUnion<BilerpProcessorInterface, 96>; | 61 using TileStage = PolymorphicUnion<BilerpProcessorInterface, 96>; |
104 using SampleStage = PolymorphicUnion<BilerpProcessorInterface, 80>; | 62 using SampleStage = PolymorphicUnion<BilerpProcessorInterface, 80>; |
105 using PixelStage = PolymorphicUnion<PixelPlacerInterface, 80>; | 63 using PixelStage = PolymorphicUnion<PixelPlacerInterface, 80>; |
106 | 64 |
107 private: | 65 private: |
108 PointProcessorInterface* fFirstStage; | 66 PointProcessorInterface* fFirstStage; |
109 MatrixStage fMatrixStage; | 67 MatrixStage fMatrixStage; |
110 FilterStage fFilterStage; | 68 FilterStage fFilterStage; |
111 TileStage fTileXOrBothStage; | 69 TileStage fTileXOrBothStage; |
112 TileStage fTileYStage; | 70 TileStage fTileYStage; |
113 SampleStage fSampleStage; | 71 SampleStage fSampleStage; |
114 PixelStage fPixelStage; | 72 PixelStage fPixelStage; |
115 }; | 73 }; |
116 | 74 |
117 #endif // SkLinearBitmapPipeline_DEFINED | 75 #endif // SkLinearBitmapPipeline_DEFINED |
OLD | NEW |