33 #include "dcmtk/config/osconfig.h"
35 #include "dcmtk/dcmimage/dicopxt.h"
36 #include "dcmtk/dcmimgle/diinpx.h"
45 template<
class T1,
class T2>
64 const unsigned long planeSize,
69 if ((pixel != NULL) && (this->
Count > 0) && (status == EIS_Normal))
90 const unsigned long planeSize,
94 if (this->
Init(pixel))
102 register T2 *r = this->
Data[0];
103 register T2 *g = this->
Data[1];
104 register T2 *b = this->
Data[2];
113 const double r_const = 0.7010 * OFstatic_cast(
double, maxvalue);
114 const double g_const = 0.5291 * OFstatic_cast(
double, maxvalue);
115 const double b_const = 0.8859 * OFstatic_cast(
double, maxvalue);
116 register unsigned long l;
117 for (l = 0; l < 256; ++l)
119 rcr_tab[l] = OFstatic_cast(Sint16, 1.4020 * OFstatic_cast(
double, l) - r_const);
120 gcb_tab[l] = OFstatic_cast(Sint16, 0.3441 * OFstatic_cast(
double, l));
121 gcr_tab[l] = OFstatic_cast(Sint16, 0.7141 * OFstatic_cast(
double, l) - g_const);
122 bcb_tab[l] = OFstatic_cast(Sint16, 1.7720 * OFstatic_cast(
double, l) - b_const);
143 register const T1 *y = pixel;
144 register const T1 *cb = y + planeSize;
145 register const T1 *cr = cb + planeSize;
146 register unsigned long i = count;
150 for (l = planeSize; (l != 0) && (i != 0); --l, --i, ++y, ++cb, ++cr)
152 sr = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, rcr_tab[OFstatic_cast(Uint32, *cr)]);
153 sg = OFstatic_cast(Sint32, *y) - OFstatic_cast(Sint32, gcb_tab[OFstatic_cast(Uint32, *cb)]) - OFstatic_cast(Sint32, gcr_tab[OFstatic_cast(Uint32, *cr)]);
154 sb = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, bcb_tab[OFstatic_cast(Uint32, *cb)]);
155 *(r++) = (sr < 0) ? 0 : (sr > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sr);
156 *(g++) = (sg < 0) ? 0 : (sg > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sg);
157 *(b++) = (sb < 0) ? 0 : (sb > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sb);
167 register const T1 *p = pixel;
171 register unsigned long i;
172 for (i = count; i != 0; --i)
177 sr = OFstatic_cast(Sint32, y) + OFstatic_cast(Sint32, rcr_tab[OFstatic_cast(Uint32, cr)]);
178 sg = OFstatic_cast(Sint32, y) - OFstatic_cast(Sint32, gcb_tab[OFstatic_cast(Uint32, cb)]) - OFstatic_cast(Sint32, gcr_tab[OFstatic_cast(Uint32, cr)]);
179 sb = OFstatic_cast(Sint32, y) + OFstatic_cast(Sint32, bcb_tab[OFstatic_cast(Uint32, cb)]);
180 *(r++) = (sr < 0) ? 0 : (sr > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sr);
181 *(g++) = (sg < 0) ? 0 : (sg > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sg);
182 *(b++) = (sb < 0) ? 0 : (sb > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sb);
198 register unsigned long l;
199 register unsigned long i = count;
200 register const T1 *y = pixel;
201 register const T1 *cb = y + planeSize;
202 register const T1 *cr = cb + planeSize;
206 for (l = planeSize; (l != 0) && (i != 0); --l, --i)
208 convertValue(*(r++), *(g++), *(b++), removeSign(*(y++), offset), removeSign(*(cb++), offset),
209 removeSign(*(cr++), offset), maxvalue);
219 register const T1 *p = pixel;
223 register unsigned long i;
224 for (i = count; i != 0; --i)
226 y = removeSign(*(p++), offset);
227 cb = removeSign(*(p++), offset);
228 cr = removeSign(*(p++), offset);
229 convertValue(*(r++), *(g++), *(b++), y, cb, cr, maxvalue);
234 register const T1 *p = pixel;
251 register unsigned long l;
252 register unsigned long i = 0;
256 const unsigned long iStart = i;
257 for (
int j = 0; j < 3; ++j)
260 for (l = planeSize, i = iStart; (l != 0) && (i < count); --l, ++i)
261 this->
Data[j][i] = removeSign(*(p++), offset);
268 register unsigned long i;
269 for (i = 0; i < count; ++i)
270 for (j = 0; j < 3; ++j)
271 this->
Data[j][i] = removeSign(*(p++), offset);
279 inline void convertValue(T2 &red, T2 &green, T2 &blue,
const T2 y,
const T2 cb,
const T2 cr,
const T2 maxvalue)
281 double dr = OFstatic_cast(
double, y) + 1.4020 * OFstatic_cast(
double, cr) - 0.7010 * OFstatic_cast(
double, maxvalue);
282 double dg = OFstatic_cast(
double, y) - 0.3441 * OFstatic_cast(
double, cb) - 0.7141 * OFstatic_cast(
double, cr) + 0.5291 * OFstatic_cast(
double, maxvalue);
283 double db = OFstatic_cast(
double, y) + 1.7720 * OFstatic_cast(
double, cb) - 0.8859 * OFstatic_cast(
double, maxvalue);
284 red = (dr < 0.0) ? 0 : (dr > OFstatic_cast(
double, maxvalue)) ? maxvalue : OFstatic_cast(T2, dr);
285 green = (dg < 0.0) ? 0 : (dg > OFstatic_cast(
double, maxvalue)) ? maxvalue : OFstatic_cast(T2, dg);
286 blue = (db < 0.0) ? 0 : (db > OFstatic_cast(
double, maxvalue)) ? maxvalue : OFstatic_cast(T2, db);