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
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
#define _XIEC_MPARITH
00078
#define _XIEC_PARITH
00079
00080
00081
00082
00083
00084
00085
00086
00087
#include <X.h>
00088
#include <Xproto.h>
00089
00090
00091
00092
#include <XIE.h>
00093
#include <XIEproto.h>
00094
00095
00096
00097
#include <misc.h>
00098
#include <dixstruct.h>
00099
00100
00101
00102
#include <error.h>
00103
#include <macro.h>
00104
#include <element.h>
00105
#include <texstr.h>
00106
#include <xiemd.h>
00107
#include <memory.h>
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
#if defined(USE_EXPF)
00120
00121
00122
00123
00124
00125
# define exp expf
00126
# define log logf
00127
# define pow powf
00128
# define sqrt sqrtf
00129
#endif
00130
00131
#if defined(USE_FEXP)
00132
00133
00134
00135
00136
00137
# define exp fexp
00138
# define log flog
00139
# define pow fpow
00140
# define sqrt fsqrt
00141
#endif
00142
00143
00144
00145
00146
int miAnalyzeArith();
00147
int miAnalyzeMath();
00148
00149
00150
00151
00152
static int CreateArith();
00153
static int InitializeArith();
00154
static int ResetArith();
00155
static int DestroyArith();
00156
00157
static int ActivateArithMROI();
00158
static int ActivateArithDROI();
00159
static int SetupArith();
00160
static void ClearArith();
00161
00162
static int CreateMath();
00163
static int InitializeMath();
00164
static int SetupMath();
00165
00166
00167
00168
00169 static ddElemVecRec ArithVec = {
00170
CreateArith,
00171
InitializeArith,
00172 (
xieIntProc) NULL,
00173 (
xieIntProc) NULL,
00174
ResetArith,
00175
DestroyArith
00176 };
00177
00178 static ddElemVecRec MathVec = {
00179
CreateMath,
00180
InitializeMath,
00181
ActivateArithMROI,
00182 (
xieIntProc) NULL,
00183
ResetArith,
00184
DestroyArith
00185 };
00186
00187
00188
00189
00190
00191 typedef struct _mparithdef {
00192 void (*
action) ();
00193 void (*
passive) ();
00194 CARD32 *
lutptr;
00195 CARD32
nlev;
00196 CARD32
nclip;
00197 CARD32
iconstant;
00198 RealPixel fconstant;
00199 }
mpArithPvtRec, *
mpArithPvtPtr;
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
#define KEEP_LUTS
00211
00212
00213
00214
00215
00216 int miAnalyzeArith(flo,ped)
00217
floDefPtr flo;
00218
peDefPtr ped;
00219 {
00220 ped->
ddVec =
ArithVec;
00221
return TRUE;
00222 }
00223
00224 int miAnalyzeMath(flo,ped)
00225
floDefPtr flo;
00226
peDefPtr ped;
00227 {
00228 ped->
ddVec =
MathVec;
00229
return TRUE;
00230 }
00231
00232
00233
00234
00235 static int CreateArith(flo,ped)
00236
floDefPtr flo;
00237
peDefPtr ped;
00238 {
00239
00240
if (!
MakePETex(flo,ped,
00241 xieValMaxBands *
sizeof(
mpArithPvtRec),
00242 SYNC,
00243 NO_SYNC ))
00244
return FALSE;
00245
00246
#if defined(KEEP_LUTS)
00247
if (!
SetupArith(flo, ped, 0 ))
00248
return FALSE;
00249
#endif
00250
00251
return TRUE;
00252
00253 }
00254
00255 static int CreateMath(flo,ped)
00256
floDefPtr flo;
00257
peDefPtr ped;
00258 {
00259
00260
if (!
MakePETex(flo,ped,
00261 xieValMaxBands *
sizeof(
mpArithPvtRec),
00262 SYNC,
00263 NO_SYNC ))
00264
return FALSE;
00265
00266
#if defined(KEEP_LUTS)
00267
if (!
SetupMath(flo, ped, 0 ))
00268
return FALSE;
00269
#endif
00270
00271
return TRUE;
00272
00273 }
00274
00275
00276
00277
00278
00279 static int InitializeArith(flo,ped)
00280
floDefPtr flo;
00281
peDefPtr ped;
00282 {
00283 xieFloArithmetic *raw = (xieFloArithmetic *) ped->
elemRaw;
00284
peTexPtr pet = ped->
peTex;
00285
receptorPtr rcp = pet->
receptor;
00286 CARD8 msk = raw->bandMask;
00287
00288
#if !defined(KEEP_LUTS)
00289
if (!
SetupArith(flo, ped, 0 ))
00290
return FALSE;
00291
#endif
00292
00293 ped->
ddVec.
activate = raw->src2 ?
ActivateArithDROI :
ActivateArithMROI;
00294
00295
00296
if (raw->domainPhototag)
00297 rcp[ped->
inCnt-1].
band[0].
replicate = msk;
00298
00299
InitReceptor(flo, ped, &rcp[SRCt1], NO_DATAMAP, 1, msk, ~msk);
00300
00301
if (raw->src2)
00302
InitReceptor(flo, ped, &rcp[SRCt2], NO_DATAMAP, 1, msk, NO_BANDS);
00303
00304
InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX,
00305 raw->domainOffsetY);
00306
InitEmitter(flo, ped, NO_DATAMAP, SRCt1);
00307
00308
return !ferrCode(flo);
00309 }
00310
00311 static int InitializeMath(flo,ped)
00312
floDefPtr flo;
00313
peDefPtr ped;
00314 {
00315 xieFloMath *raw = (xieFloMath *) ped->
elemRaw;
00316
peTexPtr pet = ped->
peTex;
00317
receptorPtr rcp = pet->
receptor;
00318 CARD8 msk = raw->bandMask;
00319
00320
#if !defined(KEEP_LUTS)
00321
if (!
SetupMath(flo, ped, 0 ))
00322
return FALSE;
00323
#endif
00324
if (raw->domainPhototag)
00325 rcp[ped->
inCnt-1].
band[0].
replicate = msk;
00326
InitReceptor(flo, ped, &rcp[SRCt1], NO_DATAMAP, 1, msk, ~msk);
00327
InitProcDomain(flo, ped, raw->domainPhototag, raw->domainOffsetX,
00328 raw->domainOffsetY);
00329
InitEmitter(flo, ped, NO_DATAMAP, SRCt1);
00330
00331
return !ferrCode(flo);
00332 }
00333
00334
00335
00336
00337
00338 static int ActivateArithMROI(flo,ped,pet)
00339
floDefPtr flo;
00340
peDefPtr ped;
00341
peTexPtr pet;
00342 {
00343
mpArithPvtPtr pvt = (
mpArithPvtPtr) pet->
private;
00344
int band, nbands = pet->
receptor[SRCt1].
inFlo->
bands;
00345
bandPtr sband = &(pet->
receptor[SRCt1].
band[0]);
00346
bandPtr dband = &(pet->
emitter[0]);
00347
00348
for(
band = 0;
band < nbands;
band++,
pvt++, sband++, dband++) {
00349
pointer svoid, dvoid;
00350
00351
if (!(pet->
scheduled & 1<<
band))
continue;
00352
00353
if (!(svoid = GetCurrentSrc(flo,pet,sband)) ||
00354 !(dvoid = GetCurrentDst(flo,pet,dband)))
continue;
00355
00356
while (!ferrCode(flo) && svoid && dvoid &&
00357 SyncDomain(flo,ped,dband,FLUSH)) {
00358
INT32 run, ix = 0;
00359
00360
while (run = GetRun(flo,pet,dband)) {
00361
if (run > 0) {
00362 (*(
pvt->
action)) (dvoid, svoid, run, ix,
pvt);
00363 ix += run;
00364 }
else {
00365
if (dvoid != svoid)
00366 (*(
pvt->passive)) (dvoid, svoid, -run, ix);
00367 ix -= run;
00368 }
00369 }
00370 svoid = GetNextSrc(flo,pet,sband,FLUSH);
00371 dvoid = GetNextDst(flo,pet,dband,FLUSH);
00372 }
00373
00374 FreeData(flo, pet, sband, sband->current);
00375 }
00376
return TRUE;
00377 }
00378
00379 static int ActivateArithDROI(flo,ped,pet)
00380
floDefPtr flo;
00381
peDefPtr ped;
00382
peTexPtr pet;
00383 {
00384
mpArithPvtPtr pvt = (
mpArithPvtPtr) pet->
private;
00385
int band, nbands = pet->
receptor[SRCt1].
inFlo->
bands;
00386
bandPtr sband = &(pet->
receptor[SRCt1].
band[0]);
00387
bandPtr tband = &(pet->
receptor[SRCt2].
band[0]);
00388
bandPtr dband = &(pet->
emitter[0]);
00389
00390
for(
band = 0;
band < nbands;
band++,
pvt++, sband++, tband++, dband++) {
00391
pointer svoid, tvoid, dvoid;
00392 CARD32
w;
00393
00394
if (!(pet->
scheduled & 1<<
band))
continue;
00395
00396
w = sband->format->width;
00397
if (
w > tband->format->width)
w = tband->format->width;
00398
00399
if (!(svoid = GetCurrentSrc(flo,pet,sband)) ||
00400 !(tvoid = GetCurrentSrc(flo,pet,tband)) ||
00401 !(dvoid = GetCurrentDst(flo,pet,dband)))
continue;
00402
00403
while (!ferrCode(flo) && svoid && tvoid && dvoid &&
00404 SyncDomain(flo,ped,dband,FLUSH)) {
00405
INT32 run, ix = 0;
00406
00407
while (run = GetRun(flo,pet,dband)) {
00408
if (run > 0) {
00409
00410
if ((ix + run) >
w) {
00411
if (ix <
w)
00412 (*(
pvt->
action)) (dvoid,svoid,tvoid,
w-ix, ix,
pvt);
00413
if (dvoid != svoid) {
00414 run = sband->format->width -
w;
00415
if (run > 0)
00416 (*(
pvt->passive)) (dvoid, svoid, run,
w);
00417 }
00418
break;
00419 }
00420 (*(
pvt->
action)) (dvoid, svoid, tvoid, run, ix,
pvt);
00421 ix += run;
00422 }
else {
00423
if (dvoid != svoid)
00424 (*(
pvt->passive)) (dvoid, svoid, -run, ix);
00425 ix -= run;
00426 }
00427 }
00428 svoid = GetNextSrc(flo,pet,sband,FLUSH);
00429 tvoid = GetNextSrc(flo,pet,tband,FLUSH);
00430 dvoid = GetNextDst(flo,pet,dband,FLUSH);
00431 }
00432
00433
if(!svoid && sband->final) {
00434 DisableSrc(flo,pet,tband,FLUSH);
00435 }
else if(!tvoid && tband->final) {
00436 BypassSrc(flo,pet,sband);
00437 }
else {
00438
00439 FreeData(flo,pet,sband,sband->current);
00440 FreeData(flo,pet,tband,tband->current);
00441 }
00442 }
00443
return TRUE;
00444 }
00445
00446
00447
00448
00449 static int ResetArith(flo,ped)
00450
floDefPtr flo;
00451
peDefPtr ped;
00452 {
00453
00454
#if !defined(KEEP_LUTS)
00455
ClearArith(flo,ped);
00456
#endif
00457
00458
ResetReceptors(ped);
00459
ResetProcDomain(ped);
00460
ResetEmitter(ped);
00461
return TRUE;
00462 }
00463
00464
00465
00466
00467 static int DestroyArith(flo,ped)
00468
floDefPtr flo;
00469
peDefPtr ped;
00470 {
00471
00472
#if defined(KEEP_LUTS)
00473
ClearArith(flo,ped);
00474
#endif
00475
00476
00477 ped->
peTex = (
peTexPtr)
XieFree(ped->
peTex);
00478
00479
00480 ped->
ddVec.
create = (
xieIntProc)NULL;
00481 ped->
ddVec.
initialize = (
xieIntProc)NULL;
00482 ped->
ddVec.
activate = (
xieIntProc)NULL;
00483 ped->
ddVec.
reset = (
xieIntProc)NULL;
00484 ped->
ddVec.
destroy = (
xieIntProc)NULL;
00485
00486
return TRUE;
00487 }
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
#define NADA 0
00516
00517
#define AADD D = S1 + S2; if (D >= nlev) D = nlev - 1;
00518
#define ASUB D = (S1 > S2) ? S1 - S2 : 0;
00519
#define ASUBREV D = (S2 > S1) ? S2 - S1 : 0;
00520
#define AMIN D = S1 < S2 ? S1 : S2;
00521
#define AMAX D = S1 > S2 ? S1 : S2;
00522
00523
00524
#define FADD D = S1 + S2;
00525
#define FSUB D = S1 - S2;
00526
#define FSUBREV D = S2 - S1;
00527
#define FMUL D = S1 * S2;
00528
#define FDIV D = S1 / S2;
00529
#define FDIVREV D = S1 ? S2 / S1 : S2;
00530
#define FMIN D = S1 < S2 ? S1 : S2;
00531
#define FMAX D = S1 > S2 ? S1 : S2;
00532
00533
00534
#define FGAM D = pow(S1,S2);
00535
#define IFGAM D = (nlev - 1) * pow(S1/(nlev-1),S2);
00536
00537
#define BADD D = S1 | S2;
00538
#define BSUB D = S1 & ~S2;
00539
#define BSUBREV D = S2 & ~S1;
00540
#define BMUL D = S1 & S2;
00541
#define BDIV D = S1;
00542
#define BDIVREV D = S2;
00543
#define BMIN D = S1 & S2;
00544
#define BMAX D = S1 | S2;
00545
#define BGAM D = S1;
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
#define MakeLutI(name1, expr) \
00556
static void name1(pvt) \
00557
mpArithPvtPtr pvt; \
00558
{ \
00559
CARD32 *lut = pvt->lutptr; \
00560
CARD32 nlev = pvt->nlev; \
00561
CARD32 nclip = pvt->nclip; \
00562
CARD32 i; \
00563
CARD32 D, S1, S2 = pvt->iconstant; \
00564
for ( i = 0; i < nlev ; i++) { \
00565
S1 = i; \
00566
expr; \
00567
lut[i] = D; \
00568
} \
00569
for ( ; i < nclip ; i++) { \
00570
lut[i] = 0; \
00571
} \
00572
}
00573
00574
#define MakeLutF2(name1, expr) \
00575
static void name1(pvt) \
00576
mpArithPvtPtr pvt; \
00577
{ \
00578
CARD32 *lut = pvt->lutptr; \
00579
CARD32 nlev = pvt->nlev; \
00580
CARD32 nclip = pvt->nclip; \
00581
RealPixel Half = (RealPixel) .5; \
00582
RealPixel dlev = (RealPixel) nlev - Half; \
00583
RealPixel D, S1, S2 = pvt->fconstant; \
00584
CARD32 i; \
00585
for ( i = 0; i < nlev ; i++) { \
00586
S1 = i; \
00587
expr; \
00588
D += .5; \
00589
if (D < 0.) D = 0; \
00590
else if (D > dlev) D = dlev; \
00591
lut[i] = D; \
00592
} \
00593
for ( ; i < nclip ; i++) { \
00594
lut[i] = 0; \
00595
} \
00596
}
00597
00598
#define MakeLutF1(name1, expr) \
00599
static void name1(pvt) \
00600
mpArithPvtPtr pvt; \
00601
{ \
00602
CARD32 *lut = pvt->lutptr; \
00603
CARD32 nlev = pvt->nlev; \
00604
CARD32 nclip = pvt->nclip; \
00605
RealPixel Half = (RealPixel) .5; \
00606
RealPixel dlev = (RealPixel) nlev - Half; \
00607
RealPixel D, S1; \
00608
CARD32 i; \
00609
for ( i = 0; i < nlev ; i++) { \
00610
S1 = i; \
00611
expr; \
00612
D += .5; \
00613
if (D < 0.) D = 0; \
00614
else if (D > dlev) D = dlev; \
00615
lut[i] = D; \
00616
} \
00617
for ( ; i < nclip ; i++) { \
00618
lut[i] = 0; \
00619
} \
00620
}
00621
00622
#define MakeLook(name1, itype) \
00623
static void name1(dst1,src1,nx,x,pvt) \
00624
pointer dst1, src1; \
00625
CARD32 nx, x; \
00626
mpArithPvtPtr pvt; \
00627
{ \
00628
itype *dst = ((itype *) dst1) + x; \
00629
itype *src = ((itype *) src1) + x; \
00630
CARD32 *lut = pvt->lutptr; \
00631
CARD32 nmask = pvt->nclip - 1; \
00632
for ( ; nx > 0 ; nx--) { \
00633
*dst++ = lut[*src++ & nmask]; \
00634
} \
00635
}
00636
00637 MakeLutI(pr_a, AADD )
00638 MakeLutI(pr_s, ASUB )
00639 MakeLutI(pr_sr, ASUBREV )
00640 MakeLutI(pr_mn, AMIN )
00641 MakeLutI(pr_mx, AMAX )
00642
00643 MakeLutF2(pr_m, FMUL )
00644 MakeLutF2(pr_d, FDIV )
00645 MakeLutF2(pr_dr, FDIVREV )
00646 MakeLutF2(pr_gm, IFGAM )
00647
00648 static
void (*prep_mono[xieValGamma])() = {
00649 pr_a, pr_s, pr_sr, pr_m, pr_d, pr_dr, pr_mn, pr_mx, pr_gm
00650 };
00651
00652 MakeLook(lr_B, BytePixel)
00653 MakeLook(lr_P, PairPixel)
00654 MakeLook(lr_Q, QuadPixel)
00655
00656 static
void (*action_lut[5])() = {
00657 NADA,
00658 NADA,
00659 lr_B,
00660 lr_P,
00661 lr_Q
00662 };
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
#define MakePixI(name1, itype, expr) \
00683
static void name1(dst1,src1,nx,x,pvt) \
00684
pointer dst1, src1; \
00685
CARD32 nx, x; \
00686
mpArithPvtPtr pvt; \
00687
{ \
00688
itype *dst = (itype *) dst1; \
00689
itype *src = (itype *) src1; \
00690
CARD32 nlev = pvt->nlev; \
00691
CARD32 D, S1, S2 = (itype) pvt->iconstant; \
00692
for ( ; nx > 0 ; nx--, x++) { \
00693
S1 = src[x]; \
00694
expr \
00695
dst[x] = D; \
00696
} \
00697
}
00698
00699
#define MakePixF2(name1, itype, expr) \
00700
static void name1(dst1,src1,nx,x,pvt) \
00701
pointer dst1, src1; \
00702
CARD32 nx, x; \
00703
mpArithPvtPtr pvt; \
00704
{ \
00705
itype *dst = (itype *) dst1; \
00706
itype *src = (itype *) src1; \
00707
RealPixel Half = (RealPixel) .5; \
00708
RealPixel dlev = (RealPixel) pvt->nlev - Half; \
00709
RealPixel D, S1, S2 = (itype) pvt->fconstant; \
00710
for ( ; nx > 0 ; nx--, x++) { \
00711
S1 = (RealPixel) src[x]; \
00712
expr \
00713
D += Half; \
00714
if (D < 0.) D = 0; \
00715
else if (D > dlev) D = dlev; \
00716
dst[x] = (itype) D; \
00717
} \
00718
}
00719
00720
#define MakePixF1(name1, itype, expr) \
00721
static void name1(dst1,src1,nx,x,pvt) \
00722
pointer dst1, src1; \
00723
CARD32 nx, x; \
00724
mpArithPvtPtr pvt; \
00725
{ \
00726
itype *dst = (itype *) dst1; \
00727
itype *src = (itype *) src1; \
00728
RealPixel Half = (RealPixel) .5; \
00729
RealPixel dlev = (RealPixel) pvt->nlev - Half; \
00730
RealPixel D, S1; \
00731
for ( ; nx > 0 ; nx--, x++) { \
00732
S1 = (RealPixel) src[x]; \
00733
expr \
00734
D += Half; \
00735
if (D < 0.) D = 0; \
00736
else if (D > dlev) D = dlev; \
00737
dst[x] = (itype) D; \
00738
} \
00739
}
00740
00741
#define DakePix(name2, itype, expr) \
00742
static void name2(dst1,src1,src2,nx,x,pvt) \
00743
pointer dst1, src1, src2; \
00744
CARD32 nx, x; \
00745
mpArithPvtPtr pvt; \
00746
{ \
00747
itype *dst = ((itype *) dst1) + x; \
00748
itype *src = ((itype *) src1) + x; \
00749
itype *trc = ((itype *) src2) + x; \
00750
CARD32 nlev = pvt->nlev; \
00751
CARD32 D, S1, S2; \
00752
for ( ; nx > 0 ; nx--) { \
00753
S1 = *src++; \
00754
S2 = *trc++; \
00755
expr \
00756
*dst++ = D; \
00757
} \
00758
}
00759
00760
#define MakeFlt2(name1, expr) \
00761
static void name1(dst1,src1,nx,x,pvt) \
00762
pointer dst1, src1; \
00763
CARD32 nx, x; \
00764
mpArithPvtPtr pvt; \
00765
{ \
00766
RealPixel *dst = ((RealPixel *) dst1) + x; \
00767
RealPixel *src = ((RealPixel *) src1) + x; \
00768
RealPixel D, S1, S2 = pvt->fconstant; \
00769
for ( ; nx > 0 ; nx--) { \
00770
S1 = *src++; \
00771
expr \
00772
*dst++ = D; \
00773
} \
00774
}
00775
00776
#define MakeFlt1(name1, expr) \
00777
static void name1(dst1,src1,nx,x,pvt) \
00778
pointer dst1, src1; \
00779
CARD32 nx, x; \
00780
mpArithPvtPtr pvt; \
00781
{ \
00782
RealPixel *dst = ((RealPixel *) dst1) + x; \
00783
RealPixel *src = ((RealPixel *) src1) + x; \
00784
RealPixel D, S1; \
00785
for ( ; nx > 0 ; nx--) { \
00786
S1 = *src++; \
00787
expr \
00788
*dst++ = D; \
00789
} \
00790
}
00791
00792
#define DakeFlt(name2, expr) \
00793
static void name2(dst1,src1,src2,nx,x,pvt) \
00794
pointer dst1, src1, src2; \
00795
CARD32 nx, x; \
00796
mpArithPvtPtr pvt; \
00797
{ \
00798
RealPixel *dst = ((RealPixel *) dst1) + x; \
00799
RealPixel *src = ((RealPixel *) src1) + x; \
00800
RealPixel *trc = ((RealPixel *) src2) + x; \
00801
RealPixel D, S1, S2; \
00802
for ( ; nx > 0 ; nx--) { \
00803
S1 = *src++; \
00804
S2 = *trc++; \
00805
expr \
00806
*dst++ = D; \
00807
} \
00808
}
00809
00810
00811
#define mr_b_a NADA
00812
#define mr_b_s NADA
00813
#define mr_b_sr NADA
00814
#define mr_b_m NADA
00815
#define mr_b_d NADA
00816
#define mr_b_dr NADA
00817
#define mr_b_mn NADA
00818
#define mr_b_mx NADA
00819
#define mr_b_gm NADA
00820
00821
#define dr_b_a NADA
00822
#define dr_b_s NADA
00823
#define dr_b_sr NADA
00824
#define dr_b_mn NADA
00825
#define dr_b_mx NADA
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838 DakePix (dr_B_a, BytePixel, AADD )
00839 DakePix (dr_B_s, BytePixel, ASUB )
00840 DakePix (dr_B_sr, BytePixel, ASUBREV )
00841 DakePix (dr_B_mn, BytePixel, AMIN )
00842 DakePix (dr_B_mx, BytePixel, AMAX )
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855 DakePix (dr_P_a, PairPixel, AADD )
00856 DakePix (dr_P_s, PairPixel, ASUB )
00857 DakePix (dr_P_sr, PairPixel, ASUBREV )
00858 DakePix (dr_P_mn, PairPixel, AMIN )
00859 DakePix (dr_P_mx, PairPixel, AMAX )
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872 DakePix (dr_Q_a, QuadPixel, AADD )
00873 DakePix (dr_Q_s, QuadPixel, ASUB )
00874 DakePix (dr_Q_sr, QuadPixel, ASUBREV )
00875 DakePix (dr_Q_mn, QuadPixel, AMIN )
00876 DakePix (dr_Q_mx, QuadPixel, AMAX )
00877
00878 MakeFlt2 (mr_R_a, FADD )
00879 MakeFlt2 (mr_R_s, FSUB )
00880 MakeFlt2 (mr_R_sr, FSUBREV )
00881 MakeFlt2 (mr_R_m, FMUL )
00882 MakeFlt2 (mr_R_d, FDIV )
00883 MakeFlt2 (mr_R_dr, FDIVREV )
00884 MakeFlt2 (mr_R_mn, FMIN )
00885 MakeFlt2 (mr_R_mx, FMAX )
00886 MakeFlt2 (mr_R_gm, FGAM )
00887
00888 DakeFlt (dr_R_a, FADD )
00889 DakeFlt (dr_R_s, FSUB )
00890 DakeFlt (dr_R_sr, FSUBREV )
00891 DakeFlt (dr_R_mn, FMIN )
00892 DakeFlt (dr_R_mx, FMAX )
00893
00894
00895
00896
00897
00898 static
void (*action_monoROI[5][xieValGamma])() = {
00899 mr_R_a, mr_R_s, mr_R_sr, mr_R_m, mr_R_d, mr_R_dr, mr_R_mn, mr_R_mx, mr_R_gm,
00900 mr_b_a, mr_b_s, mr_b_sr, mr_b_m, mr_b_d, mr_b_dr, mr_b_mn, mr_b_mx, mr_b_gm,
00901 NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA,
00902 NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA,
00903 NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA, NADA
00904 };
00905
00906 static void (*action_dyadROI[5][xieValGamma])() = {
00907 dr_R_a, dr_R_s, dr_R_sr, NADA, NADA, NADA, dr_R_mn, dr_R_mx, NADA,
00908 dr_b_a, dr_b_s, dr_b_sr, NADA, NADA, NADA, dr_b_mn, dr_b_mx, NADA,
00909 dr_B_a, dr_B_s, dr_B_sr, NADA, NADA, NADA, dr_B_mn, dr_B_mx, NADA,
00910 dr_P_a, dr_P_s, dr_P_sr, NADA, NADA, NADA, dr_P_mn, dr_P_mx, NADA,
00911 dr_Q_a, dr_Q_s, dr_Q_sr, NADA, NADA, NADA, dr_Q_mn, dr_Q_mx, NADA
00912 };
00913
00914
00915 extern void (*passive_copy[5])();
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
#ifndef M_LOG2E
00960
#define M_LOG2E 1.4426950408889634074
00961
#endif
00962
00963
#ifndef M_LOG10E
00964
#define M_LOG10E 0.43429448190325182765
00965
#endif
00966
00967
#ifndef LN_MAXFLOAT
00968
#define LN_MAXFLOAT 88.7228394
00969
#endif
00970
00971
#ifndef MAXFLOAT
00972
#define MAXFLOAT ((float)3.40282346638528860e+38)
00973
#endif
00974
00975
#define BANY D = S1;
00976
#define FEXP D = (S1 <= (LN_MAXFLOAT-2.) ? exp(S1) : MAXFLOAT);
00977
#define FLGN D = (S1 > 0. ? log(S1) : 0. );
00978
#define FLG2 D = (S1 > 0. ? log(S1) * M_LOG2E : 0. );
00979
#define FLG10 D = (S1 > 0. ? log(S1) * M_LOG10E : 0. );
00980
#define FSQR D = S1 * S1;
00981
#define FSQRT D = (S1 >= 0. ? sqrt(S1) : 0. );
00982
00983 MakeLutF1(mpr_exp, FEXP )
00984 MakeLutF1(mpr_lgN, FLGN )
00985 MakeLutF1(mpr_lg2, FLG2 )
00986 MakeLutF1(mpr_lg10, FLG10)
00987 MakeLutF1(mpr_sqr, FSQR )
00988 MakeLutF1(mpr_sqrt, FSQRT)
00989
00990
00991
00992 #define m_b_exp NADA
00993 #define m_b_lgN NADA
00994 #define m_b_lg2 NADA
00995 #define m_b_lg10 NADA
00996 #define m_b_sqr NADA
00997 #define m_b_sqrt NADA
00998
00999 MakePixF1 (m_P_sqr, PairPixel, FSQR)
01000 MakePixF1 (m_Q_sqr, QuadPixel, FSQR)
01001
01002 MakeFlt1 (m_R_exp, FEXP )
01003 MakeFlt1 (m_R_lgN, FLGN )
01004 MakeFlt1 (m_R_lg2, FLG2 )
01005 MakeFlt1 (m_R_lg10, FLG10 )
01006 MakeFlt1 (m_R_sqr, FSQR )
01007 MakeFlt1 (m_R_sqrt, FSQRT )
01008
01009 static
void (*action_mathROI[5][xieValSqrt])() = {
01010
01011 m_R_exp, m_R_lgN, m_R_lg2, m_R_lg10, m_R_sqr, m_R_sqrt,
01012 m_b_exp, m_b_lgN, m_b_lg2, m_b_lg10, m_b_sqr, m_b_sqrt,
01013 NADA, NADA, NADA, NADA, NADA, NADA,
01014 NADA, NADA, NADA, NADA, m_P_sqr, NADA,
01015 NADA, NADA, NADA, NADA, m_Q_sqr, NADA
01016
01017 };
01018
01019 static void (*prep_math[xieValSqrt])() = {
01020 mpr_exp, mpr_lgN, mpr_lg2, mpr_lg10, mpr_sqr, mpr_sqrt
01021 };
01022
01023
01024
01025
01026
01027 static int SetupArith(flo,ped,modify)
01028
floDefPtr flo;
01029
peDefPtr ped;
01030
int modify;
01031 {
01032 xieFloArithmetic *raw = (xieFloArithmetic *) ped->
elemRaw;
01033
peTexPtr pet = ped->
peTex;
01034
pArithDefPtr epvt = (
pArithDefPtr) ped->
elemPvt;
01035
mpArithPvtPtr pvt = (
mpArithPvtPtr) pet->
private;
01036
receptorPtr rcp = pet->
receptor;
01037 CARD32 nbands = rcp[SRCt1].
inFlo->
bands;
01038
bandPtr sband = &(rcp[SRCt1].band[0]);
01039
bandPtr tband = &(rcp[SRCt2].
band[0]);
01040
bandPtr dband = &(pet->
emitter[0]);
01041 CARD32
band;
01042
01043
for (
band=0;
band<nbands;
band++,
pvt++, sband++, tband++, dband++) {
01044 CARD32 iclass = IndexClass(sband->format->class);
01045 void (*
act)() = 0;
01046
01047
if ((raw->bandMask & (1<<
band)) == 0)
01048
continue;
01049
01050
if (!raw->src2)
01051
pvt->fconstant = (
RealPixel) epvt->
constant[
band];
01052
01053
switch(raw->operator) {
01054
case xieValDiv:
if (
pvt->fconstant == 0.0)
01055
pvt->fconstant = 1.0;
01056
break;
01057 }
01058
01059
if (IsConstrained(sband->format->class)) {
01060
pvt->nlev = sband->format->levels;
01061
if (!raw->src2) {
01062 CARD32 deep;
01063 SetDepthFromLevels(
pvt->nlev,deep);
pvt->nclip = 1 << deep;
01064
01065
pvt->iconstant = ConstrainConst(epvt->
constant[
band],
pvt->nlev);
01066 }
01067 }
01068
01069
01070
if (!
act && raw->src2)
01071
act =
action_dyadROI[iclass][raw->operator-1];
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
if (!
act && !raw->src2)
01086
act = action_monoROI[iclass][raw->operator-1];
01087
01088
01089
if (!
act && !raw->src2) {
01090
act = action_lut[iclass];
01091
if (
act) {
01092
01093
if (!(
pvt->lutptr = (CARD32 *)
01094
XieMalloc(
pvt->nclip *
sizeof(CARD32))))
01095 AllocError(flo,ped,
return(FALSE));
01096 (*prep_mono[raw->operator-1]) (
pvt);
01097 }
01098 }
01099
01100
if (!
act)
01101 ImplementationError(flo,ped,
return(FALSE));
01102
pvt->
action =
act;
01103
pvt->passive =
passive_copy[iclass];
01104 }
01105
return TRUE;
01106 }
01107
01108 static int SetupMath(flo,ped,modify)
01109
floDefPtr flo;
01110
peDefPtr ped;
01111
int modify;
01112 {
01113 xieFloMath *raw = (xieFloMath *) ped->
elemRaw;
01114
peTexPtr pet = ped->
peTex;
01115
mpArithPvtPtr pvt = (
mpArithPvtPtr) pet->
private;
01116
receptorPtr rcp = pet->
receptor;
01117 CARD32 nbands = rcp[SRCt1].
inFlo->
bands;
01118
bandPtr sband = &(rcp[SRCt1].band[0]);
01119
bandPtr dband = &(pet->
emitter[0]);
01120 CARD32
band;
01121
01122
for (
band=0;
band<nbands;
band++,
pvt++, sband++, dband++) {
01123 CARD32 iclass = IndexClass(sband->format->class);
01124 void (*
act)() = 0;
01125
01126
if ((raw->bandMask & (1<<
band)) == 0)
01127
continue;
01128
01129
if (IsConstrained(sband->format->class)) {
01130 CARD32 deep;
01131
pvt->nlev = sband->format->levels;
01132 SetDepthFromLevels(
pvt->nlev,deep);
pvt->nclip = 1 << deep;
01133 }
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
if (!
act)
01148
act = action_mathROI[iclass][raw->operator-1];
01149
01150
01151
if (!
act) {
01152
act = action_lut[iclass];
01153
if (
act) {
01154
01155
if (!(
pvt->lutptr = (CARD32 *)
01156
XieMalloc(
pvt->nclip *
sizeof(CARD32))))
01157 AllocError(flo,ped,
return(FALSE));
01158 (*
prep_math[raw->operator-1]) (
pvt);
01159 }
01160 }
01161
if (!
act)
01162 ImplementationError(flo,ped,
return(FALSE));
01163
01164
pvt->
action =
act;
01165
pvt->passive =
passive_copy[iclass];
01166 }
01167
return TRUE;
01168 }
01169
01170 static void ClearArith(flo,ped)
01171
floDefPtr flo;
01172
peDefPtr ped;
01173 {
01174
mpArithPvtPtr pvt = (
mpArithPvtPtr) (ped->
peTex->
private);
01175
int band;
01176
01177
01178
if (
pvt)
01179
for (
band = 0 ;
band < xieValMaxBands ;
band++,
pvt++)
01180
if (
pvt->lutptr)
01181
pvt->lutptr = (CARD32 *)
XieFree(
pvt->lutptr);
01182
01183 }
01184
01185