• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2016 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkLinearBitmapPipeline_matrix_DEFINED
9 #define SkLinearBitmapPipeline_matrix_DEFINED
10 
11 #include "SkLinearBitmapPipeline_core.h"
12 
13 namespace {
14 class TranslateMatrixStrategy {
15 public:
TranslateMatrixStrategy(SkVector offset)16     TranslateMatrixStrategy(SkVector offset)
17         : fXOffset{X(offset)}
18         , fYOffset{Y(offset)} { }
19 
processPoints(Sk4s * xs,Sk4s * ys)20     void processPoints(Sk4s* xs, Sk4s* ys) const {
21         *xs = *xs + fXOffset;
22         *ys = *ys + fYOffset;
23     }
24 
25     template <typename Next>
maybeProcessSpan(Span span,Next * next)26     bool maybeProcessSpan(Span span, Next* next) const {
27         SkPoint start; SkScalar length; int count;
28         std::tie(start, length, count) = span;
29         next->pointSpan(Span{start + SkPoint{fXOffset, fYOffset}, length, count});
30         return true;
31     }
32 
33 private:
34     const SkScalar fXOffset, fYOffset;
35 };
36 
37 class ScaleMatrixStrategy {
38 public:
ScaleMatrixStrategy(SkVector offset,SkVector scale)39     ScaleMatrixStrategy(SkVector offset, SkVector scale)
40         : fXOffset{X(offset)}, fYOffset{Y(offset)}
41         ,  fXScale{X(scale)},   fYScale{Y(scale)} { }
processPoints(Sk4s * xs,Sk4s * ys)42     void processPoints(Sk4s* xs, Sk4s* ys) const {
43         *xs = *xs * fXScale + fXOffset;
44         *ys = *ys * fYScale + fYOffset;
45     }
46 
47     template <typename Next>
maybeProcessSpan(Span span,Next * next)48     bool maybeProcessSpan(Span span, Next* next) const {
49         SkPoint start; SkScalar length; int count;
50         std::tie(start, length, count) = span;
51         SkPoint newStart =
52             SkPoint{X(start) * fXScale + fXOffset, Y(start) * fYScale + fYOffset};
53         SkScalar newLength = length * fXScale;
54         next->pointSpan(Span{newStart, newLength, count});
55         return true;
56     }
57 
58 private:
59     const SkScalar fXOffset, fYOffset;
60     const SkScalar fXScale,  fYScale;
61 };
62 
63 class AffineMatrixStrategy {
64 public:
AffineMatrixStrategy(SkVector offset,SkVector scale,SkVector skew)65     AffineMatrixStrategy(SkVector offset, SkVector scale, SkVector skew)
66         : fXOffset{X(offset)}, fYOffset{Y(offset)}
67         , fXScale{X(scale)},   fYScale{Y(scale)}
68         , fXSkew{X(skew)},     fYSkew{Y(skew)} { }
processPoints(Sk4s * xs,Sk4s * ys)69     void processPoints(Sk4s* xs, Sk4s* ys) const {
70         Sk4s newXs = fXScale * *xs +  fXSkew * *ys + fXOffset;
71         Sk4s newYs =  fYSkew * *xs + fYScale * *ys + fYOffset;
72 
73         *xs = newXs;
74         *ys = newYs;
75     }
76 
77     template <typename Next>
maybeProcessSpan(Span span,Next * next)78     bool maybeProcessSpan(Span span, Next* next) const {
79         return false;
80     }
81 
82 private:
83     const SkScalar fXOffset, fYOffset;
84     const SkScalar fXScale,  fYScale;
85     const SkScalar fXSkew,   fYSkew;
86 };
87 
88 class PerspectiveMatrixStrategy {
89 public:
PerspectiveMatrixStrategy(SkVector offset,SkVector scale,SkVector skew,SkVector zSkew,SkScalar zOffset)90     PerspectiveMatrixStrategy(SkVector offset, SkVector scale, SkVector skew,
91                               SkVector zSkew, SkScalar zOffset)
92         : fXOffset{X(offset)}, fYOffset{Y(offset)}, fZOffset{zOffset}
93         , fXScale{X(scale)},   fYScale{Y(scale)}
94         , fXSkew{X(skew)},     fYSkew{Y(skew)}, fZXSkew{X(zSkew)}, fZYSkew{Y(zSkew)} { }
processPoints(Sk4s * xs,Sk4s * ys)95     void processPoints(Sk4s* xs, Sk4s* ys) const {
96         Sk4s newXs = fXScale * *xs +  fXSkew * *ys + fXOffset;
97         Sk4s newYs =  fYSkew * *xs + fYScale * *ys + fYOffset;
98         Sk4s newZs =  fZXSkew * *xs + fZYSkew * *ys + fZOffset;
99 
100         *xs = newXs / newZs;
101         *ys = newYs / newZs;
102     }
103 
104     template <typename Next>
maybeProcessSpan(Span span,Next * next)105     bool maybeProcessSpan(Span span, Next* next) const {
106         return false;
107     }
108 
109 private:
110     const SkScalar fXOffset, fYOffset, fZOffset;
111     const SkScalar fXScale,  fYScale;
112     const SkScalar fXSkew,   fYSkew,   fZXSkew, fZYSkew;
113 };
114 
115 
116 }  // namespace
117 
118 #endif  // SkLinearBitmapPipeline_matrix_DEFINED
119