App

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

TLUT.cpp
Go to the documentation of this file.
1 /*
2 * TLUT.cpp
3 *
4 * Created on: Mar 24, 2013
5 * Author: xxx
6 */
7
8 #include "TLUT.hpp"
9
10 namespace app {
11
12 template class TLUT<px_4x8bit, px_1x8bit>;
13
14 template<typename TPIXEL, typename TCHANNEL>
15 int TLUT<TPIXEL, TCHANNEL>::applyTo_4ch(TBitmap<TPIXEL, TCHANNEL> &dst, Rect dstRect) {
16 if (dst.getData() == NULL) {
17 return 1;
18 }
19 if (!initOk) {
20 return 2;
21 }
22 PointerArea dstArea = PointerArea(dst.getData(), dst.getRect(), dstRect, dst.getBpp());
23
24 TCHANNEL * rLut = values[0];
25 TCHANNEL * gLut = values[1];
26 TCHANNEL * bLut = values[2];
27 TCHANNEL * aLut = values[3];
28
29 TCHANNEL * d = (TCHANNEL *) dstArea.getAreaBgn();
30 TCHANNEL * dstAreaEnd = (TCHANNEL *) dstArea.getAreaEnd();
31 TCHANNEL * dstAreaRowEnd = (TCHANNEL *) dstArea.getAreaRowEnd();
32 unsigned dstWidth = dstArea.getOrigWidth() * 4;
33 unsigned dstOffset = (dstArea.getOrigWidth() - dstArea.getAreaWidth()) * 4;
34
35 while (d < dstAreaEnd) {
36 while (d < dstAreaRowEnd) {
37 *d = rLut[*d];
38 d++;
39 *d = gLut[*d];
40 d++;
41 *d = bLut[*d];
42 d++;
43 *d = aLut[*d];
44 d++;
45 }
46 d += dstOffset;
47 dstAreaRowEnd += dstWidth;
48 }
49
50 return 0;
51 }
52 template<typename TPIXEL, typename TCHANNEL>
53 int TLUT<TPIXEL, TCHANNEL>::applyTo_4ch(TBitmap<TPIXEL, TCHANNEL> &dst, Rect dstRect, double alpha) {
54 if (dst.getData() == NULL) {
55 return 1;
56 }
57 if (!initOk) {
58 return 2;
59 }
60 PointerArea dstArea = PointerArea(dst.getData(), dst.getRect(), dstRect, dst.getBpp());
61
62 TCHANNEL * rLut = values[0];
63 TCHANNEL * gLut = values[1];
64 TCHANNEL * bLut = values[2];
65 TCHANNEL * aLut = values[3];
66
67 TCHANNEL * d = (TCHANNEL *) dstArea.getAreaBgn();
68 TCHANNEL * dstAreaEnd = (TCHANNEL *) dstArea.getAreaEnd();
69 TCHANNEL * dstAreaRowEnd = (TCHANNEL *) dstArea.getAreaRowEnd();
70 unsigned dstWidth = dstArea.getOrigWidth() * 4;
71 unsigned dstOffset = (dstArea.getOrigWidth() - dstArea.getAreaWidth()) * 4;
72
73 while (d < dstAreaEnd) {
74 while (d < dstAreaRowEnd) {
75 TCHANNEL doa = *(d + 3);
76 double da = doa / 255.0;
77 double sa = aLut[doa] * alpha / 255.0;
78 double sac = 1 - sa;
79 double ra = sa + da * sac;
80
81 *d = ((rLut[*d] * sa + *d * da * sac) / ra + 0.5);
82 d++;
83 *d = ((gLut[*d] * sa + *d * da * sac) / ra + 0.5);
84 d++;
85 *d = ((bLut[*d] * sa + *d * da * sac) / ra + 0.5);
86 d++;
87 *d = ra * 255 + 0.5;
88 d++;
89 }
90 d += dstOffset;
91 dstAreaRowEnd += dstWidth;
92 }
93
94 return 0;
95 }
96 template<typename TPIXEL, typename TCHANNEL>
97 int TLUT<TPIXEL, TCHANNEL>::applyTo_4ch(TBitmap<TPIXEL, TCHANNEL> &dst, const TBitmap<TCHANNEL, TCHANNEL> & msk, Rect mskRect, Point mskOrig) {
98
99 if (msk.getType() != MONO || msk.getData() == NULL) {
100 return 1;
101 }
102 if (dst.getType() != RGBA || dst.getData() == NULL) {
103 return 2;
104 }
105
106 if (!initOk) {
107 return 2;
108 }
109
110 PointerArea mskArea = PointerArea(msk.getData(), msk.getRect(), mskRect, msk.getBpp());
111 PointerArea dstArea = dst.getPointerArea();
112
113 int err = PointerArea::makeCommon(dstArea, mskArea, mskOrig);
114 if (err) {
115 return 100 + err;
116 }
117
118 TCHANNEL * rLut = values[0];
119 TCHANNEL * gLut = values[1];
120 TCHANNEL * bLut = values[2];
121 TCHANNEL * aLut = values[3];
122
123 TCHANNEL * d = (TCHANNEL *) dstArea.getAreaBgn();
124 TCHANNEL * m = (TCHANNEL *) mskArea.getAreaBgn();
125 TCHANNEL * dstAreaEnd = (TCHANNEL *) dstArea.getAreaEnd();
126 TCHANNEL * dstAreaRowEnd = (TCHANNEL *) dstArea.getAreaRowEnd();
127 unsigned dstWidth = dstArea.getOrigWidth() * 4;
128 unsigned dstOffset = (dstArea.getOrigWidth() - dstArea.getAreaWidth()) * 4;
129 unsigned mskOffset = mskArea.getOrigWidth() - mskArea.getAreaWidth();
130
131 while (d < dstAreaEnd) {
132 while (d < dstAreaRowEnd) {
133 TCHANNEL doa = *(d + 3);
134 double da = doa / 255.0;
135 double sa = aLut[doa] * *m / 65025.0;
136 double sac = 1 - sa;
137 double ra = sa + da * sac;
138 m++;
139
140 *d = ((rLut[*d] * sa + *d * da * sac) / ra + 0.5);
141 d++;
142 *d = ((gLut[*d] * sa + *d * da * sac) / ra + 0.5);
143 d++;
144 *d = ((bLut[*d] * sa + *d * da * sac) / ra + 0.5);
145 d++;
146 *d = ra * 255 + 0.5;
147 d++;
148 }
149 d += dstOffset;
150 m += mskOffset;
151 dstAreaRowEnd += dstWidth;
152 }
153
154 return 0;
155 }
156
157
158 template<typename TPIXEL, typename TCHANNEL>
159 int TLUT<TPIXEL, TCHANNEL>::applyTo_4ch(TBitmap<TPIXEL, TCHANNEL> &dst, const TBitmap<TCHANNEL, TCHANNEL> & msk, Rect mskRect, Point mskOrig, double alpha) {
160 if (msk.getType() != MONO || msk.getData() == NULL) {
161 return 1;
162 }
163 if (dst.getType() != RGBA || dst.getData() == NULL) {
164 return 2;
165 }
166
167 if (!initOk) {
168 return 2;
169 }
170
171 PointerArea mskArea = PointerArea(msk.getData(), msk.getRect(), mskRect, msk.getBpp());
172 PointerArea dstArea = dst.getPointerArea();
173
174 int err = PointerArea::makeCommon(dstArea, mskArea, mskOrig);
175 if (err) {
176 return 100 + err;
177 }
178
179 TCHANNEL * rLut = values[0];
180 TCHANNEL * gLut = values[1];
181 TCHANNEL * bLut = values[2];
182 TCHANNEL * aLut = values[3];
183
184 TCHANNEL * d = (TCHANNEL *) dstArea.getAreaBgn();
185 // TCHANNEL * m = (TCHANNEL *) msk.getData();
186 TCHANNEL * m = (TCHANNEL *) mskArea.getAreaBgn();
187 TCHANNEL * dstAreaEnd = (TCHANNEL *) dstArea.getAreaEnd();
188 TCHANNEL * dstAreaRowEnd = (TCHANNEL *) dstArea.getAreaRowEnd();
189 unsigned dstWidth = dstArea.getOrigWidth() * 4;
190 unsigned dstOffset = (dstArea.getOrigWidth() - dstArea.getAreaWidth()) * 4;
191 unsigned mskOffset = mskArea.getOrigWidth() - mskArea.getAreaWidth();
192
193 while (d < dstAreaEnd) {
194 while (d < dstAreaRowEnd) {
195 TCHANNEL doa = *(d + 3);
196 double da = doa / 255.0;
197 double sa = aLut[doa] * *m * alpha/ 65025.0;
198 double sac = 1 - sa;
199 double ra = sa + da * sac;
200 m++;
201
202 *d = ((rLut[*d] * sa + *d * da * sac) / ra + 0.5);
203 d++;
204 *d = ((gLut[*d] * sa + *d * da * sac) / ra + 0.5);
205 d++;
206 *d = ((bLut[*d] * sa + *d * da * sac) / ra + 0.5);
207 d++;
208 *d = ra * 255 + 0.5;
209 d++;
210 }
211 d += dstOffset;
212 m += mskOffset;
213 dstAreaRowEnd += dstWidth;
214 }
215
216 return 0;
217 }
218
219 template<typename TPIXEL, typename TCHANNEL> TLUT<TPIXEL, TCHANNEL>::~TLUT() {
220 for (int i = 0; i < 4; i++) {
221 if (values[i] != NULL) {
222 free(values[i]);
223 values[i] = NULL;
224 }
225 }
226 }
227
228 } /* namespace app */