00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
#ifndef LHGeneralIncs_h
00012
#include "General.h"
00013
#endif
00014
00015
#ifndef __LHStdConversionLuts__
00016
#include "StdConv.h"
00017
#endif
00018
00019
#if ! realThing
00020
#ifdef DEBUG_OUTPUT
00021
#define kThisFile kLHStdConversionLutsID
00022
#define __TYPES__
00023
#endif
00024
#endif
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 void Lab2XYZ_forCube16(
unsigned short *theCube,
long count)
00045 {
00046
register unsigned short *v;
00047
long i;
00048
long lon_aOff, lon_bOff, lon_L, Xl, Yl, Zl;
00049
long fract, index, leftVal, rightVal, lAux;
00050
00051
#ifdef DEBUG_OUTPUT
00052
OSErr err=
noErr;
00053
#endif
00054
00055
#ifdef SYM_C
00056
unsigned short L2Y[432];
00057 v = L2Y;
00058 *v++= 0; *v++= 7; *v++= 14; *v++= 21; *v++= 28; *v++= 35; *v++= 43; *v++= 50;
00059 *v++= 57; *v++= 64; *v++= 71; *v++= 78; *v++= 85; *v++= 92; *v++= 99; *v++= 106;
00060 *v++= 113; *v++= 120; *v++= 128; *v++= 135; *v++= 142; *v++= 149; *v++= 156; *v++= 164;
00061 *v++= 171; *v++= 180; *v++= 188; *v++= 196; *v++= 205; *v++= 214; *v++= 224; *v++= 233;
00062 *v++= 243; *v++= 253; *v++= 263; *v++= 274; *v++= 285; *v++= 296; *v++= 308; *v++= 320;
00063 *v++= 332; *v++= 344; *v++= 357; *v++= 370; *v++= 384; *v++= 397; *v++= 411; *v++= 426;
00064 *v++= 440; *v++= 455; *v++= 471; *v++= 487; *v++= 503; *v++= 519; *v++= 536; *v++= 553;
00065 *v++= 570; *v++= 588; *v++= 606; *v++= 625; *v++= 644; *v++= 663; *v++= 683; *v++= 703;
00066 *v++= 723; *v++= 744; *v++= 766; *v++= 787; *v++= 809; *v++= 832; *v++= 855; *v++= 878;
00067 *v++= 902; *v++= 926; *v++= 950; *v++= 975; *v++= 1001; *v++= 1027; *v++= 1053; *v++= 1080;
00068 *v++= 1107; *v++= 1135; *v++= 1163; *v++= 1192; *v++= 1221; *v++= 1250; *v++= 1280; *v++= 1311;
00069 *v++= 1342; *v++= 1373; *v++= 1405; *v++= 1438; *v++= 1470; *v++= 1504; *v++= 1538; *v++= 1572;
00070 *v++= 1607; *v++= 1643; *v++= 1679; *v++= 1715; *v++= 1752; *v++= 1790; *v++= 1828; *v++= 1866;
00071 *v++= 1906; *v++= 1945; *v++= 1986; *v++= 2026; *v++= 2068; *v++= 2110; *v++= 2152; *v++= 2195;
00072 *v++= 2239; *v++= 2283; *v++= 2328; *v++= 2373; *v++= 2419; *v++= 2466; *v++= 2513; *v++= 2561;
00073 *v++= 2609; *v++= 2658; *v++= 2707; *v++= 2757; *v++= 2808; *v++= 2860; *v++= 2912; *v++= 2964;
00074 *v++= 3018; *v++= 3071; *v++= 3126; *v++= 3181; *v++= 3237; *v++= 3293; *v++= 3351; *v++= 3408;
00075 *v++= 3467; *v++= 3526; *v++= 3586; *v++= 3646; *v++= 3707; *v++= 3769; *v++= 3831; *v++= 3895;
00076 *v++= 3959; *v++= 4023; *v++= 4088; *v++= 4154; *v++= 4221; *v++= 4288; *v++= 4356; *v++= 4425;
00077 *v++= 4495; *v++= 4565; *v++= 4636; *v++= 4708; *v++= 4780; *v++= 4853; *v++= 4927; *v++= 5002;
00078 *v++= 5077; *v++= 5153; *v++= 5230; *v++= 5308; *v++= 5386; *v++= 5466; *v++= 5546; *v++= 5626;
00079 *v++= 5708; *v++= 5790; *v++= 5874; *v++= 5957; *v++= 6042; *v++= 6128; *v++= 6214; *v++= 6301;
00080 *v++= 6389; *v++= 6478; *v++= 6567; *v++= 6658; *v++= 6749; *v++= 6841; *v++= 6934; *v++= 7028;
00081 *v++= 7122; *v++= 7218; *v++= 7314; *v++= 7411; *v++= 7509; *v++= 7608; *v++= 7707; *v++= 7808;
00082 *v++= 7909; *v++= 8012; *v++= 8115; *v++= 8219; *v++= 8324; *v++= 8430; *v++= 8536; *v++= 8644;
00083 *v++= 8753; *v++= 8862; *v++= 8972; *v++= 9084; *v++= 9196; *v++= 9309; *v++= 9423; *v++= 9538;
00084 *v++= 9654; *v++= 9770; *v++= 9888; *v++=10007; *v++=10126; *v++=10247; *v++=10368; *v++=10491;
00085 *v++=10614; *v++=10739; *v++=10864; *v++=10991; *v++=11118; *v++=11246; *v++=11375; *v++=11506;
00086 *v++=11637; *v++=11769; *v++=11902; *v++=12037; *v++=12172; *v++=12308; *v++=12446; *v++=12584;
00087 *v++=12723; *v++=12864; *v++=13005; *v++=13147; *v++=13291; *v++=13435; *v++=13581; *v++=13727;
00088 *v++=13875; *v++=14024; *v++=14173; *v++=14324; *v++=14476; *v++=14629; *v++=14783; *v++=14938;
00089 *v++=15094; *v++=15252; *v++=15410; *v++=15569; *v++=15730; *v++=15891; *v++=16054; *v++=16218;
00090 *v++=16383; *v++=16549; *v++=16716; *v++=16885; *v++=17054; *v++=17225; *v++=17396; *v++=17569;
00091 *v++=17743; *v++=17918; *v++=18094; *v++=18272; *v++=18450; *v++=18630; *v++=18811; *v++=18993;
00092 *v++=19176; *v++=19361; *v++=19546; *v++=19733; *v++=19921; *v++=20110; *v++=20301; *v++=20492;
00093 *v++=20685; *v++=20879; *v++=21074; *v++=21270; *v++=21468; *v++=21667; *v++=21867; *v++=22068;
00094 *v++=22270; *v++=22474; *v++=22679; *v++=22885; *v++=23093; *v++=23301; *v++=23511; *v++=23723;
00095 *v++=23935; *v++=24149; *v++=24364; *v++=24580; *v++=24798; *v++=25016; *v++=25237; *v++=25458;
00096 *v++=25681; *v++=25905; *v++=26130; *v++=26356; *v++=26584; *v++=26814; *v++=27044; *v++=27276;
00097 *v++=27509; *v++=27744; *v++=27979; *v++=28216; *v++=28455; *v++=28695; *v++=28936; *v++=29178;
00098 *v++=29422; *v++=29668; *v++=29914; *v++=30162; *v++=30411; *v++=30662; *v++=30914; *v++=31167;
00099 *v++=31422; *v++=31678; *v++=31936; *v++=32195; *v++=32455; *v++=32717; *v++=32980; *v++=33245;
00100 *v++=33511; *v++=33778; *v++=34047; *v++=34317; *v++=34589; *v++=34862; *v++=35137; *v++=35413;
00101 *v++=35690; *v++=35969; *v++=36249; *v++=36531; *v++=36814; *v++=37099; *v++=37385; *v++=37673;
00102 *v++=37962; *v++=38252; *v++=38544; *v++=38838; *v++=39133; *v++=39429; *v++=39727; *v++=40027;
00103 *v++=40328; *v++=40630; *v++=40934; *v++=41240; *v++=41547; *v++=41855; *v++=42165; *v++=42477;
00104 *v++=42790; *v++=43105; *v++=43421; *v++=43739; *v++=44058; *v++=44379; *v++=44701; *v++=45025;
00105 *v++=45351; *v++=45678; *v++=46006; *v++=46337; *v++=46668; *v++=47002; *v++=47337; *v++=47673;
00106 *v++=48011; *v++=48351; *v++=48692; *v++=49035; *v++=49380; *v++=49726; *v++=50074; *v++=50423;
00107 *v++=50774; *v++=51127; *v++=51481; *v++=51837; *v++=52194; *v++=52554; *v++=52914; *v++=53277;
00108 *v++=53641; *v++=54007; *v++=54374; *v++=54743; *v++=55114; *v++=55486; *v++=55861; *v++=56236;
00109 *v++=56614; *v++=56993; *v++=57374; *v++=57756; *v++=58141; *v++=58526; *v++=58914; *v++=59303;
00110 *v++=59694; *v++=60087; *v++=60482; *v++=60878; *v++=61276; *v++=61675; *v++=62077; *v++=62480;
00111 *v++=62885; *v++=63292; *v++=63700; *v++=64110; *v++=64522; *v++=64935; *v++=65351; *v++=65535;
00112
00113
#else
00114
static unsigned short L2Y[432] = {
00115 0, 7, 14, 21, 28, 35, 43, 50,
00116 57, 64, 71, 78, 85, 92, 99, 106,
00117 113, 120, 128, 135, 142, 149, 156, 164,
00118 171, 180, 188, 196, 205, 214, 224, 233,
00119 243, 253, 263, 274, 285, 296, 308, 320,
00120 332, 344, 357, 370, 384, 397, 411, 426,
00121 440, 455, 471, 487, 503, 519, 536, 553,
00122 570, 588, 606, 625, 644, 663, 683, 703,
00123 723, 744, 766, 787, 809, 832, 855, 878,
00124 902, 926, 950, 975, 1001, 1027, 1053, 1080,
00125 1107, 1135, 1163, 1192, 1221, 1250, 1280, 1311,
00126 1342, 1373, 1405, 1438, 1470, 1504, 1538, 1572,
00127 1607, 1643, 1679, 1715, 1752, 1790, 1828, 1866,
00128 1906, 1945, 1986, 2026, 2068, 2110, 2152, 2195,
00129 2239, 2283, 2328, 2373, 2419, 2466, 2513, 2561,
00130 2609, 2658, 2707, 2757, 2808, 2860, 2912, 2964,
00131 3018, 3071, 3126, 3181, 3237, 3293, 3351, 3408,
00132 3467, 3526, 3586, 3646, 3707, 3769, 3831, 3895,
00133 3959, 4023, 4088, 4154, 4221, 4288, 4356, 4425,
00134 4495, 4565, 4636, 4708, 4780, 4853, 4927, 5002,
00135 5077, 5153, 5230, 5308, 5386, 5466, 5546, 5626,
00136 5708, 5790, 5874, 5957, 6042, 6128, 6214, 6301,
00137 6389, 6478, 6567, 6658, 6749, 6841, 6934, 7028,
00138 7122, 7218, 7314, 7411, 7509, 7608, 7707, 7808,
00139 7909, 8012, 8115, 8219, 8324, 8430, 8536, 8644,
00140 8753, 8862, 8972, 9084, 9196, 9309, 9423, 9538,
00141 9654, 9770, 9888, 10007, 10126, 10247, 10368, 10491,
00142 10614, 10739, 10864, 10991, 11118, 11246, 11375, 11506,
00143 11637, 11769, 11902, 12037, 12172, 12308, 12446, 12584,
00144 12723, 12864, 13005, 13147, 13291, 13435, 13581, 13727,
00145 13875, 14024, 14173, 14324, 14476, 14629, 14783, 14938,
00146 15094, 15252, 15410, 15569, 15730, 15891, 16054, 16218,
00147 16383, 16549, 16716, 16885, 17054, 17225, 17396, 17569,
00148 17743, 17918, 18094, 18272, 18450, 18630, 18811, 18993,
00149 19176, 19361, 19546, 19733, 19921, 20110, 20301, 20492,
00150 20685, 20879, 21074, 21270, 21468, 21667, 21867, 22068,
00151 22270, 22474, 22679, 22885, 23093, 23301, 23511, 23723,
00152 23935, 24149, 24364, 24580, 24798, 25016, 25237, 25458,
00153 25681, 25905, 26130, 26356, 26584, 26814, 27044, 27276,
00154 27509, 27744, 27979, 28216, 28455, 28695, 28936, 29178,
00155 29422, 29668, 29914, 30162, 30411, 30662, 30914, 31167,
00156 31422, 31678, 31936, 32195, 32455, 32717, 32980, 33245,
00157 33511, 33778, 34047, 34317, 34589, 34862, 35137, 35413,
00158 35690, 35969, 36249, 36531, 36814, 37099, 37385, 37673,
00159 37962, 38252, 38544, 38838, 39133, 39429, 39727, 40027,
00160 40328, 40630, 40934, 41240, 41547, 41855, 42165, 42477,
00161 42790, 43105, 43421, 43739, 44058, 44379, 44701, 45025,
00162 45351, 45678, 46006, 46337, 46668, 47002, 47337, 47673,
00163 48011, 48351, 48692, 49035, 49380, 49726, 50074, 50423,
00164 50774, 51127, 51481, 51837, 52194, 52554, 52914, 53277,
00165 53641, 54007, 54374, 54743, 55114, 55486, 55861, 56236,
00166 56614, 56993, 57374, 57756, 58141, 58526, 58914, 59303,
00167 59694, 60087, 60482, 60878, 61276, 61675, 62077, 62480,
00168 62885, 63292, 63700, 64110, 64522, 64935, 65351, 65535 };
00169
#endif
00170
00171
LH_START_PROC(
"Lab2XYZ_forCube16")
00172
00173 v = theCube;
00174
00175
for(i=0; i<count; i++)
00176 {
00177 lon_L = (
long)v[0];
00178 lon_aOff = (
long)v[1];
00179 lon_bOff = (
long)v[2];
00180
00181
00182
00183 Xl = ((lon_aOff * 19 + 15) >> 5) - 19456 + lon_L;
00184
if(Xl < 0)
00185 Xl = 0;
00186
else
00187 {
00188 index = Xl >> 8;
00189
if(index > 431)
00190 Xl = (
long)L2Y[431] << 1;
00191
else
00192 {
00193 fract = Xl & 0x0FF;
00194 leftVal = (
long)L2Y[index];
00195 rightVal = (
long)L2Y[index + 1];
00196 lAux = (fract * (rightVal - leftVal) + 63) >> 7;
00197 Xl = (leftVal << 1) + lAux;
00198 }
00199 }
00200
00201
00202
00203 Zl = lon_L - ((lon_bOff * 95 + 31) >> 6) + 48640;
00204
if(Zl < 0)
00205 Zl = 0;
00206
else
00207 {
00208 index = Zl >> 8;
00209
if(index > 431)
00210 Zl = (
long)L2Y[431] << 1;
00211
else
00212 {
00213 fract = Zl & 0x0FF;
00214 leftVal = (
long)L2Y[index];
00215 rightVal = (
long)L2Y[index + 1];
00216 lAux = (fract * (rightVal - leftVal) + 63) >> 7;
00217 Zl = (leftVal << 1) + lAux;
00218 }
00219 }
00220
00221 Yl = lon_L;
00222 {
00223 index = Yl >> 8;
00224 {
00225 fract = Yl & 0x0FF;
00226 leftVal = (
long)L2Y[index];
00227 rightVal = (
long)L2Y[index + 1];
00228 lAux = (fract * (rightVal - leftVal) + 63) >> 7;
00229 Yl = (leftVal << 1) + lAux;
00230 }
00231 }
00232
00233
00234
00235 Xl = (Xl * 31595 + 16384) >> 15;
00236 Zl = (Zl * 13515 + 8192) >> 14;
00237
00238
if (Xl > 65535) Xl = 65535;
00239
if (Zl > 65535) Zl = 65535;
00240
00241 *v++ = (
unsigned short)Xl;
00242 *v++ = (
unsigned short)Yl;
00243 *v++ = (
unsigned short)Zl;
00244 }
00245
LH_END_PROC(
"Lab2XYZ_forCube16")
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263 void XYZ2Lab_forCube16(
unsigned short *theCube,
long count)
00264 {
00265
register unsigned short *v;
00266
long i;
00267
long lon_aOff, lon_bOff, lon_X, lon_Y, lon_Z;
00268
long fract, index, leftVal, rightVal;
00269
00270
#ifdef DEBUG_OUTPUT
00271
OSErr err=
noErr;
00272
#endif
00273
00274
#ifdef SYM_C
00275
unsigned short Y2L[432];
00276 v = Y2L;
00277 *v++= 0; *v++= 1156; *v++= 2312; *v++= 3391; *v++= 4260; *v++= 4993; *v++= 5635; *v++= 6208;
00278 *v++= 6730; *v++= 7209; *v++= 7654; *v++= 8070; *v++= 8462; *v++= 8833; *v++= 9185; *v++= 9520;
00279 *v++= 9841; *v++=10149; *v++=10445; *v++=10731; *v++=11006; *v++=11273; *v++=11531; *v++=11781;
00280 *v++=12024; *v++=12261; *v++=12491; *v++=12716; *v++=12935; *v++=13149; *v++=13358; *v++=13562;
00281 *v++=13762; *v++=13958; *v++=14150; *v++=14338; *v++=14523; *v++=14704; *v++=14883; *v++=15058;
00282 *v++=15230; *v++=15399; *v++=15565; *v++=15729; *v++=15890; *v++=16049; *v++=16206; *v++=16360;
00283 *v++=16512; *v++=16662; *v++=16810; *v++=16957; *v++=17101; *v++=17243; *v++=17384; *v++=17522;
00284 *v++=17659; *v++=17795; *v++=17929; *v++=18061; *v++=18192; *v++=18322; *v++=18450; *v++=18577;
00285 *v++=18702; *v++=18826; *v++=18949; *v++=19070; *v++=19191; *v++=19310; *v++=19428; *v++=19545;
00286 *v++=19661; *v++=19775; *v++=19889; *v++=20002; *v++=20114; *v++=20224; *v++=20334; *v++=20443;
00287 *v++=20551; *v++=20658; *v++=20764; *v++=20869; *v++=20974; *v++=21077; *v++=21180; *v++=21282;
00288 *v++=21383; *v++=21484; *v++=21584; *v++=21683; *v++=21781; *v++=21878; *v++=21975; *v++=22072;
00289 *v++=22167; *v++=22262; *v++=22356; *v++=22450; *v++=22543; *v++=22635; *v++=22727; *v++=22818;
00290 *v++=22908; *v++=22998; *v++=23087; *v++=23176; *v++=23265; *v++=23352; *v++=23439; *v++=23526;
00291 *v++=23612; *v++=23698; *v++=23783; *v++=23868; *v++=23952; *v++=24035; *v++=24119; *v++=24201;
00292 *v++=24284; *v++=24365; *v++=24447; *v++=24528; *v++=24608; *v++=24688; *v++=24768; *v++=24847;
00293 *v++=24926; *v++=25004; *v++=25082; *v++=25159; *v++=25237; *v++=25313; *v++=25390; *v++=25466;
00294 *v++=25541; *v++=25617; *v++=25692; *v++=25766; *v++=25840; *v++=25914; *v++=25988; *v++=26061;
00295 *v++=26134; *v++=26206; *v++=26278; *v++=26350; *v++=26421; *v++=26493; *v++=26563; *v++=26634;
00296 *v++=26704; *v++=26774; *v++=26844; *v++=26913; *v++=26982; *v++=27051; *v++=27119; *v++=27187;
00297 *v++=27255; *v++=27323; *v++=27390; *v++=27457; *v++=27524; *v++=27590; *v++=27656; *v++=27722;
00298 *v++=27788; *v++=27853; *v++=27919; *v++=27983; *v++=28048; *v++=28112; *v++=28177; *v++=28241;
00299 *v++=28304; *v++=28368; *v++=28431; *v++=28494; *v++=28556; *v++=28619; *v++=28681; *v++=28743;
00300 *v++=28805; *v++=28867; *v++=28928; *v++=28989; *v++=29050; *v++=29111; *v++=29171; *v++=29231;
00301 *v++=29291; *v++=29351; *v++=29411; *v++=29470; *v++=29530; *v++=29589; *v++=29647; *v++=29706;
00302 *v++=29765; *v++=29823; *v++=29881; *v++=29939; *v++=29996; *v++=30054; *v++=30111; *v++=30168;
00303 *v++=30225; *v++=30282; *v++=30339; *v++=30395; *v++=30451; *v++=30507; *v++=30563; *v++=30619;
00304 *v++=30674; *v++=30730; *v++=30785; *v++=30840; *v++=30895; *v++=30949; *v++=31004; *v++=31058;
00305 *v++=31112; *v++=31166; *v++=31220; *v++=31274; *v++=31327; *v++=31381; *v++=31434; *v++=31487;
00306 *v++=31540; *v++=31593; *v++=31645; *v++=31698; *v++=31750; *v++=31802; *v++=31854; *v++=31906;
00307 *v++=31958; *v++=32010; *v++=32061; *v++=32112; *v++=32164; *v++=32215; *v++=32265; *v++=32316;
00308 *v++=32367; *v++=32417; *v++=32468; *v++=32518; *v++=32568; *v++=32618; *v++=32668; *v++=32717;
00309 *v++=32767; *v++=32816; *v++=32866; *v++=32915; *v++=32964; *v++=33013; *v++=33062; *v++=33110;
00310 *v++=33159; *v++=33207; *v++=33256; *v++=33304; *v++=33352; *v++=33400; *v++=33448; *v++=33495;
00311 *v++=33543; *v++=33590; *v++=33638; *v++=33685; *v++=33732; *v++=33779; *v++=33826; *v++=33873;
00312 *v++=33919; *v++=33966; *v++=34013; *v++=34059; *v++=34105; *v++=34151; *v++=34197; *v++=34243;
00313 *v++=34289; *v++=34335; *v++=34380; *v++=34426; *v++=34471; *v++=34516; *v++=34562; *v++=34607;
00314 *v++=34652; *v++=34697; *v++=34741; *v++=34786; *v++=34831; *v++=34875; *v++=34919; *v++=34964;
00315 *v++=35008; *v++=35052; *v++=35096; *v++=35140; *v++=35184; *v++=35227; *v++=35271; *v++=35314;
00316 *v++=35358; *v++=35401; *v++=35444; *v++=35488; *v++=35531; *v++=35574; *v++=35617; *v++=35659;
00317 *v++=35702; *v++=35745; *v++=35787; *v++=35830; *v++=35872; *v++=35914; *v++=35956; *v++=35998;
00318 *v++=36040; *v++=36082; *v++=36124; *v++=36166; *v++=36208; *v++=36249; *v++=36291; *v++=36332;
00319 *v++=36373; *v++=36415; *v++=36456; *v++=36497; *v++=36538; *v++=36579; *v++=36620; *v++=36660;
00320 *v++=36701; *v++=36742; *v++=36782; *v++=36823; *v++=36863; *v++=36903; *v++=36943; *v++=36984;
00321 *v++=37024; *v++=37064; *v++=37104; *v++=37143; *v++=37183; *v++=37223; *v++=37262; *v++=37302;
00322 *v++=37342; *v++=37381; *v++=37420; *v++=37459; *v++=37499; *v++=37538; *v++=37577; *v++=37616;
00323 *v++=37655; *v++=37693; *v++=37732; *v++=37771; *v++=37810; *v++=37848; *v++=37887; *v++=37925;
00324 *v++=37963; *v++=38002; *v++=38040; *v++=38078; *v++=38116; *v++=38154; *v++=38192; *v++=38230;
00325 *v++=38268; *v++=38305; *v++=38343; *v++=38381; *v++=38418; *v++=38456; *v++=38493; *v++=38530;
00326 *v++=38568; *v++=38605; *v++=38642; *v++=38679; *v++=38716; *v++=38753; *v++=38790; *v++=38827;
00327 *v++=38864; *v++=38900; *v++=38937; *v++=38974; *v++=39010; *v++=39047; *v++=39083; *v++=39119;
00328 *v++=39156; *v++=39192; *v++=39228; *v++=39264; *v++=39300; *v++=39336; *v++=39372; *v++=39408;
00329 *v++=39444; *v++=39480; *v++=39516; *v++=39551; *v++=39587; *v++=39622; *v++=39658; *v++=39693;
00330 *v++=39729; *v++=39764; *v++=39799; *v++=39835; *v++=39870; *v++=39905; *v++=39940; *v++=39975;
00331
#else
00332
static unsigned short Y2L[439] = {
00333 0, 1156, 2312, 3391, 4260, 4993, 5635, 6208,
00334 6730, 7209, 7654, 8070, 8462, 8833, 9185, 9520,
00335 9841, 10149, 10445, 10731, 11006, 11273, 11531, 11781,
00336 12024, 12261, 12491, 12716, 12935, 13149, 13358, 13562,
00337 13762, 13958, 14150, 14338, 14523, 14704, 14883, 15058,
00338 15230, 15399, 15565, 15729, 15890, 16049, 16206, 16360,
00339 16512, 16662, 16810, 16957, 17101, 17243, 17384, 17522,
00340 17659, 17795, 17929, 18061, 18192, 18322, 18450, 18577,
00341 18702, 18826, 18949, 19070, 19191, 19310, 19428, 19545,
00342 19661, 19775, 19889, 20002, 20114, 20224, 20334, 20443,
00343 20551, 20658, 20764, 20869, 20974, 21077, 21180, 21282,
00344 21383, 21484, 21584, 21683, 21781, 21878, 21975, 22072,
00345 22167, 22262, 22356, 22450, 22543, 22635, 22727, 22818,
00346 22908, 22998, 23087, 23176, 23265, 23352, 23439, 23526,
00347 23612, 23698, 23783, 23868, 23952, 24035, 24119, 24201,
00348 24284, 24365, 24447, 24528, 24608, 24688, 24768, 24847,
00349 24926, 25004, 25082, 25159, 25237, 25313, 25390, 25466,
00350 25541, 25617, 25692, 25766, 25840, 25914, 25988, 26061,
00351 26134, 26206, 26278, 26350, 26421, 26493, 26563, 26634,
00352 26704, 26774, 26844, 26913, 26982, 27051, 27119, 27187,
00353 27255, 27323, 27390, 27457, 27524, 27590, 27656, 27722,
00354 27788, 27853, 27919, 27983, 28048, 28112, 28177, 28241,
00355 28304, 28368, 28431, 28494, 28556, 28619, 28681, 28743,
00356 28805, 28867, 28928, 28989, 29050, 29111, 29171, 29231,
00357 29291, 29351, 29411, 29470, 29530, 29589, 29647, 29706,
00358 29765, 29823, 29881, 29939, 29996, 30054, 30111, 30168,
00359 30225, 30282, 30339, 30395, 30451, 30507, 30563, 30619,
00360 30674, 30730, 30785, 30840, 30895, 30949, 31004, 31058,
00361 31112, 31166, 31220, 31274, 31327, 31381, 31434, 31487,
00362 31540, 31593, 31645, 31698, 31750, 31802, 31854, 31906,
00363 31958, 32010, 32061, 32112, 32164, 32215, 32265, 32316,
00364 32367, 32417, 32468, 32518, 32568, 32618, 32668, 32717,
00365 32767, 32816, 32866, 32915, 32964, 33013, 33062, 33110,
00366 33159, 33207, 33256, 33304, 33352, 33400, 33448, 33495,
00367 33543, 33590, 33638, 33685, 33732, 33779, 33826, 33873,
00368 33919, 33966, 34013, 34059, 34105, 34151, 34197, 34243,
00369 34289, 34335, 34380, 34426, 34471, 34516, 34562, 34607,
00370 34652, 34697, 34741, 34786, 34831, 34875, 34919, 34964,
00371 35008, 35052, 35096, 35140, 35184, 35227, 35271, 35314,
00372 35358, 35401, 35444, 35488, 35531, 35574, 35617, 35659,
00373 35702, 35745, 35787, 35830, 35872, 35914, 35956, 35998,
00374 36040, 36082, 36124, 36166, 36208, 36249, 36291, 36332,
00375 36373, 36415, 36456, 36497, 36538, 36579, 36620, 36660,
00376 36701, 36742, 36782, 36823, 36863, 36903, 36943, 36984,
00377 37024, 37064, 37104, 37143, 37183, 37223, 37262, 37302,
00378 37342, 37381, 37420, 37459, 37499, 37538, 37577, 37616,
00379 37655, 37693, 37732, 37771, 37810, 37848, 37887, 37925,
00380 37963, 38002, 38040, 38078, 38116, 38154, 38192, 38230,
00381 38268, 38305, 38343, 38381, 38418, 38456, 38493, 38530,
00382 38568, 38605, 38642, 38679, 38716, 38753, 38790, 38827,
00383 38864, 38900, 38937, 38974, 39010, 39047, 39083, 39119,
00384 39156, 39192, 39228, 39264, 39300, 39336, 39372, 39409,
00385 39444, 39480, 39516, 39551, 39588, 39622, 39658, 39693,
00386 39729, 39764, 39799, 39835, 39870, 39905, 39940, 39975,
00387 27253, 29259, 25185, 25954, 26734, 25967, 29798 };
00388
#endif
00389
00390
LH_START_PROC(
"XYZ2Lab_forCube16")
00391
00392 v = theCube;
00393
00394
for(i=0; i<count; i++)
00395 {
00396 lon_X = (
long)v[0];
00397 lon_Y = (
long)v[1];
00398 lon_Z = (
long)v[2];
00399
00400
00401
00402 index = lon_Y >> 7;
00403 fract = lon_Y & 0x7F;
00404
if(index < 431)
00405 {
00406 leftVal = Y2L[index];
00407 rightVal = Y2L[index + 1];
00408 lon_Y = leftVal + ((fract * (rightVal - leftVal) + 63) >> 7);
00409 }
00410
else
00411 lon_Y = Y2L[431];
00412
00413
00414
00415 lon_X = 531 * lon_X >> 4;
00416 index = lon_X >> 12;
00417 fract = lon_X & 0x0FFF;
00418
if(index < 431)
00419 {
00420 leftVal = Y2L[index];
00421 rightVal = Y2L[index + 1];
00422 lon_X = leftVal + ((fract * (rightVal - leftVal) + 2047) >> 12);
00423 }
00424
else
00425 lon_X = Y2L[431];
00426
00427 lon_Z = lon_Z * 9931 >> 8;
00428 index = lon_Z >> 12;
00429 fract = lon_Z & 0x0FFF;
00430
if(index < 431)
00431 {
00432 leftVal = Y2L[index];
00433 rightVal = Y2L[index + 1];
00434 lon_Z = leftVal + ((fract * (rightVal - leftVal) + 2047) >> 12);
00435 }
00436
else
00437 lon_Z = Y2L[431];
00438
00439
00440
00441
00442 lon_aOff = ((lon_X - lon_Y) * 431 + 4194368) >> 7;
00443
if(lon_aOff & 0xFFFF0000)
00444 {
00445
if(lon_aOff < 0)
00446 lon_aOff = 0;
00447
else if(lon_aOff > 65535)
00448 lon_aOff = 65535;
00449 }
00450
00451
00452 lon_bOff = ((lon_Y - lon_Z) * 11035 + 268439552) >> 13;
00453
if(lon_bOff & 0xFFFF0000)
00454 {
00455
if(lon_bOff < 0)
00456 lon_bOff = 0;
00457
else if(lon_bOff > 65535)
00458 lon_bOff = 65535;
00459 }
00460
00461 lon_Y <<= 1;
00462
if(lon_Y > 65535)
00463 lon_Y = 65535;
00464
00465 *v++ = (
unsigned short)lon_Y;
00466 *v++ = (
unsigned short)lon_aOff;
00467 *v++ = (
unsigned short)lon_bOff;
00468 }
00469
LH_END_PROC(
"XYZ2Lab_forCube16")
00470 }