00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 #define smallCode 1
00015 
00016 
#undef LH_DATA_IN_TYPE
00017 
#undef LH_DATA_OUT_TYPE
00018 
#undef LH_LUT_DATA_TYPE
00019 
#undef LH_DATA_IN_COUNT
00020 
#undef LH_DATA_SHR
00021 
#undef LH_DATA_SHR_CORR
00022 
#undef LH_LUT_DATA_SHR
00023 
#undef LH_BIT_BREIT_INTERNAL
00024 
#if LH_DATA_IN_SIZE_16
00025 
#define LH_DATA_IN_TYPE LH_UINT16
00026 
#else
00027 #define LH_DATA_IN_TYPE LH_UINT8
00028 
#endif
00029 
#if LH_DATA_OUT_SIZE_16
00030 
#define LH_DATA_OUT_TYPE LH_UINT16
00031 
#else
00032 #define LH_DATA_OUT_TYPE LH_UINT8
00033 
#endif
00034 
#if LH_LUT_DATA_SIZE_16
00035 
#define LH_BIT_BREIT_INTERNAL   16
00036 
#define LH_LUT_DATA_TYPE LH_UINT16
00037 
#else
00038 
#if LH_DATA_IN_SIZE_16
00039 
#define LH_BIT_BREIT_INTERNAL   16
00040 
#else
00041 #define LH_BIT_BREIT_INTERNAL   10
00042 
#endif
00043 #define LH_LUT_DATA_TYPE LH_UINT8
00044 
#endif
00045 
00046 
#if LH_DATA_IN_COUNT_4
00047 
#define LH_DATA_IN_COUNT                4
00048 
#else
00049 #define LH_DATA_IN_COUNT                3
00050 
#endif
00051 
00052 #define LH_BIT_MASKE_ADR (((1<<7)-1)<< (LH_BIT_BREIT_INTERNAL-7))
00053 #define LH_BIT_BREIT_SELEKTOR (LH_BIT_BREIT_INTERNAL-7)
00054 #define LH_BIT_MASKE_SELEKTOR ((1<<LH_BIT_BREIT_SELEKTOR)-1)
00055 
00056 #define LH_ADR_BEREICH_SEL              (1<<LH_BIT_BREIT_SELEKTOR)
00057 
00058 
#if LH_LUT_DATA_SIZE_16
00059 
#define LH_DATA_SHR               (16+LH_BIT_BREIT_SELEKTOR-LH_ADR_BREIT_AUS_LUT)  
00060 
#define LH_DATA_SHR_CORR 8              
00061 
#define LH_LUT_DATA_SHR  16             
00062 
#else
00063 #define LH_DATA_SHR               (8+LH_BIT_BREIT_SELEKTOR-LH_ADR_BREIT_AUS_LUT)   
00064 #define LH_LUT_DATA_SHR  8              
00065 
#endif
00066 
00067 {
00068         
LH_UINT32 ein_regr;
00069         
LH_DATA_IN_TYPE ein_cache;
00070         
LH_LUT_DATA_TYPE * paNewVal0;
00071         
LH_UINT32 ako0;
00072 
00073         
LH_UINT8        Mode;
00074         
LH_UINT8        LH_DATA_OUT_COUNT = (
LH_UINT8)lutParam->colorLutOutDim;
00075         
LH_UINT32       PixelCount, LineCount, i, j;
00076         
long inputOffset,outputOffset;
00077         
LH_DATA_IN_TYPE * input0 = (
LH_DATA_IN_TYPE *)calcParam->inputData[0];
00078         
LH_DATA_IN_TYPE * input1 = (
LH_DATA_IN_TYPE *)calcParam->inputData[1];
00079 
00080         
LH_DATA_OUT_TYPE * output0 = (
LH_DATA_OUT_TYPE *)calcParam->outputData[0];
00081         
LH_DATA_OUT_TYPE * output1 = (
LH_DATA_OUT_TYPE *)calcParam->outputData[1];
00082         
LH_DATA_OUT_TYPE * output2 = (
LH_DATA_OUT_TYPE *)calcParam->outputData[2];
00083         
LH_DATA_OUT_TYPE * output3 = (
LH_DATA_OUT_TYPE *)calcParam->outputData[3];
00084         
LH_DATA_OUT_TYPE * output4 = (
LH_DATA_OUT_TYPE *)calcParam->outputData[4];
00085 
00086         
LH_UINT16 * My_InputLut = (
LH_UINT16 *)lutParam->inputLut;
00087         
LH_LUT_DATA_TYPE * My_OutputLut = (
LH_LUT_DATA_TYPE *)lutParam->outputLut;
00088         
LH_LUT_DATA_TYPE * My_ColorLut = (
LH_LUT_DATA_TYPE *)lutParam->colorLut;
00089 
00090         
LH_DATA_OUT_TYPE Mask = (
LH_DATA_OUT_TYPE)-1;
00091 
00092 
#ifdef DEBUG_OUTPUT
00093 
        CMError err = 
noErr;
00094 
#endif
00095 
        LH_START_PROC(
LH_CALC_PROC_NAME)
00096 
00097         #
if LH_DATA_IN_SIZE_16
00098         inputOffset = (
long)calcParam->cmInputPixelOffset / 2;
00099 
        #else
00100 
        inputOffset = (
long)calcParam->cmInputPixelOffset;
00101 
        #endif
00102 
        #if LH_DATA_OUT_SIZE_16
00103 
        outputOffset = (
long)calcParam->cmOutputPixelOffset / 2;
00104 
        #else
00105 
        outputOffset = (
long)calcParam->cmOutputPixelOffset;
00106 
        #endif
00107 
00108         
if (calcParam->clearMask)
00109                 Mask = 0;
00110         Mode = 
LH_CALC_ENGINE_UNDEF_MODE;
00111 
00112 
00113         
if ((calcParam->cmInputPixelOffset * calcParam->cmPixelPerLine == calcParam->cmInputBytesPerLine) && (calcParam->cmOutputPixelOffset * calcParam->cmPixelPerLine == calcParam->cmOutputBytesPerLine))
00114         {
00115                 PixelCount = calcParam->cmPixelPerLine * calcParam->cmLineCount;
00116                 LineCount = 1;
00117         }
00118         
else
00119         {
00120                 PixelCount = calcParam->cmPixelPerLine;
00121                 LineCount = calcParam->cmLineCount;
00122         }
00123         
if (calcParam->copyAlpha )
00124         {
00125                         Mode = 
LH_CALC_ENGINE_U_TO_U;
00126         }
00127         
else
00128         {
00129                 
if (calcParam->clearMask)
00130                         Mode = 
LH_CALC_ENGINE_P_TO_U;
00131                 
else
00132                         Mode = 
LH_CALC_ENGINE_P_TO_P;
00133         }
00134         j = 0;
00135         
while (LineCount)
00136         {
00137                 i = PixelCount;
00138                 
while (i)
00139                 {
00140 
                        #if LH_LUT_DATA_SIZE_16
00141 
                        #if LH_DATA_IN_SIZE_16 || LH_DATA_OUT_SIZE_16
00142 
                        register LH_UINT32 ko;
00143 
                        #endif
00144 
                        #if LH_DATA_IN_SIZE_16
00145 
                        register LH_DATA_IN_TYPE aValIn;
00146 
                #endif
00147 
                        #if LH_DATA_OUT_SIZE_16
00148 
                        register LH_UINT32 aVal;
00149 
                #endif
00150 
                        #if LH_DATA_IN_SIZE_16
00151 
                                aValIn = (ein_cache=*input0) - ( *input0 >> ( 
LH_ADR_BREIT_EIN_LUT ));
00152                                 ko = aValIn & ( (1<<( 16-
LH_ADR_BREIT_EIN_LUT ))-1 );
00153                                 aValIn = (aValIn >> ( 16-
LH_ADR_BREIT_EIN_LUT )) + ( 0 << 
LH_ADR_BREIT_EIN_LUT );
00154                         ein_regr = ( My_InputLut[aValIn] * ( (1<<( 16-
LH_ADR_BREIT_EIN_LUT )) - ko ) + My_InputLut[aValIn +1] * ko ) >>( 16-
LH_ADR_BREIT_EIN_LUT );
00155 
                        #else
00156 
                        ein_regr = My_InputLut[(ein_cache=*input0) + ( 0 << 
LH_ADR_BREIT_EIN_LUT )];
00157 
                        #endif
00158 
                        #else
00159 
                        #if LH_DATA_IN_SIZE_16
00160 
                        register LH_DATA_IN_TYPE aValIn;
00161                         
register LH_UINT32 ko;
00162                                 aValIn = (ein_cache=*input0) - ( *input0 >> ( 
LH_ADR_BREIT_EIN_LUT ));
00163                                 ko = aValIn & ( (1<<( 16-
LH_ADR_BREIT_EIN_LUT ))-1 );
00164                                 aValIn = (aValIn >> ( 16-
LH_ADR_BREIT_EIN_LUT )) + ( 0 << 
LH_ADR_BREIT_EIN_LUT );
00165                         ein_regr = ( My_InputLut[aValIn] * ( (1<<( 16-
LH_ADR_BREIT_EIN_LUT )) - ko ) + My_InputLut[aValIn +1] * ko ) >>( 10-
LH_ADR_BREIT_EIN_LUT );
00166 
                        #else
00167 
                        ein_regr = My_InputLut[(ein_cache=*input0) + ( 0 << 
LH_ADR_BREIT_EIN_LUT )];
00168 
                        #endif
00169 
                        #endif
00170 
                        paNewVal0 = (
LH_LUT_DATA_TYPE *)My_ColorLut + 
00171                                                 ((ein_regr >> 
LH_BIT_BREIT_SELEKTOR)*
LH_DATA_OUT_COUNT);
00172                         ein_regr &= 
LH_BIT_MASKE_SELEKTOR;
00173 
00174                         ako0 = (
LH_ADR_BEREICH_SEL) - ein_regr;
00175 
                        #if LH_LUT_DATA_SIZE_16
00176 
                        #if LH_DATA_OUT_SIZE_16
00177 
        
00178                         aVal =                                   (ako0          * paNewVal0[0] +
00179                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT]);
00180                         aVal = aVal + ( aVal >> ( 
LH_LUT_DATA_SHR ));
00181                         aVal = aVal - ( aVal >> ( 
LH_ADR_BREIT_AUS_LUT ));
00182                         ko = (aVal>>LH_DATA_SHR_CORR) & ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR))-1 );
00183                         aVal = (aVal >> ( 
LH_DATA_SHR )) + ( 0 << 
LH_ADR_BREIT_AUS_LUT );
00184                         *output0 = (
LH_DATA_OUT_TYPE)((My_OutputLut[aVal] * ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR )) - ko ) + My_OutputLut[aVal +1] * ko)>>(
LH_DATA_SHR - LH_DATA_SHR_CORR) );
00185 
00186                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00187                         paNewVal0++;
00188                         aVal =                                   (ako0          * paNewVal0[0] +
00189                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT]);
00190                         aVal = aVal + ( aVal >> ( 
LH_LUT_DATA_SHR ));
00191                         aVal = aVal - ( aVal >> ( 
LH_ADR_BREIT_AUS_LUT ));
00192                         ko = (aVal>>LH_DATA_SHR_CORR) & ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR))-1 );
00193                         aVal = (aVal >> ( 
LH_DATA_SHR )) + ( 1 << 
LH_ADR_BREIT_AUS_LUT );
00194                         *output1 = (
LH_DATA_OUT_TYPE)((My_OutputLut[aVal] * ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR )) - ko ) + My_OutputLut[aVal +1] * ko)>>(
LH_DATA_SHR - LH_DATA_SHR_CORR) );
00195 
00196                         paNewVal0++;
00197                         aVal =                                   (ako0          * paNewVal0[0] +
00198                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT]);
00199                         aVal = aVal + ( aVal >> ( 
LH_LUT_DATA_SHR ));
00200                         aVal = aVal - ( aVal >> ( 
LH_ADR_BREIT_AUS_LUT ));
00201                         ko = (aVal>>LH_DATA_SHR_CORR) & ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR))-1 );
00202                         aVal = (aVal >> ( 
LH_DATA_SHR )) + ( 2 << 
LH_ADR_BREIT_AUS_LUT );
00203                         *output2 = (
LH_DATA_OUT_TYPE)((My_OutputLut[aVal] * ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR )) - ko ) + My_OutputLut[aVal +1] * ko)>>(
LH_DATA_SHR - LH_DATA_SHR_CORR) );
00204 
00205                         
if( 
LH_DATA_OUT_COUNT > 3 ){
00206                         paNewVal0++;
00207                         aVal =                                   (ako0          * paNewVal0[0] +
00208                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT]);
00209                         aVal = aVal + ( aVal >> ( 
LH_LUT_DATA_SHR ));
00210                         aVal = aVal - ( aVal >> ( 
LH_ADR_BREIT_AUS_LUT ));
00211                         ko = (aVal>>LH_DATA_SHR_CORR) & ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR))-1 );
00212                         aVal = (aVal >> ( 
LH_DATA_SHR )) + ( 3 << 
LH_ADR_BREIT_AUS_LUT );
00213                         *output3 = (
LH_DATA_OUT_TYPE)((My_OutputLut[aVal] * ( (1<<( 
LH_DATA_SHR - LH_DATA_SHR_CORR )) - ko ) + My_OutputLut[aVal +1] * ko)>>(
LH_DATA_SHR - LH_DATA_SHR_CORR) );
00214                         }}
00215                         
00216 
                        #else
