1 //------------------------------------------------------------------------------
2 // emPainter_ScTl.h
3 //
4 // Copyright (C) 2020 Oliver Hamann.
5 //
6 // Homepage: http://eaglemode.sourceforge.net/
7 //
8 // This program is free software: you can redistribute it and/or modify it under
9 // the terms of the GNU General Public License version 3 as published by the
10 // Free Software Foundation.
11 //
12 // This program is distributed in the hope that it will be useful, but WITHOUT
13 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 // FOR A PARTICULAR PURPOSE. See the GNU General Public License version 3 for
15 // more details.
16 //
17 // You should have received a copy of the GNU General Public License version 3
18 // along with this program. If not, see <http://www.gnu.org/licenses/>.
19 //------------------------------------------------------------------------------
20
21 #ifndef emPainter_ScTl_h
22 #define emPainter_ScTl_h
23
24 #ifndef emPainter_h
25 #include <emCore/emPainter.h>
26 #endif
27
28
29 class emPainter::ScanlineTool {
30
31 public:
32
33 ScanlineTool(const emPainter & painter);
34
35 bool Init(const emTexture & texture, emColor canvasColor);
36
37 void (*PaintScanline)(const ScanlineTool & sct, int x, int y, int w,
38 int opacityBeg, int opacity, int opacityEnd);
39
40 private:
41
42 void (*Interpolate)(const ScanlineTool & sct, int x, int y, int w);
43
44 static void PaintLargeScanlineInt(
45 const ScanlineTool & sct, int x, int y, int w,
46 int opacityBeg, int opacity, int opacityEnd
47 );
48
49 const emPainter & Painter;
50 int Alpha;
51 emColor CanvasColor,Color1,Color2;
52 int Channels;
53 const emByte * ImgMap;
54 int ImgW,ImgH;
55 ssize_t ImgDX,ImgDY;
56 ssize_t ImgSX,ImgSY;
57 emInt64 TX,TY,TDX,TDY;
58 emUInt32 ODX,ODY;
59
60 enum { MaxInterpolationBytesAtOnce=1024 };
61
62 enum { InterpolationBufferSize=MaxInterpolationBytesAtOnce*2+128 };
63 // Lots of algorithms need more than MaxInterpolationBytesAtOnce...
64
65 emUInt64 InterpolationBuffer[(InterpolationBufferSize+7)/8];
66
67 # define DECLARE_INTERPOLATE(NAME) \
68 static void Interpolate##NAME(const ScanlineTool & sct, int x, int y, int w);
69
70 # define DECLARE_INTERPOLATE_CS(NAME) \
71 DECLARE_INTERPOLATE(NAME##Cs1) \
72 DECLARE_INTERPOLATE(NAME##Cs2) \
73 DECLARE_INTERPOLATE(NAME##Cs3) \
74 DECLARE_INTERPOLATE(NAME##Cs4)
75
76 # define DECLARE_INTERPOLATE_EXCS(NAME) \
77 DECLARE_INTERPOLATE_CS(NAME##Et) \
78 DECLARE_INTERPOLATE_CS(NAME##Ee) \
79 DECLARE_INTERPOLATE_CS(NAME##Ez)
80
81 DECLARE_INTERPOLATE(LinearGradient) // 1 InterpolateLinearGradient function
82 DECLARE_INTERPOLATE(RadialGradient) // 1 InterpolateRadialGradient function
83 DECLARE_INTERPOLATE_EXCS(ImageNearest) // 12 InterpolateImageNear.. functions
84 DECLARE_INTERPOLATE_EXCS(ImageAreaSampled) // 12 InterpolateImageArea.. functions
85 DECLARE_INTERPOLATE_EXCS(ImageBilinear) // 12 InterpolateImageBili.. functions
86 DECLARE_INTERPOLATE_EXCS(ImageBicubic) // 12 InterpolateImageBicu.. functions
87 DECLARE_INTERPOLATE_EXCS(ImageLanczos) // 12 InterpolateImageLanc.. functions
88 DECLARE_INTERPOLATE_EXCS(ImageAdaptive) // 12 InterpolateImageAdap.. functions
89 # if EM_HAVE_X86_INTRINSICS
90 DECLARE_INTERPOLATE_EXCS(ImageAvx2Nearest) // 12 InterpolateImageAvx2Near.. functions
91 DECLARE_INTERPOLATE_EXCS(ImageAvx2Bilinear) // 12 InterpolateImageAvx2Bili.. functions
92 DECLARE_INTERPOLATE_EXCS(ImageAvx2Bicubic) // 12 InterpolateImageAvx2Bicu.. functions
93 DECLARE_INTERPOLATE_EXCS(ImageAvx2Lanczos) // 12 InterpolateImageAvx2Lanc.. functions
94 DECLARE_INTERPOLATE_EXCS(ImageAvx2Adaptive) // 12 InterpolateImageAvx2Adap.. functions
95 # endif
96
97 # define DECLARE_PAINTSCANLINE(NAME) \
98 static void PaintScanline##NAME(const ScanlineTool & sct, int x, int y, int w, \
99 int opacityBeg, int opacity, int opacityEnd);
100
101 # define DECLARE_PAINTSCANLINE_CV(NAME) \
102 DECLARE_PAINTSCANLINE(NAME) \
103 DECLARE_PAINTSCANLINE(NAME##Cv)
104
105 # define DECLARE_PAINTSCANLINE_PSCV(NAME) \
106 DECLARE_PAINTSCANLINE_CV(NAME##Ps1) \
107 DECLARE_PAINTSCANLINE_CV(NAME##Ps2) \
108 DECLARE_PAINTSCANLINE_CV(NAME##Ps4)
109
110 # define DECLARE_PAINTSCANLINE_PFCV(NAME) \
111 DECLARE_PAINTSCANLINE_CV(NAME##Pf0) \
112 DECLARE_PAINTSCANLINE_CV(NAME##Pf1) \
113 DECLARE_PAINTSCANLINE_CV(NAME##Pf2) \
114 DECLARE_PAINTSCANLINE_CV(NAME##Pf3)
115
116 # define DECLARE_PAINTSCANLINE_CSPSCV(NAME) \
117 DECLARE_PAINTSCANLINE_PSCV(NAME##Cs1) \
118 DECLARE_PAINTSCANLINE_PSCV(NAME##Cs2) \
119 DECLARE_PAINTSCANLINE_PSCV(NAME##Cs3) \
120 DECLARE_PAINTSCANLINE_PSCV(NAME##Cs4)
121
122 # define DECLARE_PAINTSCANLINE_CSPFCV(NAME) \
123 DECLARE_PAINTSCANLINE_PFCV(NAME##Cs1) \
124 DECLARE_PAINTSCANLINE_PFCV(NAME##Cs2) \
125 DECLARE_PAINTSCANLINE_PFCV(NAME##Cs3) \
126 DECLARE_PAINTSCANLINE_PFCV(NAME##Cs4)
127
128 # define DECLARE_PAINTSCANLINE_GACSPSCV(NAME) \
129 DECLARE_PAINTSCANLINE_CSPSCV(NAME) \
130 DECLARE_PAINTSCANLINE_CSPSCV(NAME##A) \
131 DECLARE_PAINTSCANLINE_CSPSCV(NAME##G2) \
132 DECLARE_PAINTSCANLINE_CSPSCV(NAME##G1) \
133 DECLARE_PAINTSCANLINE_CSPSCV(NAME##G1G2)
134
135 # define DECLARE_PAINTSCANLINE_GACSPFCV(NAME) \
136 DECLARE_PAINTSCANLINE_CSPFCV(NAME) \
137 DECLARE_PAINTSCANLINE_CSPFCV(NAME##A) \
138 DECLARE_PAINTSCANLINE_CSPFCV(NAME##G2) \
139 DECLARE_PAINTSCANLINE_CSPFCV(NAME##G1) \
140 DECLARE_PAINTSCANLINE_CSPFCV(NAME##G1G2)
141
142 DECLARE_PAINTSCANLINE_PSCV(Col) // 6 PaintScanlineCol.. functions
143 DECLARE_PAINTSCANLINE_GACSPSCV(Int) // 120 PaintScanlineInt.. functions
144
145 # if EM_HAVE_X86_INTRINSICS
146 DECLARE_PAINTSCANLINE_PFCV(ColAvx2) // 8 PaintScanlineColAvx2.. functions
147 DECLARE_PAINTSCANLINE_GACSPFCV(IntAvx2) // 160 PaintScanlineIntAvx2.. functions
148 # endif
149
150 # undef DECLARE_INTERPOLATE
151 # undef DECLARE_INTERPOLATE_CS
152 # undef DECLARE_INTERPOLATE_EXCS
153 # undef DECLARE_PAINTSCANLINE
154 # undef DECLARE_PAINTSCANLINE_CV
155 # undef DECLARE_PAINTSCANLINE_PSCV
156 # undef DECLARE_PAINTSCANLINE_PFCV
157 # undef DECLARE_PAINTSCANLINE_CSPSCV
158 # undef DECLARE_PAINTSCANLINE_CSPFCV
159 # undef DECLARE_PAINTSCANLINE_GACSPSCV
160 # undef DECLARE_PAINTSCANLINE_GACSPFCV
161 };
162
163
ScanlineTool(const emPainter & painter)164 inline emPainter::ScanlineTool::ScanlineTool(const emPainter & painter)
165 : Painter(painter)
166 {
167 }
168
169
170 #endif
171