00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
#ifndef DIYBRPXT_H
00035
#define DIYBRPXT_H
00036
00037
#include "osconfig.h"
00038
00039
#include "dicopxt.h"
00040
#include "dipxrept.h"
00041
#include "diinpx.h"
00042
00043
00044
00045
00046
00047
00050
template<
class T1,
class T2>
00051 class DiYBRPixelTemplate
00052 :
public DiColorPixelTemplate<T2>
00053 {
00054
00055
public:
00056
00066 DiYBRPixelTemplate(
const DiDocument *docu,
00067
const DiInputPixel *pixel,
00068 EI_Status &status,
00069
const unsigned long planeSize,
00070
const int bits,
00071
const OFBool rgb)
00072 :
DiColorPixelTemplate<T2>(docu, pixel, 3, status)
00073 {
00074
if ((pixel != NULL) && (this->Count > 0) && (status == EIS_Normal))
00075
convert(OFstatic_cast(
const T1 *, pixel->
getData()) + pixel->
getPixelStart(), planeSize, bits, rgb);
00076 }
00077
00080 virtual ~DiYBRPixelTemplate()
00081 {
00082 }
00083
00084
00085
private:
00086
00094 void convert(
const T1 *pixel,
00095
const unsigned long planeSize,
00096
const int bits,
00097
const OFBool rgb)
00098 {
00099
if (
Init(pixel))
00100 {
00101
const T1 offset = OFstatic_cast(T1, DicomImageClass::maxval(bits - 1));
00102
00103
00104
const unsigned long count = (this->InputCount < this->Count) ? this->InputCount : this->Count;
00105
if (rgb)
00106 {
00107
register T2 *r = this->Data[0];
00108
register T2 *g = this->Data[1];
00109
register T2 *b = this->Data[2];
00110
const T2 maxvalue = OFstatic_cast(T2, DicomImageClass::maxval(bits));
00111
DiPixelRepresentationTemplate<T1> rep;
00112
if (bits == 8 && !rep.
isSigned())
00113 {
00114 Sint16 rcr_tab[256];
00115 Sint16 gcb_tab[256];
00116 Sint16 gcr_tab[256];
00117 Sint16 bcb_tab[256];
00118
const double r_const = 0.7010 * OFstatic_cast(
double, maxvalue);
00119
const double g_const = 0.5291 * OFstatic_cast(
double, maxvalue);
00120
const double b_const = 0.8859 * OFstatic_cast(
double, maxvalue);
00121
register unsigned long l;
00122
for (l = 0; l < 256; ++l)
00123 {
00124 rcr_tab[l] = OFstatic_cast(Sint16, 1.4020 * OFstatic_cast(
double, l) - r_const);
00125 gcb_tab[l] = OFstatic_cast(Sint16, 0.3441 * OFstatic_cast(
double, l));
00126 gcr_tab[l] = OFstatic_cast(Sint16, 0.7141 * OFstatic_cast(
double, l) - g_const);
00127 bcb_tab[l] = OFstatic_cast(Sint16, 1.7720 * OFstatic_cast(
double, l) - b_const);
00128 }
00129
register Sint32 sr;
00130
register Sint32 sg;
00131
register Sint32 sb;
00132
if (this->PlanarConfiguration)
00133 {
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
register const T1 *y = pixel;
00149
register const T1 *cb = y + planeSize;
00150
register const T1 *cr = cb + planeSize;
00151
register unsigned long i = count;
00152
while (i != 0)
00153 {
00154
00155
for (l = planeSize; (l != 0) && (i != 0); --l, --i, ++y, ++cb, ++cr)
00156 {
00157 sr = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, rcr_tab[OFstatic_cast(Uint32, *cr)]);
00158 sg = OFstatic_cast(Sint32, *y) - OFstatic_cast(Sint32, gcb_tab[OFstatic_cast(Uint32, *cb)]) - OFstatic_cast(Sint32, gcr_tab[OFstatic_cast(Uint32, *cr)]);
00159 sb = OFstatic_cast(Sint32, *y) + OFstatic_cast(Sint32, bcb_tab[OFstatic_cast(Uint32, *cb)]);
00160 *(r++) = (sr < 0) ? 0 : (sr > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sr);
00161 *(g++) = (sg < 0) ? 0 : (sg > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sg);
00162 *(b++) = (sb < 0) ? 0 : (sb > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sb);
00163 }
00164
00165 y += 2 * planeSize;
00166 cb += 2 * planeSize;
00167 cr += 2 * planeSize;
00168 }
00169 }
00170
else
00171 {
00172
register const T1 *p = pixel;
00173
register T1 y;
00174
register T1 cb;
00175
register T1 cr;
00176
register unsigned long i;
00177
for (i = count; i != 0; --i)
00178 {
00179 y = *(p++);
00180 cb = *(p++);
00181 cr = *(p++);
00182 sr = OFstatic_cast(Sint32, y) + OFstatic_cast(Sint32, rcr_tab[OFstatic_cast(Uint32, cr)]);
00183 sg = OFstatic_cast(Sint32, y) - OFstatic_cast(Sint32, gcb_tab[OFstatic_cast(Uint32, cb)]) - OFstatic_cast(Sint32, gcr_tab[OFstatic_cast(Uint32, cr)]);
00184 sb = OFstatic_cast(Sint32, y) + OFstatic_cast(Sint32, bcb_tab[OFstatic_cast(Uint32, cb)]);
00185 *(r++) = (sr < 0) ? 0 : (sr > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sr);
00186 *(g++) = (sg < 0) ? 0 : (sg > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sg);
00187 *(b++) = (sb < 0) ? 0 : (sb > OFstatic_cast(Sint32, maxvalue)) ? maxvalue : OFstatic_cast(T2, sb);
00188 }
00189 }
00190 }
00191
else
00192 {
00193
if (this->PlanarConfiguration)
00194 {
00195
00196
00197
00198
00199
00200
00201
00202
00203
register unsigned long l;
00204
register unsigned long i = count;
00205
register const T1 *y = pixel;
00206
register const T1 *cb = y + planeSize;
00207
register const T1 *cr = cb + planeSize;
00208
while (i != 0)
00209 {
00210
00211
for (l = planeSize; (l != 0) && (i != 0); --l, --i)
00212 {
00213
convertValue(*(r++), *(g++), *(b++), removeSign(*(y++), offset), removeSign(*(cb++), offset),
00214 removeSign(*(cr++), offset), maxvalue);
00215 }
00216
00217 y += 2 * planeSize;
00218 cb += 2 * planeSize;
00219 cr += 2 * planeSize;
00220 }
00221 }
00222
else
00223 {
00224
register const T1 *p = pixel;
00225
register T2 y;
00226
register T2 cb;
00227
register T2 cr;
00228
register unsigned long i;
00229
for (i = count; i != 0; --i)
00230 {
00231 y = removeSign(*(p++), offset);
00232 cb = removeSign(*(p++), offset);
00233 cr = removeSign(*(p++), offset);
00234
convertValue(*(r++), *(g++), *(b++), y, cb, cr, maxvalue);
00235 }
00236 }
00237 }
00238 }
else {
00239
register const T1 *p = pixel;
00240
if (this->PlanarConfiguration)
00241 {
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
register unsigned long l;
00257
register unsigned long i = 0;
00258
while (i < count)
00259 {
00260
00261
const unsigned long iStart = i;
00262
for (
int j = 0; j < 3; ++j)
00263 {
00264
00265
for (l = planeSize, i = iStart; (l != 0) && (i < count); --l, ++i)
00266 this->Data[j][i] = removeSign(*(p++), offset);
00267 }
00268 }
00269 }
00270
else
00271 {
00272
register int j;
00273
register unsigned long i;
00274
for (i = 0; i < count; ++i)
00275
for (j = 0; j < 3; ++j)
00276 this->Data[j][i] = removeSign(*(p++), offset);
00277 }
00278 }
00279 }
00280 }
00281
00284 inline void convertValue(T2 &red, T2 &green, T2 &blue,
const T2 y,
const T2 cb,
const T2 cr,
const T2 maxvalue)
00285 {
00286
double dr = OFstatic_cast(
double, y) + 1.4020 * OFstatic_cast(
double, cr) - 0.7010 * OFstatic_cast(
double, maxvalue);
00287
double dg = OFstatic_cast(
double, y) - 0.3441 * OFstatic_cast(
double, cb) - 0.7141 * OFstatic_cast(
double, cr) + 0.5291 * OFstatic_cast(
double, maxvalue);
00288
double db = OFstatic_cast(
double, y) + 1.7720 * OFstatic_cast(
double, cb) - 0.8859 * OFstatic_cast(
double, maxvalue);
00289 red = (dr < 0.0) ? 0 : (dr > OFstatic_cast(
double, maxvalue)) ? maxvalue : OFstatic_cast(T2, dr);
00290 green = (dg < 0.0) ? 0 : (dg > OFstatic_cast(
double, maxvalue)) ? maxvalue : OFstatic_cast(T2, dg);
00291 blue = (db < 0.0) ? 0 : (db > OFstatic_cast(
double, maxvalue)) ? maxvalue : OFstatic_cast(T2, db);
00292 }
00293 };
00294
00295
00296
#endif
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357