00001
00019 #ifndef IMG_H
00020 #define IMG_H
00021
00022 #include "memry.h"
00023
00025 #define MAXIMAGEWIDTH (900*14)
00026
00027 #define MAXIMAGEHEIGHT (900*14)
00028
00029 #define COMPUTE_IMAGE_XDIM(xsize,bpp) ((bpp)>8 ? ((xsize)*(bpp)+7)/8 :((xsize)+8/(bpp)-1)/(8/(bpp)))
00030
00031 typedef INT8 (*IMAGE_OPENER) (int, INT32 *, INT32 *, INT8 *, INT8 *, INT32 *);
00032 typedef INT8 (*IMAGE_READER) (int, UINT8 *, INT32, INT32, INT8, INT32);
00033 typedef INT8 (*IMAGE_WRITER) (int, UINT8 *, INT32, INT32, INT8, INT8, INT32);
00034
00039 typedef UINT8 *COLOUR_PIX;
00040
00045 enum COLOUR_PIX_NAME
00046 {
00047 RED_PIX,
00048 GREEN_PIX,
00049 BLUE_PIX
00050 };
00051
00052 class DLLSYM IMAGELINE;
00053
00058 class DLLSYM IMAGE
00059 {
00060 public:
00061 IMAGE();
00062
00063 ~IMAGE () {
00064 destroy();
00065 }
00066
00067 IMAGE & operator= (
00068 IMAGE & source);
00069
00070 INT8 read_header(
00071 const char *name);
00072
00073 INT8 read(
00074 INT32 buflines);
00075
00076 INT8 write(
00077 const char *name);
00078
00079 INT8 create(
00080 INT32 x,
00081 INT32 y,
00082 INT8 bits_per_pixel);
00083
00084 INT8 capture(
00085 UINT8 *pixels,
00086 INT32 x,
00087 INT32 y,
00088 INT8 bits_per_pixel);
00089
00090 void destroy();
00091
00092 INT32 get_xsize() {
00093 return xsize;
00094 }
00095
00096 INT32 get_ysize() {
00097 return ysize;
00098 }
00099
00100 INT8 get_bpp() {
00101 return bpp;
00102 }
00103 INT8 get_bps() {
00104 return bps;
00105 }
00106 BOOL8 white_high() {
00107 return photo_interp;
00108 }
00109 UINT8 get_white_level() {
00110 return (1 << bpp) - 1;
00111 }
00112 INT32 get_res() {
00113 return res;
00114 }
00115 void set_res(
00116 INT32 resolution) {
00117 res = resolution;
00118 }
00119 UINT8 *get_buffer() {
00120 return image;
00121 }
00122
00123
00124 UINT8 pixel(
00125 INT32 x,
00126 INT32 y);
00127
00128 void fast_get_line(
00129 INT32 x,
00130 INT32 y,
00131 INT32 width,
00132 IMAGELINE *linebuf);
00133
00134 void get_line(
00135 INT32 x,
00136 INT32 y,
00137 INT32 width,
00138 IMAGELINE *linebuf,
00139 INT32 margins);
00140 void get_column(
00141 INT32 x,
00142 INT32 y,
00143 INT32 height,
00144 IMAGELINE *linebuf,
00145 INT32 margins);
00146
00147 void fast_put_line(
00148 INT32 x,
00149 INT32 y,
00150 INT32 width,
00151 IMAGELINE *linebuf);
00152
00153 void put_line(
00154 INT32 x,
00155 INT32 y,
00156 INT32 width,
00157 IMAGELINE *linebuf,
00158 INT32 margins);
00159 void put_column(
00160 INT32 x,
00161 INT32 y,
00162 INT32 height,
00163 IMAGELINE *linebuf,
00164 INT32 margins);
00165
00166 void check_legal_access(
00167 INT32 x,
00168 INT32 y,
00169 INT32 xext);
00170
00171 void convolver (
00172 INT32 win_width,
00173 INT32 win_height,
00174 void (*convolve) (
00175 UINT8 ** pixels,
00176 UINT8 bytespp,
00177 INT32 win_wd,
00178 INT32 win_ht,
00179 UINT8 ret_white_value,
00180 UINT8 * result));
00181
00182
00183 friend DLLSYM void copy_sub_image(IMAGE *source,
00184 INT32 xstart,
00185 INT32 ystart,
00186 INT32 xext,
00187 INT32 yext,
00188 IMAGE *dest,
00189 INT32 xdest,
00190 INT32 ydest,
00191 BOOL8 adjust_grey);
00192
00193
00194 friend DLLSYM void enlarge_sub_image(IMAGE *source,
00195 INT32 xstart,
00196 INT32 ystart,
00197 IMAGE *dest,
00198 INT32 xdest,
00199 INT32 ydest,
00200 INT32 xext,
00201 INT32 yext,
00202 INT32 scale,
00203 BOOL8 adjust_grey);
00204
00205
00206 friend DLLSYM void fast_reduce_sub_image(IMAGE *source,
00207 INT32 xstart,
00208 INT32 ystart,
00209 INT32 xext,
00210 INT32 yext,
00211 IMAGE *dest,
00212 INT32 xdest,
00213 INT32 ydest,
00214 INT32 scale,
00215 BOOL8 adjust_grey);
00216
00217
00218 friend DLLSYM void reduce_sub_image(IMAGE *source,
00219 INT32 xstart,
00220 INT32 ystart,
00221 INT32 xext,
00222 INT32 yext,
00223 IMAGE *dest,
00224 INT32 xdest,
00225 INT32 ydest,
00226 INT32 scale,
00227 BOOL8 adjust_grey);
00228
00229 private:
00230 INT8 bpp;
00231 INT8 bps;
00232 INT8 bytespp;
00233 INT8 lineskip;
00234 BOOL8 captured;
00235 INT8 photo_interp;
00236 INT32 xsize, ysize;
00237 INT32 res;
00238 UINT8 *image;
00239 INT32 xdim;
00240 INT32 bufheight;
00241 int fd;
00242 IMAGE_READER reader;
00243 INT32 ymin;
00244 INT32 ymax;
00245 INT8 bufread(
00246 INT32 y);
00247 };
00248
00253 class DLLSYM IMAGELINE
00254 {
00255 public:
00256 UINT8 * pixels;
00257 INT8 bpp;
00258 COLOUR_PIX operator[] (
00259 INT32 index) {
00260 return &pixels[index * 3];
00261 }
00262
00263 IMAGELINE() {
00264 linewidth = 0;
00265 line = NULL;
00266 pixels = line;
00267 bpp = 8;
00268 }
00269 void init(
00270 INT32 width) {
00271 if (width <= 0)
00272 width = MAXIMAGEWIDTH;
00273 if (width > linewidth) {
00274 if (line != NULL)
00275 free_mem(line);
00276 linewidth = width;
00277 line = (UINT8 *) alloc_mem (linewidth * sizeof (UINT8));
00278 }
00279 pixels = line;
00280 bpp = 8;
00281 }
00282 ~IMAGELINE () {
00283 if (line != NULL)
00284 free_mem(line);
00285 }
00286
00287 void set_bpp(
00288 INT8 new_bpp) {
00289 if (new_bpp <= 8)
00290 bpp = 8;
00291 else
00292 bpp = 24;
00293 }
00294
00295 void init() {
00296 if (line == NULL)
00297 init (0);
00298 else {
00299 pixels = line;
00300 bpp = 8;
00301 }
00302 }
00303
00304 friend void IMAGE::get_line(
00305 INT32 x,
00306 INT32 y,
00307 INT32 width,
00308 IMAGELINE *linebuf,
00309 INT32 margins);
00310
00311 friend void IMAGE::get_column(INT32 x,
00312 INT32 y,
00313 INT32 height,
00314 IMAGELINE *linebuf,
00315 INT32 margins);
00316
00317 friend void IMAGE::put_line(
00318 INT32 x,
00319 INT32 y,
00320 INT32 width,
00321 IMAGELINE *linebuf,
00322 INT32 margins);
00323
00324 friend void IMAGE::put_column(INT32 x,
00325 INT32 y,
00326 INT32 height,
00327 IMAGELINE *linebuf,
00328 INT32 margins);
00329
00330
00331 friend void IMAGE::fast_get_line(INT32 x,
00332 INT32 y,
00333 INT32 width,
00334 IMAGELINE *linebuf);
00335
00336
00337 friend void IMAGE::fast_put_line(INT32 x,
00338 INT32 y,
00339 INT32 width,
00340 IMAGELINE *linebuf);
00341
00342 private:
00343 UINT8 * line;
00344 INT32 linewidth;
00345 };
00346 #endif