pixel.h Source File (original) (raw)

00001 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 #ifndef _GAN_PIXEL_H 00030 #define _GAN_PIXEL_H 00031 00032 #include <gandalf/common/misc_defs.h> 00033 #include <gandalf/common/bit_array.h> 00034 #include <gandalf/linalg/2vector.h> 00035 #include <gandalf/linalg/2vectorf.h> 00036 #include <gandalf/linalg/3vector.h> 00037 #include <gandalf/linalg/3vectorf.h> 00038 00039 #ifdef __cplusplus 00040 extern "C" { 00041 #endif 00042 00056 typedef enum 00057 { 00058 GAN_GREY_LEVEL_IMAGE,
00059 GAN_GREY_LEVEL_ALPHA_IMAGE, 00060 GAN_RGB_COLOUR_IMAGE,
00061 GAN_RGB_COLOUR_ALPHA_IMAGE, 00062 GAN_VECTOR_FIELD_2D,
00063 GAN_VECTOR_FIELD_3D,
00064 GAN_RGBX,
00065 GAN_RGBAS,
00066 GAN_YUVX444,
00067 GAN_YUVA444,
00068 GAN_YUV422,
00069 GAN_UNDEFINED_IMAGE_FORMAT 00070 } Gan_ImageFormat; 00071 00075 typedef struct Gan_GLAPixel_uc 00076 { 00077 unsigned char I, 00078 A; 00079 } Gan_GLAPixel_uc; 00080 00084 typedef struct Gan_GLAPixel_s 00085 { 00086 short I, 00087 A; 00088 } Gan_GLAPixel_s; 00089 00093 typedef struct Gan_GLAPixel_us 00094 { 00095 unsigned short I, 00096 A; 00097 } Gan_GLAPixel_us; 00098 00102 typedef struct Gan_GLAPixel_i 00103 { 00104 int I, 00105 A; 00106 } Gan_GLAPixel_i; 00107 00111 typedef struct Gan_GLAPixel_ui 00112 { 00113 unsigned int I, 00114 A; 00115 } Gan_GLAPixel_ui; 00116 00120 typedef struct Gan_GLAPixel_f 00121 { 00122 float I, 00123 A; 00124 } Gan_GLAPixel_f; 00125 00129 typedef struct Gan_GLAPixel_d 00130 { 00131 double I, 00132 A; 00133 } Gan_GLAPixel_d; 00134 00138 typedef struct Gan_RGBPixel_uc 00139 { 00140 unsigned char R, 00141 G, 00142 B; 00143 } Gan_RGBPixel_uc; 00144 00148 typedef struct Gan_RGBPixel_s 00149 { 00150 short R, 00151 G, 00152 B; 00153 } Gan_RGBPixel_s; 00154 00158 typedef struct Gan_RGBPixel_us 00159 { 00160 unsigned short R, 00161 G, 00162 B; 00163 } Gan_RGBPixel_us; 00164 00168 typedef struct Gan_RGBPixel_i 00169 { 00170 int R, 00171 G, 00172 B; 00173 } Gan_RGBPixel_i; 00174 00178 typedef struct Gan_RGBPixel_ui 00179 { 00180 unsigned int R, 00181 G, 00182 B; 00183 } Gan_RGBPixel_ui; 00184 00188 typedef struct Gan_RGBPixel_f 00189 { 00190 float R, 00191 G, 00192 B; 00193 } Gan_RGBPixel_f; 00194 00198 typedef struct Gan_RGBPixel_d 00199 { 00200 double R, 00201 G, 00202 B; 00203 } Gan_RGBPixel_d; 00204 00208 typedef struct Gan_RGBAPixel_uc 00209 { 00210 unsigned char R, 00211 G, 00212 B, 00213 A; 00214 } Gan_RGBAPixel_uc; 00215 00219 typedef struct Gan_RGBAPixel_s 00220 { 00221 short R, 00222 G, 00223 B, 00224 A; 00225 } Gan_RGBAPixel_s; 00226 00230 typedef struct Gan_RGBAPixel_us 00231 { 00232 unsigned short R, 00233 G, 00234 B, 00235 A; 00236 } Gan_RGBAPixel_us; 00237 00241 typedef struct Gan_RGBAPixel_i 00242 { 00243 int R, 00244 G, 00245 B, 00246 A; 00247 } Gan_RGBAPixel_i; 00248 00252 typedef struct Gan_RGBAPixel_ui 00253 { 00254 unsigned int R, 00255 G, 00256 B, 00257 A; 00258 } Gan_RGBAPixel_ui; 00259 00263 typedef struct Gan_RGBAPixel_f 00264 { 00265 float R, 00266 G, 00267 B, 00268 A; 00269 } Gan_RGBAPixel_f; 00270 00274 typedef struct Gan_RGBAPixel_d 00275 { 00276 double R, 00277 G, 00278 B, 00279 A; 00280 } Gan_RGBAPixel_d; 00281 00285 typedef struct Gan_RGBXPixel_ui8 00286 { 00287 unsigned int X : 8; 00288 unsigned int B : 8; 00289 unsigned int G : 8; 00290 unsigned int R : 8; 00291 } Gan_RGBXPixel_ui8; 00292 00296 typedef struct Gan_RGBXPixel_ui10 00297 { 00298 unsigned int X : 2;
00299 unsigned int B : 10; 00300 unsigned int G : 10; 00301 unsigned int R : 10; 00302 } Gan_RGBXPixel_ui10; 00303 00307 typedef struct Gan_RGBASPixel_ui10 00308 { 00309 unsigned int A : 2; 00310 unsigned int B : 10; 00311 unsigned int G : 10; 00312 unsigned int R : 10; 00313 } Gan_RGBASPixel_ui10; 00314 00320 typedef struct Gan_RGBAPixel_ui12 00321 { 00322 unsigned int A : 12; 00323 unsigned int B : 12; 00324 unsigned int G : 12; 00325 unsigned int R : 12; 00326 } Gan_RGBAPixel_ui12; 00327 00331 typedef struct Gan_YUVX444Pixel_ui8 00332 { 00333 gan_uint8 Y; 00334 gan_uint8 U; 00335 gan_uint8 V; 00336 gan_uint8 X; 00337 } Gan_YUVX444Pixel_ui8; 00338 00342 typedef struct Gan_YUVA444Pixel_ui8 00343 { 00344 gan_uint8 Y; 00345 gan_uint8 U; 00346 gan_uint8 V; 00347 gan_uint8 A; 00348 } Gan_YUVA444Pixel_ui8; 00349 00355 typedef struct Gan_YUV422Pixel_ui8 00356 { 00357 gan_uint8 UV; 00358 gan_uint8 Y;
00359 } Gan_YUV422Pixel_ui8; 00360 00364 typedef struct Gan_YXPixel_ui10 00365 { 00366 gan_uint16 X : 6; 00367 gan_uint16 Y : 10; 00368 } Gan_YXPixel_ui10; 00369 00373 typedef struct Gan_YXPixel_ui12 00374 { 00375 gan_uint16 X : 4; 00376 gan_uint16 Y : 12; 00377 } Gan_YXPixel_ui12; 00378 00379 #if (SIZEOF_CHAR == 1) 00380 00383 typedef struct Gan_GLAPixel_uc Gan_GLAPixel_ui8; 00384 00388 typedef struct Gan_RGBPixel_uc Gan_RGBPixel_ui8; 00389 00394 typedef struct Gan_RGBAPixel_uc Gan_RGBAPixel_ui8; 00395 #else 00396 #error "8-bit type conflict" 00397 #endif 00398 00399 #if (SIZEOF_SHORT == 2) 00400 00404 typedef struct Gan_GLAPixel_us Gan_GLAPixel_ui16; 00405 00409 typedef struct Gan_RGBPixel_us Gan_RGBPixel_ui16; 00410 00415 typedef struct Gan_RGBAPixel_us Gan_RGBAPixel_ui16; 00416 #else 00417 #error "16-bit type conflict" 00418 #endif 00419 00420 #if (SIZEOF_INT == 4) 00421 00424 typedef struct Gan_GLAPixel_ui Gan_GLAPixel_ui32; 00425 00429 typedef struct Gan_RGBPixel_ui Gan_RGBPixel_ui32; 00430 00434 typedef struct Gan_RGBPixel_i Gan_RGBPixel_i32; 00435 00439 typedef struct Gan_RGBAPixel_ui Gan_RGBAPixel_ui32; 00440 00444 typedef struct Gan_RGBAPixel_i Gan_RGBAPixel_i32; 00445 00446 #else 00447 #error "32-bit type conflict" 00448 #endif 00449 00450 #if (SIZEOF_FLOAT == 4) 00451 00454 typedef struct Gan_GLAPixel_f Gan_GLAPixel_f32; 00455 00459 typedef struct Gan_RGBPixel_f Gan_RGBPixel_f32; 00460 00464 typedef struct Gan_RGBAPixel_f Gan_RGBAPixel_f32; 00465 #else 00466 #error "32-bit float type conflict" 00467 #endif 00468 00469 #if (SIZEOF_DOUBLE == 8) 00470 00474 typedef struct Gan_GLAPixel_d Gan_GLAPixel_f64; 00475 00479 typedef struct Gan_RGBPixel_d Gan_RGBPixel_f64; 00480 00485 typedef struct Gan_RGBAPixel_d Gan_RGBAPixel_f64; 00486 #else 00487 #error "64-bit float type conflict" 00488 #endif 00489 00493 typedef struct Gan_Pixel 00494 { 00496 Gan_ImageFormat format; 00497 00499 Gan_Type type; 00500 00502 union 00503 { 00505 union 00506 { 00507 unsigned char uc; 00508 short s; 00509 unsigned short us; 00510 int i; 00511 unsigned int ui; 00512 double d; 00513 float f; 00514 Gan_Bool b; 00515 void *p; 00516 00517 gan_uint8 ui8; 00518 gan_uint16 ui16; 00519 gan_uint32 ui32; 00520 Gan_YXPixel_ui10 ui10; 00521 Gan_YXPixel_ui12 ui12; 00522 } gl; 00523 00525 union 00526 { 00527 Gan_GLAPixel_uc uc; 00528 Gan_GLAPixel_s s; 00529 Gan_GLAPixel_us us; 00530 Gan_GLAPixel_i i; 00531 Gan_GLAPixel_ui ui; 00532 Gan_GLAPixel_d d; 00533 Gan_GLAPixel_f f; 00534 00535 Gan_GLAPixel_ui8 ui8; 00536 Gan_GLAPixel_ui16 ui16; 00537 Gan_GLAPixel_ui32 ui32; 00538 } gla; 00539 00541 union 00542 { 00543 Gan_RGBPixel_uc uc; 00544 Gan_RGBPixel_s s; 00545 Gan_RGBPixel_us us; 00546 Gan_RGBPixel_i i; 00547 Gan_RGBPixel_ui ui; 00548 Gan_RGBPixel_d d; 00549 Gan_RGBPixel_f f; 00550 00551 Gan_RGBPixel_ui8 ui8; 00552 Gan_RGBPixel_ui16 ui16; 00553 Gan_RGBPixel_ui32 ui32; 00554 } rgb; 00555 00557 union 00558 { 00559 Gan_RGBAPixel_uc uc; 00560 Gan_RGBAPixel_s s; 00561 Gan_RGBAPixel_us us; 00562 Gan_RGBAPixel_i i; 00563 Gan_RGBAPixel_ui ui; 00564 Gan_RGBAPixel_d d; 00565 Gan_RGBAPixel_f f; 00566 00567 Gan_RGBAPixel_ui8 ui8; 00568 Gan_RGBAPixel_ui16 ui16; 00569 Gan_RGBAPixel_ui32 ui32; 00570 Gan_RGBAPixel_ui12 ui12; 00571 } rgba; 00572 00574 union 00575 { 00576 Gan_Vector2_f f; 00577 Gan_Vector2 d; 00578 Gan_Vector2_s s; 00579 Gan_Vector2_i i; 00580 } vfield2D; 00581 00583 union 00584 { 00585 Gan_Vector3_f f; 00586 Gan_Vector3 d; 00587 Gan_Vector3_s s; 00588 Gan_Vector3_i i; 00589 } vfield3D; 00590 00592 union 00593 { 00594 Gan_RGBXPixel_ui8 ui8; 00595 Gan_RGBXPixel_ui10 ui10; 00596 } rgbx; 00597 00599 union 00600 { 00601 Gan_RGBASPixel_ui10 ui10; 00602 } rgbas; 00603 00605 union 00606 { 00607 Gan_YUVX444Pixel_ui8 ui8; 00608 } yuvx444; 00609 00611 union 00612 { 00613 Gan_YUVA444Pixel_ui8 ui8; 00614 } yuva444; 00615 00617 union 00618 { 00619 Gan_YUV422Pixel_ui8 ui8; 00620 } yuv422; 00621 } data; 00622 } Gan_Pixel; 00623 00624 unsigned char gan_pixel_rgbuc_to_yuc ( const Gan_RGBPixel_uc *rgb ); 00625 unsigned short gan_pixel_rgbuc_to_yus ( const Gan_RGBPixel_uc *rgb ); 00626 unsigned int gan_pixel_rgbuc_to_yui ( const Gan_RGBPixel_uc *rgb ); 00627 unsigned char gan_pixel_rgbus_to_yuc ( const Gan_RGBPixel_us *rgb ); 00628 unsigned short gan_pixel_rgbus_to_yus ( const Gan_RGBPixel_us *rgb ); 00629 float gan_pixel_rgbui_to_yf ( const Gan_RGBPixel_ui *rgb ); 00630 float gan_pixel_rgbf_to_yf ( const Gan_RGBPixel_f *rgb ); 00631 double gan_pixel_rgbd_to_yd ( const Gan_RGBPixel_d *rgb ); 00632 unsigned char gan_pixel_rgbauc_to_yuc ( const Gan_RGBAPixel_uc *rgba ); 00633 unsigned short gan_pixel_rgbauc_to_yus ( const Gan_RGBAPixel_uc *rgba ); 00634 unsigned int gan_pixel_rgbauc_to_yui ( const Gan_RGBAPixel_uc *rgba ); 00635 unsigned char gan_pixel_rgbaus_to_yuc ( const Gan_RGBAPixel_us *rgba ); 00636 unsigned short gan_pixel_rgbaus_to_yus ( const Gan_RGBAPixel_us *rgba ); 00637 float gan_pixel_rgbaui_to_yf ( const Gan_RGBAPixel_ui *rgba ); 00638 float gan_pixel_rgbaf_to_yf ( const Gan_RGBAPixel_f *rgba ); 00639 double gan_pixel_rgbad_to_yd ( const Gan_RGBAPixel_d *rgba ); 00640 00641 Gan_Bool gan_image_convert_pixel ( Gan_Pixel *inpix, 00642 Gan_ImageFormat format, Gan_Type type, 00643 Gan_Pixel *outpix, int *error_code ); 00644 double gan_image_convert_scale ( Gan_Type gtFromType, Gan_Type gtToType ); 00645 Gan_Bool gan_image_offset_pixel_q ( Gan_Pixel *pixel, double offset, 00646 Gan_Pixel *offset_pixel ); 00647 Gan_Bool gan_image_scale_pixel_q ( Gan_Pixel *pixel, double scale, 00648 Gan_Pixel *scaled_pixel ); 00649 Gan_Bool gan_image_divide_pixel_q ( Gan_Pixel *pixel, double scale, 00650 Gan_Pixel *scaled_pixel ); 00651 Gan_Bool gan_image_fill_zero_pixel ( Gan_Pixel *pixel ); 00652 const char *gan_image_format_string ( Gan_ImageFormat format ); 00653 Gan_ImageFormat gan_image_format_with_alpha ( Gan_ImageFormat format ); 00654 Gan_ImageFormat gan_image_format_without_alpha ( Gan_ImageFormat format ); 00655 00659 gan_uint8 gan_pixel_rgbui8_to_yui8 ( const Gan_RGBPixel_ui8 *rgb ); 00660 00664 gan_uint16 gan_pixel_rgbui8_to_yui16 ( const Gan_RGBPixel_ui8 *rgb ); 00665 00669 gan_uint32 gan_pixel_rgbui8_to_yui32 ( const Gan_RGBPixel_ui8 *rgb ); 00670 00674 gan_uint8 gan_pixel_rgbui16_to_yui8 ( const Gan_RGBPixel_ui16 *rgb ); 00675 00679 gan_uint16 gan_pixel_rgbui16_to_yui16 ( const Gan_RGBPixel_ui16 *rgb ); 00680 00684 gan_float32 gan_pixel_rgbui32_to_yf32 ( const Gan_RGBPixel_ui32 *rgb ); 00685 00689 gan_float32 gan_pixel_rgbf32_to_yf32 ( const Gan_RGBPixel_f32 *rgb ); 00690 00694 gan_float64 gan_pixel_rgbf64_to_yf64 ( const Gan_RGBPixel_f64 *rgb ); 00695 00699 gan_uint8 gan_pixel_rgbaui8_to_yui8 ( const Gan_RGBAPixel_ui8 *rgba ); 00700 00704 gan_uint16 gan_pixel_rgbaui8_to_yui16 ( const Gan_RGBAPixel_ui8 *rgba ); 00705 00709 gan_uint32 gan_pixel_rgbaui8_to_yui32 ( const Gan_RGBAPixel_ui8 *rgba ); 00710 00714 gan_uint8 gan_pixel_rgbaui16_to_yui8 ( const Gan_RGBAPixel_ui16 *rgba ); 00715 00719 gan_uint16 gan_pixel_rgbaui16_to_yui16 ( const Gan_RGBAPixel_ui16 *rgba ); 00720 00724 gan_float32 gan_pixel_rgbaui32_to_yf32 ( const Gan_RGBAPixel_ui32 *rgba ); 00725 00729 gan_float32 gan_pixel_rgbaf32_to_yf32 ( const Gan_RGBAPixel_f32 *rgba ); 00730 00734 gan_float64 gan_pixel_rgbaf64_to_yf64 ( const Gan_RGBAPixel_f64 *rgba ); 00735 00739 unsigned char gan_pixel_us_to_uc ( unsigned short x ); 00740 00744 gan_uint8 gan_pixel_ui16_to_ui8 ( gan_uint16 x ); 00745 00749 unsigned char gan_pixel_ui_to_uc ( unsigned x ); 00750 00754 gan_uint8 gan_pixel_ui32_to_ui8 ( gan_uint32 x ); 00755 00761 unsigned char gan_pixel_f_to_uc ( float x ); 00762 00768 gan_uint8 gan_pixel_f32_to_ui8 ( gan_float32 x ); 00769 00775 unsigned char gan_pixel_d_to_uc ( double x ); 00776 00782 gan_uint8 gan_pixel_f64_to_ui8 ( gan_float64 x ); 00783 00787 unsigned short gan_pixel_uc_to_us ( unsigned char x ); 00788 00792 gan_uint16 gan_pixel_ui8_to_ui16 ( gan_uint8 x ); 00793 00797 unsigned short gan_pixel_ui_to_us ( unsigned x ); 00798 00802 gan_uint16 gan_pixel_ui32_to_ui16 ( gan_uint32 x ); 00803 00807 short gan_pixel_i_to_s ( int x ); 00808 00812 gan_int16 gan_pixel_i32_to_i16 ( gan_int32 x ); 00813 00819 unsigned short gan_pixel_f_to_us ( float x ); 00820 00826 gan_int16 gan_pixel_f32_to_ui16 ( gan_float32 x ); 00827 00833 unsigned short gan_pixel_d_to_us ( double x ); 00834 00840 gan_int16 gan_pixel_f64_to_ui16 ( gan_float64 x ); 00841 00845 unsigned int gan_pixel_uc_to_ui ( unsigned char x ); 00846 00850 gan_uint32 gan_pixel_ui8_to_ui32 ( gan_uint8 x ); 00851 00855 unsigned int gan_pixel_us_to_ui ( unsigned short x ); 00856 00860 gan_uint32 gan_pixel_ui16_to_ui32 ( gan_uint16 x ); 00861 00865 int gan_pixel_s_to_i ( short x ); 00866 00870 gan_int32 gan_pixel_i16_to_i32 ( gan_int16 x ); 00871 00877 unsigned int gan_pixel_f_to_ui ( float x ); 00878 00884 gan_uint32 gan_pixel_f32_to_ui32 ( gan_float32 x ); 00885 00891 unsigned int gan_pixel_d_to_ui ( double x ); 00892 00898 gan_uint32 gan_pixel_f64_to_ui32 ( gan_float64 x ); 00899 00900 extern float lookup_table_8bit[]; 00901 00902 00903 00904 00905 float gan_pixel_uc_to_f ( unsigned char x ); 00906 00907 00908 00909 00910 gan_float32 gan_pixel_ui8_to_f32 ( gan_uint8 x ); 00911 00915 float gan_pixel_us_to_f ( unsigned short x ); 00916 00920 gan_float32 gan_pixel_ui16_to_f32 ( gan_uint16 x ); 00921 00925 float gan_pixel_ui_to_f ( unsigned int x ); 00926 00930 gan_float32 gan_pixel_ui32_to_f32 ( gan_uint32 x ); 00931 00935 double gan_pixel_uc_to_d ( unsigned char x ); 00936 00940 gan_float64 gan_pixel_ui8_to_f64 ( gan_uint8 x ); 00941 00945 double gan_pixel_us_to_d ( unsigned short x ); 00946 00950 gan_float64 gan_pixel_ui16_to_f64 ( gan_uint16 x ); 00951 00955 double gan_pixel_ui_to_d ( unsigned int x ); 00956 00960 gan_float64 gan_pixel_ui32_to_f64 ( gan_uint32 x ); 00961
00967 int gan_pixel_f_to_i ( float x ); 00968 00974 gan_int32 gan_pixel_f32_to_i32 ( gan_float32 x ); 00975 00981 int gan_pixel_d_to_i ( double x ); 00982 00988 gan_int32 gan_pixel_f64_to_i32 ( gan_float64 x ); 00989 00995 short gan_pixel_f_to_s ( float x ); 00996 01002 gan_int16 gan_pixel_f32_to_i16 ( gan_float32 x ); 01003 01009 short gan_pixel_d_to_s ( double x ); 01010 01016 gan_int16 gan_pixel_f64_to_i16 ( gan_float64 x ); 01017 01021 float gan_pixel_s_to_f ( short x ); 01022 01026 gan_float32 gan_pixel_i16_to_f32 ( gan_int16 x ); 01027 01031 double gan_pixel_s_to_d ( short x ); 01032 01036 gan_float64 gan_pixel_i16_to_f64 ( gan_int16 x ); 01037
01041 float gan_pixel_i_to_f ( int x ); 01042 01046 gan_float32 gan_pixel_i32_to_f32 ( gan_int32 x ); 01047 01051 double gan_pixel_i_to_d ( int x ); 01052 01056 gan_float64 gan_pixel_i32_to_f64 ( gan_int32 x ); 01057 01058 01059 #if (SIZEOF_CHAR == 1) 01060 01062 int gan_pixel_f_to_ui8 ( float x ); 01063 01065 int gan_pixel_d_to_ui8 ( double x ); 01066 01068 float gan_pixel_ui8_to_f ( gan_uint8 x ); 01069 01071 double gan_pixel_ui8_to_d ( gan_uint8 x ); 01072 01073 #endif 01074 01075 01076 #if (SIZEOF_SHORT == 2) 01077 01079 int gan_pixel_f_to_ui16 ( float x ); 01080 01082 int gan_pixel_d_to_ui16 ( double x ); 01083 01085 float gan_pixel_ui16_to_f ( gan_uint16 x ); 01086 01088 double gan_pixel_ui16_to_d ( gan_uint16 x ); 01089 01090 #endif 01091 01092 01093 #if (SIZEOF_INT == 4) 01094 01096 int gan_pixel_f_to_ui32 ( float x ); 01097 01099 int gan_pixel_d_to_ui32 ( double x ); 01100 01102 float gan_pixel_ui32_to_f ( gan_uint32 x ); 01103 01105 double gan_pixel_ui32_to_d ( gan_uint32 x ); 01106 01107 #endif 01108 01116 Gan_Bool gan_image_convert_pixel_q ( Gan_Pixel *inpix, 01117 Gan_ImageFormat format, Gan_Type type, 01118 Gan_Pixel *outpix ); 01119 01127 Gan_Bool gan_image_convert_pixel_i ( Gan_Pixel *pix, 01128 Gan_ImageFormat format, Gan_Type type ); 01129 01137 Gan_Bool gan_image_offset_pixel_i ( Gan_Pixel *pixel, double offset ); 01138 01146 Gan_Bool gan_image_scale_pixel_i ( Gan_Pixel *pixel, double scale ); 01147 01155 Gan_Bool gan_image_divide_pixel_i ( Gan_Pixel *pixel, double scale ); 01156 01165 #ifdef __cplusplus 01166 } 01167 #endif 01168 01169 #endif