00217 
                        *output0 = My_OutputLut[((ako0          * paNewVal0[0] + 
00218                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (0<<
LH_ADR_BREIT_AUS_LUT)]>>8;
00219                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00220                         paNewVal0++;
00221                         *output1 = My_OutputLut[((ako0          * paNewVal0[0] + 
00222                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (1<<
LH_ADR_BREIT_AUS_LUT)]>>8;
00223                         paNewVal0++;
00224                         *output2 = My_OutputLut[((ako0          * paNewVal0[0] + 
00225                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (2<<
LH_ADR_BREIT_AUS_LUT)]>>8;
00226                         
if( 
LH_DATA_OUT_COUNT > 3 ){
00227                         paNewVal0++;
00228                         *output3 = My_OutputLut[((ako0          * paNewVal0[0] + 
00229                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (3<<
LH_ADR_BREIT_AUS_LUT)]>>8;
00230                         }}
00231 
                        #endif
00232 
                        
00233 
                        #else
00234 
                        *output0 = My_OutputLut[((ako0          * paNewVal0[0] + 
00235                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (0<<
LH_ADR_BREIT_AUS_LUT)];
00236                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00237                         paNewVal0++;
00238                         *output1 = My_OutputLut[((ako0          * paNewVal0[0] + 
00239                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (1<<
LH_ADR_BREIT_AUS_LUT)];
00240                         paNewVal0++;
00241                         *output2 = My_OutputLut[((ako0          * paNewVal0[0] + 
00242                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (2<<
LH_ADR_BREIT_AUS_LUT)];
00243                         
if( 
LH_DATA_OUT_COUNT > 3 ){
00244                         paNewVal0++;
00245                         *output3 = My_OutputLut[((ako0          * paNewVal0[0] + 
00246                                                                           ein_regr      * paNewVal0[
LH_DATA_OUT_COUNT])>>
LH_DATA_SHR) + (3<<
LH_ADR_BREIT_AUS_LUT)];
00247                         }}
00248 
                        #endif
00249 
00250 
                        #if LH_DATA_OUT_SIZE_16 && ! LH_LUT_DATA_SIZE_16
00251 
                        *output0 |= (*output0 << 8);
00252                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00253                         *output1 |= (*output1 << 8);
00254                         *output2 |= (*output2 << 8);
00255                         
if( 
LH_DATA_OUT_COUNT > 3 ){
00256                         *output3 |= (*output3 << 8);
00257                         }}
00258 
                        #endif
00259 
                        
00260                         
if (Mode == 
LH_CALC_ENGINE_P_TO_P)
00261                         {
00262                                 
while (--i)
00263                                 {
00264                                         input0 += inputOffset;
00265                                         output0 += outputOffset;
00266                                         output1 += outputOffset;
00267                                         output2 += outputOffset;
00268                                         output3 += outputOffset;
00269 
00270                                         
if ((*input0 ^ ein_cache)){
00271                                                 
break;
00272                                         }
00273                                         *output0 = output0[-outputOffset];
00274                                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00275                                         *output1 = output1[-outputOffset];
00276                                         *output2 = output2[-outputOffset];
00277                                         
if( 
LH_DATA_OUT_COUNT > 3 ){
00278                                         *output3 = output3[-outputOffset];
00279                                         }}
00280                                 }
00281                         }
00282                         
else if (Mode == 
LH_CALC_ENGINE_P_TO_U)
00283                         {
00284                                 
if( 
LH_DATA_OUT_COUNT == 1 ){
00285                                         *output1 &= Mask;
00286                                 }
else if( 
LH_DATA_OUT_COUNT == 3 ){
00287                                         *output3 &= Mask;
00288                                 }
else{
00289                                         *output4 &= Mask;
00290                                 }
00291                                 
while (--i)
00292                                 {
00293                                         input0 += inputOffset;
00294                                         output0 += outputOffset;
00295                                         output1 += outputOffset;
00296                                         output2 += outputOffset;
00297                                         output3 += outputOffset;
00298                                         output4 += outputOffset;
00299                                         
if ((*input0 ^ ein_cache)){
00300                                                 
break;
00301                                         }
00302                                         *output0 = output0[-outputOffset];
00303                                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00304                                                 *output1 = output1[-outputOffset];
00305                                                 *output2 = output2[-outputOffset];
00306                                                 
if( 
LH_DATA_OUT_COUNT > 3 ){
00307                                                         *output3 = output3[-outputOffset];
00308                                                         *output4 &= Mask;
00309                                                 }
00310                                                 
else{
00311                                                         *output3 &= Mask;
00312                                                 }
00313                                         }
00314                                         
else{
00315                                                 *output1 &= Mask;
00316                                         }
00317                                 }
00318                         }
00319                         
else
00320                         {
00321                                 
if( 
LH_DATA_OUT_COUNT == 1 ){
00322                                         *output1 = (
LH_DATA_OUT_TYPE)*input1;
00323                                 }
else if( 
LH_DATA_OUT_COUNT == 3 ){
00324                                         *output3 = (
LH_DATA_OUT_TYPE)*input1;
00325                                 }
else{
00326                                         *output4 = (
LH_DATA_OUT_TYPE)*input1;
00327                                 }
00328                                 
while (--i)
00329                                 {                                                               
00330                                         input0 += inputOffset;
00331                                         input1 += inputOffset;
00332                                         output0 += outputOffset;
00333                                         output1 += outputOffset;
00334                                         output2 += outputOffset;
00335                                         output3 += outputOffset;
00336                                         output4 += outputOffset;
00337                                         
if ((*input0 ^ ein_cache))
00338                                         {
00339                                                 
break;
00340                                         }
00341                                         *output0 = output0[-outputOffset];
00342                                         
if( 
LH_DATA_OUT_COUNT > 1 ){
00343                                                 *output1 = output1[-outputOffset];
00344                                                 *output2 = output2[-outputOffset];
00345                                                 
if( 
LH_DATA_OUT_COUNT > 3 ){
00346                                                         *output3 = output3[-outputOffset];
00347                                                         *output4 = (
LH_DATA_OUT_TYPE)*input1;
00348                                                 }
00349                                                 
else{
00350                                                         *output3 = (
LH_DATA_OUT_TYPE)*input1;
00351                                                 }
00352                                         }
00353                                         
else{
00354                                                 *output1 = (
LH_DATA_OUT_TYPE)*input1;
00355                                         }
00356                                 }
00357                         }
00358                 }
00359                 
if (--LineCount)
00360                 {
00361                         j++;
00362                         input0 = (
LH_DATA_IN_TYPE *)((
LH_UINT8 *)calcParam->inputData[0] + j * calcParam->cmInputBytesPerLine);
00363                         input1 = (
LH_DATA_IN_TYPE *)((
LH_UINT8 *)calcParam->inputData[1] + j * calcParam->cmInputBytesPerLine);
00364 
00365                         output0 = (
LH_DATA_OUT_TYPE *)((
LH_UINT8 *)calcParam->outputData[0] + j * calcParam->cmOutputBytesPerLine);
00366                         output1 = (
LH_DATA_OUT_TYPE *)((
LH_UINT8 *)calcParam->outputData[1] + j * calcParam->cmOutputBytesPerLine);
00367                         output2 = (
LH_DATA_OUT_TYPE *)((
LH_UINT8 *)calcParam->outputData[2] + j * calcParam->cmOutputBytesPerLine);
00368                         output3 = (
LH_DATA_OUT_TYPE *)((
LH_UINT8 *)calcParam->outputData[3] + j * calcParam->cmOutputBytesPerLine);
00369                         output4 = (
LH_DATA_OUT_TYPE *)((
LH_UINT8 *)calcParam->outputData[4] + j * calcParam->cmOutputBytesPerLine);
00370                 }
00371         }
00372         
LH_END_PROC(
LH_CALC_PROC_NAME)
00373         
return 0;
00374 }
00375 
#undef LH_CALC_PROC_NAME