| 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 | 
|---|