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