00044 {
00045
LH_UINT8 * inputData[8], *outputData[8];
00046
UINT32 OutputIncrement, inputDataRowOffset, outputDataRowOffset, Pixelcount, LineCount;
00047
register unsigned long adr0;
00048
register unsigned long ko0;
00049
unsigned long accu[8];
00050
register long i;
00051
00052
00053
register long aAlutShift,aElutOffset,aAlutOffset;
00054
register long aElutWordSize;
00055
register long aAlutWordSize;
00056
register long aXlutAdrSize;
00057
register long aXlutAdrShift;
00058
register unsigned long aXlutWordSize;
00059
register unsigned long ii,jj;
00060
register long aOutputPackMode8Bit;
00061
long ein_Cache[8];
00062
00063
LH_UINT16 * aus_lut = (
LH_UINT16*)lutParam->
outputLut;
00064
LH_UINT16 * ein_lut = (
LH_UINT16*)lutParam->
inputLut;
00065
LH_UINT16 * Xlut = (
LH_UINT16*)lutParam->
colorLut;
00066
00067
#ifdef DEBUG_OUTPUT
00068
long err =
noErr;
00069
#endif
00070
LH_START_PROC(
"Calc323Dim_Data8To8_Lut16")
00071
00072 inputData[0] = (LH_UINT8 *)calcParam->inputData[0];
00073 inputData[1] = (LH_UINT8 *)calcParam->inputData[1];
00074 inputData[2] = (LH_UINT8 *)calcParam->inputData[2];
00075 #if NDIM_IN_DIM == 4
00076 inputData[3] = (LH_UINT8 *)calcParam->inputData[3];
00077 #endif
00078 outputData[0] = (LH_UINT8 *)calcParam->outputData[0];
00079 outputData[1] = (LH_UINT8 *)calcParam->outputData[1];
00080 outputData[2] = (LH_UINT8 *)calcParam->outputData[2];
00081 #if NDIM_OUT_DIM == 4
00082 outputData[3] = (LH_UINT8 *)calcParam->outputData[3];
00083 #endif
00084
00085 OutputIncrement = calcParam->cmOutputPixelOffset;
00086 inputDataRowOffset = calcParam->cmInputBytesPerLine - calcParam->cmPixelPerLine * calcParam->cmInputPixelOffset + (NDIM_IN_DIM * 2);
00087 outputDataRowOffset = calcParam->cmOutputBytesPerLine - calcParam->cmPixelPerLine * calcParam->cmOutputPixelOffset + OutputIncrement;
00088
00089 Pixelcount = calcParam->cmPixelPerLine;
00090 LineCount = calcParam->cmLineCount;
00091
00092 aElutWordSize = lutParam->inputLutWordSize;
00093 aAlutWordSize = lutParam->outputLutWordSize;
00094 aXlutAdrSize = lutParam->colorLutGridPoints;
00095 for ( i = 1; (i < 32) && (aXlutAdrSize >> i); i++)
00096 aXlutAdrShift = i;
00097 aXlutWordSize = lutParam->colorLutWordSize;
00098
00099 aOutputPackMode8Bit = calcParam->cmOutputColorSpace & cm8PerChannelPacking || calcParam->cmOutputColorSpace & cmLong8ColorPacking;
00100
00101 #if FARBR_FILES
00102 WriteLuts( "DoNDim",1,adr_bereich_elut,aElutWordSize,ein_lut,
00103 NDIM_IN_DIM,NDIM_OUT_DIM,aXlutAdrSize,aXlutWordSize,(LH_UINT16 *)Xlut,adr_bereich_alut,aAlutWordSize,(LH_UINT16 *)aus_lut);
00104 #endif
00105
00106 i=0;
00107
00108 {
00109
if(
aElutShift < 0 )
00110 {
00111
#ifdef DEBUG_OUTPUT
00112
DebugPrint(
"¥ DoNDim-Error: aElutShift < 0 (aElutShift = %d)\n",aElutShift);
00113
#endif
00114
return cmparamErr;
00115 }
00116 }
00117
00118
if( aOutputPackMode8Bit ){
00119 aAlutShift = (aAlutWordSize-8);
00120 }
00121
else{
00122 aAlutShift = (16 - aAlutWordSize);
00123 }
00124
00125
#ifdef DEBUG_OUTPUT
00126
if ( DebugCheck(kThisFile, kDebugReserved1) ){
00127
DebugPrint(
"aElutAdrSize=%lx,aElutAdrShift=%lx,aElutWordSize=%lx,ein_lut=%lx,\n",
00128 adr_bereich_elut,adr_breite_elut,aElutWordSize,ein_lut);
00129
DebugPrint(
"aAlutAdrSize=%lx,aAlutAdrShift=%lx,aAlutWordSize=%lx,aus_lut=%lx,\n",
00130 adr_bereich_alut,adr_breite_alut,aAlutWordSize,aus_lut);
00131
DebugPrint(
"aXlutInDim=%lx,aXlutOutDim=%lx,aXlutAdrSize=%lx,aXlutAdrShift=%lx,aXlutWordSize=%lx,Xlut=%lx,\n",
00132 NDIM_IN_DIM,NDIM_OUT_DIM,aXlutAdrSize,aXlutAdrShift,aXlutWordSize,Xlut);
00133 }
00134
#endif
00135
00136
00137
if( aXlutAdrSize != (1<<aXlutAdrShift )){
00138
register long aXlutOffset;
00139
long theXlutOffsets[8];
00140
register unsigned long aAlutInShift;
00141
register long aAlutInShiftRemainder;
00142
register unsigned long aAlutInShiftNum;
00143
register long aElutWordSizeMask = (1<<aElutWordSize) - 1;
00144
register unsigned long aAlutRound;
00145 aAlutInShift = aXlutWordSize + aElutWordSize -
adr_breite_alut;
00146 aAlutInShiftRemainder = 0;
00147
if( aAlutInShift > 16 ){
00148 aAlutInShiftRemainder = aAlutInShift - 16;
00149 aAlutInShift = 16;
00150 }
00151 aAlutInShiftNum = (1<<aAlutInShift);
00152
00153
#ifdef DEBUG_OUTPUT
00154
if ( DebugCheck(kThisFile, kDebugMiscInfo) )
00155
DebugPrint(
" DoNDim gripoints = %ld\n",aXlutAdrSize);
00156
#endif
00157
if( aElutWordSize <= 0 ){
00158
#ifdef DEBUG_OUTPUT
00159
DebugPrint(
"¥ DoNDim-Error: (1<<aElutWordSize)/aXlutAdrSize <= 0 %d\n",(1<<aElutWordSize)/aXlutAdrSize);
00160
#endif
00161
return cmparamErr;
00162 }
00163
if( aAlutInShift <= 0 ){
00164
#ifdef DEBUG_OUTPUT
00165
DebugPrint(
"¥ DoNDim-Error: aAlutInShift <= 0 %d\n",aAlutInShift);
00166
#endif
00167
return cmparamErr;
00168 }
00169 aXlutOffset =
NDIM_OUT_DIM;
00170
for( i=0; i<(
long)
NDIM_IN_DIM; i++){
00171 theXlutOffsets[
NDIM_IN_DIM-1-i] = aXlutOffset;
00172 aXlutOffset *=aXlutAdrSize;
00173 }
00174 aAlutRound = 1<<( aAlutInShift + aAlutShift - 1 );
00175
00176
#ifdef DEBUG_OUTPUT
00177
if ( DebugCheck(kThisFile, kDebugReserved1) )
00178
DebugPrint(
" aElutWordSize((1<<aElutWordSize)-0) = %ld\n aAlutInShift:((1<<aXlutWordSize)*aElutWordSize+(adr_bereich_alut/2))/adr_bereich_alut = %ld\n",aElutWordSize,aAlutInShift);
00179
#endif
00180
00181
while (LineCount){
00182 i = Pixelcount;
00183
00184
while (i){
00185
00186
long adr[8],
Index[8];
00187
LH_UINT16 ein_reg[8];
00188
register unsigned long adrAdr,ko,adrOffset;
00189
00190 adr0=0;
00191 aElutOffset = 0;
00192 jj=0;
00193
00194 ein_Cache[0]=jj=(*(
LH_UINT16 *)inputData[0]);
00195 ko0 = jj - ( jj >> (
adr_breite_elut ));
00196 ko = ko0 & (
aElutShiftNum - 1 );
00197 ko0 = ko0 >>
aElutShift;
00198 ko0 += aElutOffset;
00199 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00200
00201 jj *= aXlutAdrSize;
00202 aElutOffset +=
adr_bereich_elut;
00203 adr[0] = jj & aElutWordSizeMask;
00204 jj = jj >> aElutWordSize;
00205 adr0 += (jj)*theXlutOffsets[0];
00206 ein_reg[0] = (
LH_UINT16)jj;
00207
00208 ein_Cache[1]=jj=(*(
LH_UINT16 *)inputData[1]);
00209 ko0 = jj - ( jj >> (
adr_breite_elut ));
00210 ko = ko0 & (
aElutShiftNum - 1 );
00211 ko0 = ko0 >>
aElutShift;
00212 ko0 += aElutOffset;
00213 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00214
00215 jj *= aXlutAdrSize;
00216 aElutOffset +=
adr_bereich_elut;
00217 adr[1] = jj & aElutWordSizeMask;
00218 jj = jj >> aElutWordSize;
00219 adr0 += (jj)*theXlutOffsets[1];
00220 ein_reg[1] = (
LH_UINT16)jj;
00221
00222 ein_Cache[2]=jj=(*(
LH_UINT16 *)inputData[2]);
00223 ko0 = jj - ( jj >> (
adr_breite_elut ));
00224 ko = ko0 & (
aElutShiftNum - 1 );
00225 ko0 = ko0 >>
aElutShift;
00226 ko0 += aElutOffset;
00227 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00228
00229 jj *= aXlutAdrSize;
00230 aElutOffset +=
adr_bereich_elut;
00231 adr[2] = jj & aElutWordSizeMask;
00232 jj = jj >> aElutWordSize;
00233 adr0 += (jj)*theXlutOffsets[2];
00234 ein_reg[2] = (
LH_UINT16)jj;
00235
00236
#if NDIM_IN_DIM == 4
00237
ein_Cache[3]=jj=(*(
LH_UINT16 *)inputData[3]);
00238 ko0 = jj - ( jj >> (
adr_breite_elut ));
00239 ko = ko0 & (
aElutShiftNum - 1 );
00240 ko0 = ko0 >>
aElutShift;
00241 ko0 += aElutOffset;
00242 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00243
00244 jj *= aXlutAdrSize;
00245 aElutOffset +=
adr_bereich_elut;
00246 adr[3] = jj & aElutWordSizeMask;
00247 jj = jj >> aElutWordSize;
00248 adr0 += (jj)*theXlutOffsets[3];
00249 ein_reg[3] = (
LH_UINT16)jj;
00250
#endif
00251
00252
00253
00254 {
00255
register long Hold;
00256
00257
00258
Index[0] = 0;
00259
Index[1] = 1;
00260
Index[2] = 2;
00261
#if NDIM_IN_DIM == 4
00262
Index[3] = 3;
00263
#endif
00264
if( adr[0] < adr[1] ){
00265
Hold =
Index[0];
00266
Index[0] =
Index[1];
00267
Index[1] =
Hold;
00268 }
00269
00270
if( adr[
Index[1]] < adr[2] ){
00271
Hold =
Index[1];
00272
Index[1] =
Index[2];
00273
Index[2] =
Hold;
00274
if( adr[
Index[0]] < adr[
Index[1]] ){
00275
Hold =
Index[0];
00276
Index[0] =
Index[1];
00277
Index[1] =
Hold;
00278 }
00279 }
00280
00281
#if NDIM_IN_DIM == 4
00282
if( adr[
Index[2]] < adr[3] ){
00283
Hold =
Index[2];
00284
Index[2] =
Index[3];
00285
Index[3] =
Hold;
00286
if( adr[
Index[1]] < adr[
Index[2]] ){
00287
Hold =
Index[1];
00288
Index[1] =
Index[2];
00289
Index[2] =
Hold;
00290
if( adr[
Index[0]] < adr[
Index[1]] ){
00291
Hold =
Index[0];
00292
Index[0] =
Index[1];
00293
Index[1] =
Hold;
00294 }
00295 }
00296 }
00297
#endif
00298
}
00299
00300 accu[0]=0;
00301 accu[1]=0;
00302 accu[2]=0;
00303
#if NDIM_OUT_DIM == 4
00304
accu[3]=0;
00305
#endif
00306
ko0 = (1<<aElutWordSize);
00307 adrAdr=adr0;
00308 adrOffset=0;
00309
if( aXlutWordSize == 16 ){
00310 jj =
Index[0];
00311 ko = ko0 - adr[jj];
00312 ko0 = adr[jj];
00313
00314
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00315 adrOffset += theXlutOffsets[jj];
00316
00317 accu[0]+=Xlut[adrAdr+(0)]*ko;
00318 accu[1]+=Xlut[adrAdr+(1)]*ko;
00319 accu[2]+=Xlut[adrAdr+(2)]*ko;
00320
#if NDIM_OUT_DIM == 4
00321
accu[3]+=Xlut[adrAdr+(3)]*ko;
00322
#endif
00323
00324 adrAdr = (adr0 + adrOffset);
00325
00326 jj =
Index[1];
00327 ko = ko0 - adr[jj];
00328 ko0 = adr[jj];
00329
00330
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00331 adrOffset += theXlutOffsets[jj];
00332
00333 accu[0]+=Xlut[adrAdr+(0)]*ko;
00334 accu[1]+=Xlut[adrAdr+(1)]*ko;
00335 accu[2]+=Xlut[adrAdr+(2)]*ko;
00336
#if NDIM_OUT_DIM == 4
00337
accu[3]+=Xlut[adrAdr+(3)]*ko;
00338
#endif
00339
00340 adrAdr = (adr0 + adrOffset);
00341
00342 jj =
Index[2];
00343 ko = ko0 - adr[jj];
00344 ko0 = adr[jj];
00345
00346
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00347 adrOffset += theXlutOffsets[jj];
00348
00349 accu[0]+=Xlut[adrAdr+(0)]*ko;
00350 accu[1]+=Xlut[adrAdr+(1)]*ko;
00351 accu[2]+=Xlut[adrAdr+(2)]*ko;
00352
#if NDIM_OUT_DIM == 4
00353
accu[3]+=Xlut[adrAdr+(3)]*ko;
00354
#endif
00355
00356 adrAdr = (adr0 + adrOffset);
00357
00358
#if NDIM_IN_DIM == 4
00359
jj =
Index[3];
00360 ko = ko0 - adr[jj];
00361 ko0 = adr[jj];
00362
00363
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00364 adrOffset += theXlutOffsets[jj];
00365
00366 accu[0]+=Xlut[adrAdr+(0)]*ko;
00367 accu[1]+=Xlut[adrAdr+(1)]*ko;
00368 accu[2]+=Xlut[adrAdr+(2)]*ko;
00369
#if NDIM_OUT_DIM == 4
00370
accu[3]+=Xlut[adrAdr+(3)]*ko;
00371
#endif
00372
00373 adrAdr = (adr0 + adrOffset);
00374
#endif
00375
00376 accu[0]+=Xlut[adrAdr+0]*ko0;
00377 accu[1]+=Xlut[adrAdr+1]*ko0;
00378 accu[2]+=Xlut[adrAdr+2]*ko0;
00379
#if NDIM_OUT_DIM == 4
00380
accu[3]+=Xlut[adrAdr+3]*ko0;
00381
#endif
00382
}
00383
else{
00384
00385 jj =
Index[0];
00386 ko = ko0 - adr[jj];
00387 ko0 = adr[jj];
00388
00389
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00390 adrOffset += theXlutOffsets[jj];
00391
00392 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00393 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00394 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00395
#if NDIM_OUT_DIM == 4
00396
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00397
#endif
00398
adrAdr = (adr0 + adrOffset);
00399
00400 jj =
Index[1];
00401 ko = ko0 - adr[jj];
00402 ko0 = adr[jj];
00403
00404
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00405 adrOffset += theXlutOffsets[jj];
00406
00407 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00408 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00409 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00410
#if NDIM_OUT_DIM == 4
00411
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00412
#endif
00413
adrAdr = (adr0 + adrOffset);
00414
00415 jj =
Index[2];
00416 ko = ko0 - adr[jj];
00417 ko0 = adr[jj];
00418
00419
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00420 adrOffset += theXlutOffsets[jj];
00421
00422 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00423 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00424 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00425
#if NDIM_OUT_DIM == 4
00426
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00427
#endif
00428
adrAdr = (adr0 + adrOffset);
00429
00430
#if NDIM_IN_DIM == 4
00431
jj =
Index[3];
00432 ko = ko0 - adr[jj];
00433 ko0 = adr[jj];
00434
00435
if( ein_reg[jj] < (
LH_UINT16)(aXlutAdrSize-1) )
00436 adrOffset += theXlutOffsets[jj];
00437
00438 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00439 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00440 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00441
#if NDIM_OUT_DIM == 4
00442
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00443
#endif
00444
adrAdr = (adr0 + adrOffset);
00445
#endif
00446
accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+0]*ko0;
00447 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+1]*ko0;
00448 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+2]*ko0;
00449
#if NDIM_OUT_DIM == 4
00450
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+3]*ko0;
00451
#endif
00452
}
00453
00454 aAlutOffset = 0;
00455
00456
if( aOutputPackMode8Bit ){
00457
for( ii=0; ii<
NDIM_OUT_DIM; ++ii){
00458 jj = accu[ii];
00459 jj = jj + ( jj >> aXlutWordSize );
00460
00461 ko0 = (jj - ( jj >> (
adr_breite_alut ))) >> aAlutInShiftRemainder;
00462
00463 ko = ko0 & (aAlutInShiftNum - 1 );
00464 ko0 = ko0 >> aAlutInShift;
00465 ko0 += aAlutOffset;
00466
if( aAlutWordSize <= 8)
00467 jj = ( ((
LH_UINT8*)aus_lut)[ ko0 ] * ( aAlutInShiftNum - ko ) + ((
LH_UINT8*)aus_lut)[ ko0 +1 ] * ko ) >> ( aAlutInShift );
00468
else{
00469 jj = ( aus_lut[ ko0 ] * ( aAlutInShiftNum - ko ) + aus_lut[ ko0 +1 ] * ko );
00470 jj = jj - ( jj >> aAlutShift );
00471 jj = ( jj + aAlutRound ) >> (aAlutInShift + aAlutShift);
00472 }
00473 *outputData[ii] = (
LH_UINT8)jj;
00474 aAlutOffset +=
adr_bereich_alut;
00475 }
00476 }
00477
else{
00478
if( aXlutWordSize >= 16 ){
00479
for( ii=0; ii<
NDIM_OUT_DIM; ++ii){
00480 jj = accu[ii];
00481 jj = jj + ( jj >> aXlutWordSize );
00482 ko0 = (jj - ( jj >> (
adr_breite_alut ))) >> aAlutInShiftRemainder;
00483
00484 ko = ko0 & (aAlutInShiftNum - 1 );
00485 ko0 = ko0 >> aAlutInShift;
00486 ko0 += aAlutOffset;
00487
if( aAlutWordSize <= 8)
00488 jj = ( ((
LH_UINT8*)aus_lut)[ ko0 ] * ( aAlutInShiftNum - ko ) + ((
LH_UINT8*)aus_lut)[ ko0 +1 ] * ko ) << ( aAlutShift - aAlutInShift );
00489
else
00490 jj = ( aus_lut[ ko0 ] * ( aAlutInShiftNum - ko ) + aus_lut[ ko0 +1 ] * ko ) >> (aAlutInShift- aAlutShift);
00491 *((
LH_UINT16 *)outputData[ii]) = (
LH_UINT16)jj;
00492 aAlutOffset +=
adr_bereich_alut;
00493 }
00494 }
00495
else{
00496
for( ii=0; ii<
NDIM_OUT_DIM; ++ii){
00497 jj = accu[ii];
00498 jj = jj + ( jj >> aXlutWordSize ) + ( jj >> 2*aXlutWordSize );
00499 ko0 = (jj - ( jj >> (
adr_breite_alut ))) ;
00500
00501 ko = ko0 & (aAlutInShiftNum - 1 );
00502 ko0 = ko0 >> aAlutInShift;
00503 ko0 += aAlutOffset;
00504
if( aAlutWordSize <= 8)
00505 jj = ( ((
LH_UINT8*)aus_lut)[ ko0 ] * ( aAlutInShiftNum - ko ) + ((
LH_UINT8*)aus_lut)[ ko0 +1 ] * ko ) << ( aAlutShift - aAlutInShift );
00506
else
00507 jj = ( aus_lut[ ko0 ] * ( aAlutInShiftNum - ko ) + aus_lut[ ko0 +1 ] * ko ) >> (aAlutInShift- aAlutShift);
00508 *((
LH_UINT16 *)outputData[ii]) = (
LH_UINT16)jj;
00509 aAlutOffset +=
adr_bereich_alut;
00510 }
00511 }
00512 }
00513
while (--i){
00514
for( jj=0; jj<
NDIM_IN_DIM; ++jj){
00515 inputData[jj] += (
NDIM_IN_DIM * 2);
00516 }
00517
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00518 outputData[jj] += OutputIncrement;
00519 }
00520
00521 {
00522
for( jj=0; jj<
NDIM_IN_DIM; ++jj){
00523
if( *((
LH_UINT16 *)inputData[jj]) ^ *(
LH_UINT16 *)(&ein_Cache[jj]) )
break;
00524 }
00525 }
00526
if( jj<
NDIM_IN_DIM )
break;
00527
if( aOutputPackMode8Bit ){
00528
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00529 *outputData[jj] = outputData[jj][-(
long)(
NDIM_OUT_DIM )];
00530 }
00531 }
00532
else{
00533
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00534 *((
LH_UINT16 *)outputData[jj]) = *(
LH_UINT16 *)(&outputData[jj][-(
long)(
NDIM_OUT_DIM * 2)]);
00535 }
00536 }
00537 }
00538 }
00539
00540
if( --LineCount ){
00541
for( jj=0; jj<
NDIM_IN_DIM; ++jj){
00542 inputData[jj] += inputDataRowOffset;
00543 }
00544
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00545 outputData[jj] += outputDataRowOffset;
00546 }
00547 }
00548 }
00549 }
00550
else{
00551
00552
register unsigned long bit_breit_selektor;
00553
register unsigned long bit_maske_selektor;
00554
register unsigned long bit_breit_adr;
00555
register unsigned long bit_maske_adr;
00556
register unsigned long aAlutInShiftNum;
00557
register long aAlutInShift;
00558
register long aAlutInShiftRemainder;
00559
register unsigned long aAlutRound;
00560
00561 bit_breit_selektor=aElutWordSize-aXlutAdrShift;
00562
if( aElutWordSize-aXlutAdrShift < 0 )
00563 {
00564
#ifdef DEBUG_OUTPUT
00565
DebugPrint(
"¥ DoNDim-Error: bit_breit_selektor < 0 (bit_breit_selektor = %d)\n",bit_breit_selektor);
00566
#endif
00567
return cmparamErr;
00568 }
00569 bit_maske_selektor=(1<<bit_breit_selektor)-1;
00570 bit_breit_adr=aXlutAdrShift;
00571 bit_maske_adr=((1<<bit_breit_adr)-1)<<bit_breit_selektor;
00572 aAlutInShift = (aXlutWordSize+bit_breit_selektor-
adr_breite_alut);
00573
00574 aAlutInShiftRemainder = 0;
00575
if( aAlutInShift > 16 ){
00576 aAlutInShiftRemainder = aAlutInShift - 16;
00577 aAlutInShift = 16;
00578 }
00579
00580 aAlutInShiftNum = (1<<aAlutInShift);
00581
00582 aAlutRound = 1<<( aAlutInShift + aAlutShift - 1 );
00583
while (LineCount){
00584 i = Pixelcount;
00585
00586
while (i){
00587
00588
long adr[8],
Index[8];
00589
00590
LH_UINT16 ein_reg[8];
00591
register unsigned long adrAdr,ko,adrOffset;
00592
00593
00594 adr0=0;
00595 aElutOffset = 0;
00596 jj=0;
00597 ein_Cache[0]=jj=(*(
LH_UINT16 *)inputData[0]);
00598 ko0 = jj - ( jj >> (
adr_breite_elut ));
00599 ko = ko0 & (
aElutShiftNum - 1 );
00600 ko0 = ko0 >>
aElutShift;
00601 ko0 += aElutOffset;
00602 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00603
00604 aElutOffset +=
adr_bereich_elut;
00605 adr[0] = (jj & bit_maske_selektor);
00606 adr0 |= ((jj & bit_maske_adr)>>bit_breit_selektor)<<((
NDIM_IN_DIM-0-1)*bit_breit_adr);
00607 ein_reg[0] = (
LH_UINT16)jj;
00608
00609 ein_Cache[1]=jj=(*(
LH_UINT16 *)inputData[1]);
00610 ko0 = jj - ( jj >> (
adr_breite_elut ));
00611 ko = ko0 & (
aElutShiftNum - 1 );
00612 ko0 = ko0 >>
aElutShift;
00613 ko0 += aElutOffset;
00614 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00615
00616 aElutOffset +=
adr_bereich_elut;
00617 adr[1] = (jj & bit_maske_selektor);
00618 adr0 |= ((jj & bit_maske_adr)>>bit_breit_selektor)<<((
NDIM_IN_DIM-1-1)*bit_breit_adr);
00619 ein_reg[1] = (
LH_UINT16)jj;
00620
00621 ein_Cache[2]=jj=(*(
LH_UINT16 *)inputData[2]);
00622 ko0 = jj - ( jj >> (
adr_breite_elut ));
00623 ko = ko0 & (
aElutShiftNum - 1 );
00624 ko0 = ko0 >>
aElutShift;
00625 ko0 += aElutOffset;
00626 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00627
00628 aElutOffset +=
adr_bereich_elut;
00629 adr[2] = (jj & bit_maske_selektor);
00630 adr0 |= ((jj & bit_maske_adr)>>bit_breit_selektor)<<((
NDIM_IN_DIM-2-1)*bit_breit_adr);
00631 ein_reg[2] = (
LH_UINT16)jj;
00632
00633
#if NDIM_IN_DIM == 4
00634
ein_Cache[3]=jj=(*(
LH_UINT16 *)inputData[3]);
00635 ko0 = jj - ( jj >> (
adr_breite_elut ));
00636 ko = ko0 & (
aElutShiftNum - 1 );
00637 ko0 = ko0 >>
aElutShift;
00638 ko0 += aElutOffset;
00639 jj = ( ein_lut[ ko0 ] * (
aElutShiftNum - ko ) + ein_lut[ ko0 +1 ] * ko ) >>
aElutShift;
00640
00641 aElutOffset +=
adr_bereich_elut;
00642 adr[3] = (jj & bit_maske_selektor);
00643 adr0 |= ((jj & bit_maske_adr)>>bit_breit_selektor)<<((
NDIM_IN_DIM-3-1)*bit_breit_adr);
00644 ein_reg[3] = (
LH_UINT16)jj;
00645
#endif
00646
adr0 *=
NDIM_OUT_DIM;
00647
00648 {
00649
register long Hold;
00650
00651
00652
Index[0] = 0;
00653
Index[1] = 1;
00654
Index[2] = 2;
00655
#if NDIM_IN_DIM == 4
00656
Index[3] = 3;
00657
#endif
00658
if( adr[0] < adr[1] ){
00659
Hold =
Index[0];
00660
Index[0] =
Index[1];
00661
Index[1] =
Hold;
00662 }
00663
00664
if( adr[
Index[1]] < adr[2] ){
00665
Hold =
Index[1];
00666
Index[1] =
Index[2];
00667
Index[2] =
Hold;
00668
if( adr[
Index[0]] < adr[
Index[1]] ){
00669
Hold =
Index[0];
00670
Index[0] =
Index[1];
00671
Index[1] =
Hold;
00672 }
00673 }
00674
00675
#if NDIM_IN_DIM == 4
00676
if( adr[
Index[2]] < adr[3] ){
00677
Hold =
Index[2];
00678
Index[2] =
Index[3];
00679
Index[3] =
Hold;
00680
if( adr[
Index[1]] < adr[
Index[2]] ){
00681
Hold =
Index[1];
00682
Index[1] =
Index[2];
00683
Index[2] =
Hold;
00684
if( adr[
Index[0]] < adr[
Index[1]] ){
00685
Hold =
Index[0];
00686
Index[0] =
Index[1];
00687
Index[1] =
Hold;
00688 }
00689 }
00690 }
00691
#endif
00692
}
00693
00694 accu[0]=0;
00695 accu[1]=0;
00696 accu[2]=0;
00697
#if NDIM_OUT_DIM == 4
00698
accu[3]=0;
00699
#endif
00700
00701 ko0 = bit_maske_selektor+1;
00702 adrAdr=adr0;
00703 adrOffset=0;
00704
00705
if( aXlutWordSize == 16 ){
00706 jj =
Index[0];
00707 ko = ko0 - adr[jj];
00708 ko0 = adr[jj];
00709
00710
if( ein_reg[jj] < bit_maske_adr )
00711 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00712
00713 accu[0]+=Xlut[adrAdr+(0)]*ko;
00714 accu[1]+=Xlut[adrAdr+(1)]*ko;
00715 accu[2]+=Xlut[adrAdr+(2)]*ko;
00716
#if NDIM_OUT_DIM == 4
00717
accu[3]+=Xlut[adrAdr+(3)]*ko;
00718
#endif
00719
adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00720
00721 jj =
Index[1];
00722 ko = ko0 - adr[jj];
00723 ko0 = adr[jj];
00724
00725
if( ein_reg[jj] < bit_maske_adr )
00726 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00727
00728 accu[0]+=Xlut[adrAdr+(0)]*ko;
00729 accu[1]+=Xlut[adrAdr+(1)]*ko;
00730 accu[2]+=Xlut[adrAdr+(2)]*ko;
00731
#if NDIM_OUT_DIM == 4
00732
accu[3]+=Xlut[adrAdr+(3)]*ko;
00733
#endif
00734
adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00735
00736 jj =
Index[2];
00737 ko = ko0 - adr[jj];
00738 ko0 = adr[jj];
00739
00740
if( ein_reg[jj] < bit_maske_adr )
00741 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00742
00743 accu[0]+=Xlut[adrAdr+(0)]*ko;
00744 accu[1]+=Xlut[adrAdr+(1)]*ko;
00745 accu[2]+=Xlut[adrAdr+(2)]*ko;
00746
#if NDIM_OUT_DIM == 4
00747
accu[3]+=Xlut[adrAdr+(3)]*ko;
00748
#endif
00749
adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00750
00751
#if NDIM_IN_DIM == 4
00752
jj =
Index[3];
00753 ko = ko0 - adr[jj];
00754 ko0 = adr[jj];
00755
00756
if( ein_reg[jj] < bit_maske_adr )
00757 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00758
00759 accu[0]+=Xlut[adrAdr+(0)]*ko;
00760 accu[1]+=Xlut[adrAdr+(1)]*ko;
00761 accu[2]+=Xlut[adrAdr+(2)]*ko;
00762
#if NDIM_OUT_DIM == 4
00763
accu[3]+=Xlut[adrAdr+(3)]*ko;
00764
#endif
00765
adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00766
#endif
00767
accu[0]+=Xlut[adrAdr+0]*ko0;
00768 accu[1]+=Xlut[adrAdr+1]*ko0;
00769 accu[2]+=Xlut[adrAdr+2]*ko0;
00770
#if NDIM_OUT_DIM == 4
00771
accu[3]+=Xlut[adrAdr+3]*ko0;
00772
#endif
00773
}
00774
else{
00775 jj =
Index[0];
00776 ko = ko0 - adr[jj];
00777 ko0 = adr[jj];
00778
00779
if( ein_reg[jj] < bit_maske_adr )
00780 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00781
00782 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00783 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00784 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00785
#if NDIM_OUT_DIM == 4
00786
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00787
#endif
00788
00789 adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00790
00791 jj =
Index[1];
00792 ko = ko0 - adr[jj];
00793 ko0 = adr[jj];
00794
00795
if( ein_reg[jj] < bit_maske_adr )
00796 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00797
00798 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00799 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00800 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00801
#if NDIM_OUT_DIM == 4
00802
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00803
#endif
00804
00805 adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00806
00807 jj =
Index[2];
00808 ko = ko0 - adr[jj];
00809 ko0 = adr[jj];
00810
00811
if( ein_reg[jj] < bit_maske_adr )
00812 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00813
00814 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00815 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00816 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00817
#if NDIM_OUT_DIM == 4
00818
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00819
#endif
00820
00821 adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00822
00823
#if NDIM_IN_DIM == 4
00824
jj =
Index[3];
00825 ko = ko0 - adr[jj];
00826 ko0 = adr[jj];
00827
00828
if( ein_reg[jj] < bit_maske_adr )
00829 adrOffset |= (1<<(
NDIM_IN_DIM-1-jj)*bit_breit_adr);
00830
00831 accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+(0)]*ko;
00832 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+(1)]*ko;
00833 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+(2)]*ko;
00834
#if NDIM_OUT_DIM == 4
00835
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+(3)]*ko;
00836
#endif
00837
00838 adrAdr = (adr0 +
NDIM_OUT_DIM*adrOffset);
00839
#endif
00840
accu[0]+=((
LH_UINT8 *)Xlut)[adrAdr+0]*ko0;
00841 accu[1]+=((
LH_UINT8 *)Xlut)[adrAdr+1]*ko0;
00842 accu[2]+=((
LH_UINT8 *)Xlut)[adrAdr+2]*ko0;
00843
#if NDIM_OUT_DIM == 4
00844
accu[3]+=((
LH_UINT8 *)Xlut)[adrAdr+3]*ko0;
00845
#endif
00846
}
00847
00848 aAlutOffset = 0;
00849
00850
if( aOutputPackMode8Bit ){
00851
for( ii=0; ii<
NDIM_OUT_DIM; ++ii){
00852 jj = accu[ii];
00853 jj = jj + ( jj >> aXlutWordSize );
00854
00855 ko0 = (jj - ( jj >> (
adr_breite_alut ))) >> aAlutInShiftRemainder;
00856
00857 ko = ko0 & (aAlutInShiftNum - 1 );
00858 ko0 = ko0 >> aAlutInShift;
00859 ko0 += aAlutOffset;
00860
if( aAlutWordSize <= 8)
00861 jj = ( ((
LH_UINT8*)aus_lut)[ ko0 ] * ( aAlutInShiftNum - ko ) + ((
LH_UINT8*)aus_lut)[ ko0 +1 ] * ko ) >> ( aAlutInShift );
00862
else{
00863 jj = ( aus_lut[ ko0 ] * ( aAlutInShiftNum - ko ) + aus_lut[ ko0 +1 ] * ko );
00864 jj = jj - ( jj >> aAlutShift );
00865 jj = ( jj + aAlutRound ) >> (aAlutInShift + aAlutShift);
00866 }
00867
00868 *outputData[ii] = (
LH_UINT8)jj;
00869 aAlutOffset +=
adr_bereich_alut;
00870 }
00871 }
00872
else{
00873
if( aXlutWordSize >= 16 ){
00874
for( ii=0; ii<
NDIM_OUT_DIM; ++ii){
00875 jj = accu[ii];
00876 jj = jj + ( jj >> aXlutWordSize );
00877 ko0 = (jj - ( jj >> (
adr_breite_alut ))) >> aAlutInShiftRemainder;
00878
00879 ko = ko0 & (aAlutInShiftNum - 1 );
00880 ko0 = ko0 >> aAlutInShift;
00881 ko0 += aAlutOffset;
00882
if( aAlutWordSize <= 8)
00883 jj = ( ((
LH_UINT8*)aus_lut)[ ko0 ] * ( aAlutInShiftNum - ko ) + ((
LH_UINT8*)aus_lut)[ ko0 +1 ] * ko ) << ( aAlutShift - aAlutInShift );
00884
else
00885 jj = ( aus_lut[ ko0 ] * ( aAlutInShiftNum - ko ) + aus_lut[ ko0 +1 ] * ko ) >> (aAlutInShift- aAlutShift);
00886 *((
LH_UINT16 *)outputData[ii]) = (
LH_UINT16)jj;
00887 aAlutOffset +=
adr_bereich_alut;
00888 }
00889 }
00890
else{
00891
for( ii=0; ii<
NDIM_OUT_DIM; ++ii){
00892 jj = accu[ii];
00893 jj = jj + ( jj >> aXlutWordSize ) + ( jj >> 2*aXlutWordSize );
00894 ko0 = (jj - ( jj >> (
adr_breite_alut )));
00895
00896 ko = ko0 & (aAlutInShiftNum - 1 );
00897 ko0 = ko0 >> aAlutInShift;
00898 ko0 += aAlutOffset;
00899
if( aAlutWordSize <= 8)
00900 jj = ( ((
LH_UINT8*)aus_lut)[ ko0 ] * ( aAlutInShiftNum - ko ) + ((
LH_UINT8*)aus_lut)[ ko0 +1 ] * ko ) << ( aAlutShift - aAlutInShift );
00901
else
00902 jj = ( aus_lut[ ko0 ] * ( aAlutInShiftNum - ko ) + aus_lut[ ko0 +1 ] * ko ) >> (aAlutInShift- aAlutShift);
00903 *((
LH_UINT16 *)outputData[ii]) = (
LH_UINT16)jj;
00904 aAlutOffset +=
adr_bereich_alut;
00905 }
00906 }
00907 }
00908
00909
while (--i){
00910
for( jj=0; jj<
NDIM_IN_DIM; ++jj){
00911 inputData[jj] += (
NDIM_IN_DIM * 2);
00912 }
00913
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00914 outputData[jj] += OutputIncrement;
00915 }
00916
00917 {
00918
for( jj=0; jj<
NDIM_IN_DIM; ++jj){
00919
if( *((
LH_UINT16 *)inputData[jj]) ^ *(
LH_UINT16 *)(&ein_Cache[jj]) )
break;
00920 }
00921 }
00922
if( jj<
NDIM_IN_DIM )
break;
00923
if( aOutputPackMode8Bit ){
00924
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00925 *outputData[jj] = outputData[jj][-(
long)(
NDIM_OUT_DIM )];
00926 }
00927 }
00928
else{
00929
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00930 *((
LH_UINT16 *)outputData[jj]) = *(
LH_UINT16 *)(&outputData[jj][-(
long)(
NDIM_OUT_DIM * 2)]);
00931 }
00932 }
00933 }
00934 }
00935
00936
if( --LineCount ){
00937
for( jj=0; jj<
NDIM_IN_DIM; ++jj){
00938 inputData[jj] += inputDataRowOffset;
00939 }
00940
for( jj=0; jj<
NDIM_OUT_DIM; ++jj){
00941 outputData[jj] += outputDataRowOffset;
00942 }
00943 }
00944 }
00945 }
00946
00947
00948
00949
00950
00951
LH_END_PROC(
"Calc323Dim_Data8To8_Lut16")
00952 return noErr;
00953 }