00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef IMG_H
00021 #define IMG_H
00022
00023 #include "memry.h"
00024
00025 struct Pix;
00026
00028 #define MAXIMAGEWIDTH (900*14)
00029
00031 #define MAXIMAGEHEIGHT (900*14)
00032
00033 #define COMPUTE_IMAGE_XDIM(xsize,bpp) ((bpp)>8 ? ((xsize)*(bpp)+7)/8 :((xsize)+8/(bpp)-1)/(8/(bpp)))
00034
00035 typedef inT8 (*IMAGE_OPENER) (int, inT32 *, inT32 *, inT8 *, inT8 *, inT32 *);
00036 typedef inT8 (*IMAGE_READER) (int, uinT8 *, inT32, inT32, inT8, inT32);
00037 typedef inT8 (*IMAGE_WRITER) (int, uinT8 *, inT32, inT32, inT8, inT8, inT32);
00038
00040 typedef uinT8 *COLOUR_PIX;
00041 enum COLOUR_PIX_NAME
00042 {
00043 RED_PIX,
00044 GREEN_PIX,
00045 BLUE_PIX
00046 };
00047
00048 class DLLSYM IMAGELINE;
00049
00051 class DLLSYM IMAGE
00052 {
00053 public:
00054 IMAGE();
00055
00056 ~IMAGE () {
00057 destroy();
00058 }
00059
00060 IMAGE & operator= (
00061 IMAGE & source);
00062
00069 inT8 create(inT32 x,
00070 inT32 y,
00071 inT8 bits_per_pixel);
00072
00080 inT8 capture(uinT8 *pixels,
00081 inT32 x,
00082 inT32 y,
00083 inT8 bits_per_pixel);
00084
00086 void destroy();
00087
00092 inT32 get_xsize() {
00093 return xsize;
00094 }
00099 inT32 get_ysize() {
00100 return ysize;
00101 }
00106 inT8 get_bpp() {
00107 return bpp;
00108 }
00113 inT8 get_bps() {
00114 return bps;
00115 }
00117 BOOL8 white_high() {
00118 return photo_interp;
00119 }
00121 uinT8 get_white_level() {
00122 return (1 << bpp) - 1;
00123 }
00125 inT32 get_res() {
00126 return res;
00127 }
00129 void set_res(inT32 resolution) {
00130 res = resolution;
00131 }
00132 uinT8 *get_buffer() {
00133 return image;
00134 }
00135
00141 uinT8 pixel(inT32 x,
00142 inT32 y);
00143
00151 void fast_get_line(inT32 x,
00152 inT32 y,
00153 inT32 width,
00154 IMAGELINE *linebuf);
00155
00164 void get_line(inT32 x,
00165 inT32 y,
00166 inT32 width,
00167 IMAGELINE *linebuf,
00168 inT32 margins);
00177 void get_column(inT32 x,
00178 inT32 y,
00179 inT32 height,
00180 IMAGELINE *linebuf,
00181 inT32 margins);
00182
00190 void fast_put_line(inT32 x,
00191 inT32 y,
00192 inT32 width,
00193 IMAGELINE *linebuf);
00194
00203 void put_line(inT32 x,
00204 inT32 y,
00205 inT32 width,
00206 IMAGELINE *linebuf,
00207 inT32 margins);
00216 void put_column(inT32 x,
00217 inT32 y,
00218 inT32 height,
00219 IMAGELINE *linebuf,
00220 inT32 margins);
00221
00227 void check_legal_access(inT32 x,
00228 inT32 y,
00229 inT32 xext);
00230
00231
00233 Pix* ToPix();
00234 void FromPix(const Pix* src_pix);
00235
00242 void convolver (
00243 inT32 win_width,
00244 inT32 win_height,
00245 void (*convolve) (
00246 uinT8 ** pixels,
00247 uinT8 bytespp,
00248 inT32 win_wd,
00249 inT32 win_ht,
00250 uinT8 ret_white_value,
00251 uinT8 * result
00252 ));
00253
00254
00255 friend DLLSYM void copy_sub_image(IMAGE *source,
00256 inT32 xstart,
00257 inT32 ystart,
00258 inT32 xext,
00259 inT32 yext,
00260 IMAGE *dest,
00261 inT32 xdest,
00262 inT32 ydest,
00263 BOOL8 adjust_grey);
00264
00265
00266 friend DLLSYM void enlarge_sub_image(IMAGE *source,
00267 inT32 xstart,
00268 inT32 ystart,
00269 IMAGE *dest,
00270 inT32 xdest,
00271 inT32 ydest,
00272 inT32 xext,
00273 inT32 yext,
00274 inT32 scale,
00275 BOOL8 adjust_grey);
00276
00277
00278 friend DLLSYM void fast_reduce_sub_image(IMAGE *source,
00279 inT32 xstart,
00280 inT32 ystart,
00281 inT32 xext,
00282 inT32 yext,
00283 IMAGE *dest,
00284 inT32 xdest,
00285 inT32 ydest,
00286 inT32 scale,
00287 BOOL8 adjust_grey);
00288
00289
00290 friend DLLSYM void reduce_sub_image(IMAGE *source,
00291 inT32 xstart,
00292 inT32 ystart,
00293 inT32 xext,
00294 inT32 yext,
00295 IMAGE *dest,
00296 inT32 xdest,
00297 inT32 ydest,
00298 inT32 scale,
00299 BOOL8 adjust_grey);
00300
00301 private:
00302 inT8 bpp;
00303 inT8 bps;
00304 inT8 bytespp;
00305 inT8 lineskip;
00306 BOOL8 captured;
00307 inT8 photo_interp;
00308 inT32 xsize, ysize;
00309 inT32 res;
00310 uinT8 *image;
00311 inT32 xdim;
00312 inT32 bufheight;
00313 int fd;
00314 IMAGE_READER reader;
00315 inT32 ymin;
00316 inT32 ymax;
00317
00321 inT8 bufread(inT32 y);
00322 };
00323
00324 class DLLSYM IMAGELINE
00325 {
00326 public:
00327 uinT8 * pixels;
00328 inT8 bpp;
00329
00330 COLOUR_PIX operator[] (
00331 inT32 index) {
00332 return &pixels[index * 3];
00333 }
00334
00336 IMAGELINE() {
00337 linewidth = 0;
00338 line = NULL;
00339 pixels = line;
00340 bpp = 8;
00341 }
00342 void init(
00343 inT32 width) {
00344 if (width <= 0)
00345 width = MAXIMAGEWIDTH;
00346 if (width > linewidth) {
00347 if (line != NULL)
00348 free_mem(line);
00349 linewidth = width;
00350 line = (uinT8 *) alloc_mem (linewidth * sizeof (uinT8));
00351 }
00352 pixels = line;
00353 bpp = 8;
00354 }
00355 ~IMAGELINE () {
00356 if (line != NULL)
00357 free_mem(line);
00358 }
00359
00361 void set_bpp(inT8 new_bpp) {
00362 if (new_bpp <= 8)
00363 bpp = 8;
00364 else
00365 bpp = 24;
00366 }
00367
00368 void init() {
00369 if (line == NULL)
00370 init (0);
00371 else {
00372 pixels = line;
00373 bpp = 8;
00374 }
00375 }
00376
00385 friend void IMAGE::get_line(inT32 x,
00386 inT32 y,
00387 inT32 width,
00388 IMAGELINE *linebuf,
00389 inT32 margins);
00398 friend void IMAGE::get_column(inT32 x,
00399 inT32 y,
00400 inT32 height,
00401 IMAGELINE *linebuf,
00402 inT32 margins);
00403
00412 friend void IMAGE::put_line(inT32 x,
00413 inT32 y,
00414 inT32 width,
00415 IMAGELINE *linebuf,
00416 inT32 margins);
00417
00426 friend void IMAGE::put_column(inT32 x,
00427 inT32 y,
00428 inT32 height,
00429 IMAGELINE *linebuf,
00430 inT32 margins);
00431
00439 friend void IMAGE::fast_get_line(inT32 x,
00440 inT32 y,
00441 inT32 width,
00442 IMAGELINE *linebuf);
00443
00451 friend void IMAGE::fast_put_line(inT32 x,
00452 inT32 y,
00453 inT32 width,
00454 IMAGELINE *linebuf);
00455
00456 private:
00457 uinT8 * line;
00458 inT32 linewidth;
00459 };
00460 #endif