App
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>
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>
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>
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>
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 */