| /********************************************************************** |
| * File: img.h (Formerly image.h) |
| * Description: Class definition for the IMAGE class. |
| * Author: Ray Smith |
| * Created: Thu Jun 07 13:42:37 BST 1990 |
| * |
| * (C) Copyright 1990, Hewlett-Packard Ltd. |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| * |
| **********************************************************************/ |
| |
| #ifndef IMG_H |
| #define IMG_H |
| |
| #include "memry.h" |
| |
| struct Pix; |
| |
| #define MAXIMAGEWIDTH (900*14) /*14inch * 400dpi */ |
| /*14inch * 400dpi */ |
| #define MAXIMAGEHEIGHT (900*14) |
| |
| #define COMPUTE_IMAGE_XDIM(xsize,bpp) ((bpp)>8 ? ((xsize)*(bpp)+7)/8 :((xsize)+8/(bpp)-1)/(8/(bpp))) |
| |
| typedef inT8 (*IMAGE_OPENER) (int, inT32 *, inT32 *, inT8 *, inT8 *, inT32 *); |
| typedef inT8 (*IMAGE_READER) (int, uinT8 *, inT32, inT32, inT8, inT32); |
| typedef inT8 (*IMAGE_WRITER) (int, uinT8 *, inT32, inT32, inT8, inT8, inT32); |
| |
| typedef uinT8 *COLOUR_PIX; //array of colours |
| enum COLOUR_PIX_NAME |
| { |
| RED_PIX, |
| GREEN_PIX, |
| BLUE_PIX |
| }; |
| |
| class DLLSYM IMAGELINE; |
| |
| class DLLSYM IMAGE //encapsulated image |
| { |
| public: |
| IMAGE(); //constructor |
| |
| ~IMAGE () { //destructor |
| destroy(); //free memory |
| } |
| |
| IMAGE & operator= ( //assignment |
| IMAGE & source); |
| |
| inT8 read_header( //get file header |
| const char *name); //name of image |
| |
| inT8 read( //get rest of image |
| inT32 buflines); //size of buffer |
| |
| inT8 write( //write image |
| const char *name); //name to write |
| |
| inT8 create( //create blank image |
| inT32 x, //x size required |
| inT32 y, //ysize required |
| inT8 bits_per_pixel); //bpp required |
| |
| inT8 capture( //capture raw image |
| uinT8 *pixels, //pixels to capture |
| inT32 x, //x size required |
| inT32 y, //ysize required |
| inT8 bits_per_pixel); //bpp required |
| |
| void destroy(); //destroy image |
| |
| inT32 get_xsize() { |
| return xsize; |
| } |
| //access function |
| inT32 get_ysize() { |
| return ysize; |
| } |
| //access function |
| inT8 get_bpp() { |
| return bpp; |
| } //access function |
| inT8 get_bps() { |
| return bps; |
| } //bits per sample |
| BOOL8 white_high() { //photo interp |
| return photo_interp; |
| } |
| uinT8 get_white_level() { //access function |
| return (1 << bpp) - 1; |
| } |
| inT32 get_res() { |
| return res; |
| } //access function |
| void set_res( //set resolution |
| inT32 resolution) { |
| res = resolution; |
| } |
| uinT8 *get_buffer() { |
| return image; |
| } |
| //access function |
| |
| uinT8 pixel( //access pixel |
| inT32 x, //x coord |
| inT32 y); //y coord |
| |
| void fast_get_line( //get image line |
| inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 width, //no of pixels to get |
| IMAGELINE *linebuf); //line to copy to |
| |
| void get_line( //get image line |
| inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 width, //no of pixels to get |
| IMAGELINE *linebuf, //line to copy to |
| inT32 margins); //size of margins |
| void get_column( //get image column |
| inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 height, //no of pixels to get |
| IMAGELINE *linebuf, //line to copy to |
| inT32 margins); //size of margins |
| |
| void fast_put_line( //put image line |
| inT32 x, //coord to start at |
| inT32 y, //line to put |
| inT32 width, //no of pixels to put |
| IMAGELINE *linebuf); //line to copy from |
| |
| void put_line( //put image line |
| inT32 x, //coord to start at |
| inT32 y, //line to put |
| inT32 width, //no of pixels to put |
| IMAGELINE *linebuf, //line to copy from |
| inT32 margins); //size of margins |
| void put_column( //put image column |
| inT32 x, //coord to start at |
| inT32 y, //line to put |
| inT32 height, //no of pixels to put |
| IMAGELINE *linebuf, //line to copy to |
| inT32 margins); //size of margins |
| |
| void check_legal_access( //check coords |
| inT32 x, //xcoord to check |
| inT32 y, |
| inT32 xext); //ycoord to check |
| |
| |
| // Methods to convert image types. Only available if Leptonica is available. |
| Pix* ToPix(); |
| void FromPix(const Pix* src_pix); |
| |
| void convolver ( //Map fn over window |
| inT32 win_width, //Window width |
| inT32 win_height, //Window height |
| void (*convolve) ( //Conv Function |
| uinT8 ** pixels, //Of window |
| uinT8 bytespp, //1 or 3 for colour |
| inT32 win_wd, //Window width |
| inT32 win_ht, //Window height |
| uinT8 ret_white_value, //White value to RETURN |
| uinT8 * result)); //Result pixel(s) |
| |
| //copy rectangle |
| friend DLLSYM void copy_sub_image(IMAGE *source, //source image |
| inT32 xstart, //start coords |
| inT32 ystart, |
| inT32 xext, //extent to copy |
| inT32 yext, |
| IMAGE *dest, //destination image |
| inT32 xdest, //destination coords //shift to match bpp |
| inT32 ydest, |
| BOOL8 adjust_grey); |
| |
| //enlarge rectangle |
| friend DLLSYM void enlarge_sub_image(IMAGE *source, //source image |
| inT32 xstart, //scaled coords |
| inT32 ystart, |
| IMAGE *dest, //destination image |
| inT32 xdest, //destination coords |
| inT32 ydest, |
| inT32 xext, //extent to copy |
| inT32 yext, |
| inT32 scale, //scale factor |
| BOOL8 adjust_grey); //shift to match bpp |
| |
| //reduce rectangle |
| friend DLLSYM void fast_reduce_sub_image(IMAGE *source, //source image |
| inT32 xstart, //start coords |
| inT32 ystart, |
| inT32 xext, //extent to copy |
| inT32 yext, |
| IMAGE *dest, //destination image |
| inT32 xdest, //destination coords |
| inT32 ydest, |
| inT32 scale, //scale factor |
| BOOL8 adjust_grey); //shift to match bpp |
| |
| //reduce rectangle |
| friend DLLSYM void reduce_sub_image(IMAGE *source, //source image |
| inT32 xstart, //start coords |
| inT32 ystart, |
| inT32 xext, //extent to copy |
| inT32 yext, |
| IMAGE *dest, //destination image |
| inT32 xdest, //destination coords |
| inT32 ydest, |
| inT32 scale, //scale factor |
| BOOL8 adjust_grey); //shift to match bpp |
| |
| private: |
| inT8 bpp; //bits per pixel |
| inT8 bps; //bits per sample |
| inT8 bytespp; //per pixel |
| inT8 lineskip; //waste bytes on line |
| BOOL8 captured; //true if buffer captured |
| inT8 photo_interp; //interpretation |
| inT32 xsize, ysize; //size of image |
| inT32 res; //resolution |
| uinT8 *image; //the actual image |
| inT32 xdim; //bytes per line |
| inT32 bufheight; //height of buffer |
| int fd; //open file descriptor |
| IMAGE_READER reader; //reading function |
| inT32 ymin; //bottom line in mem |
| inT32 ymax; //top line in mem+1 |
| inT8 bufread( //read some more |
| inT32 y); //ycoord required |
| }; |
| |
| class DLLSYM IMAGELINE //one line of image |
| { |
| public: |
| uinT8 * pixels; //image pixels |
| inT8 bpp; //bits per pixel |
| COLOUR_PIX operator[] ( //colour pixels |
| inT32 index) { |
| return &pixels[index * 3]; //coercion access op |
| } |
| |
| IMAGELINE() { //default constructor |
| linewidth = 0; |
| line = NULL; |
| pixels = line; |
| bpp = 8; |
| } |
| void init( //setup size |
| inT32 width) { //size of line |
| if (width <= 0) |
| width = MAXIMAGEWIDTH; |
| if (width > linewidth) { |
| if (line != NULL) |
| free_mem(line); |
| linewidth = width; |
| line = (uinT8 *) alloc_mem (linewidth * sizeof (uinT8)); |
| } |
| pixels = line; |
| bpp = 8; |
| } |
| ~IMAGELINE () { //destructor |
| if (line != NULL) |
| free_mem(line); |
| } |
| |
| void set_bpp( //For colour |
| inT8 new_bpp) { |
| if (new_bpp <= 8) |
| bpp = 8; |
| else |
| bpp = 24; |
| } |
| |
| void init() { |
| if (line == NULL) |
| init (0); |
| else { |
| pixels = line; |
| bpp = 8; |
| } |
| } |
| |
| friend void IMAGE::get_line( //copies a line |
| inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 width, //no of pixels to get |
| IMAGELINE *linebuf, //line to copy to |
| inT32 margins); //size of margins |
| //copies a column |
| friend void IMAGE::get_column(inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 height, //no of pixels to get |
| IMAGELINE *linebuf, //line to copy to |
| inT32 margins); //size of margins |
| |
| friend void IMAGE::put_line( //writes a line |
| inT32 x, //coord to start at |
| inT32 y, //line to put |
| inT32 width, //no of pixels to put |
| IMAGELINE *linebuf, //line to copy from |
| inT32 margins); //size of margins |
| //writes a column |
| friend void IMAGE::put_column(inT32 x, //coord to start at |
| inT32 y, //line to put |
| inT32 height, //no of pixels to put |
| IMAGELINE *linebuf, //line to copy from |
| inT32 margins); //size of margins |
| |
| //may just change pointer |
| friend void IMAGE::fast_get_line(inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 width, //no of pixels to get |
| IMAGELINE *linebuf); //line to copy to |
| |
| //may just change pointer |
| friend void IMAGE::fast_put_line(inT32 x, //coord to start at |
| inT32 y, //line to get |
| inT32 width, //no of pixels to get |
| IMAGELINE *linebuf); //line to copy to |
| |
| private: |
| uinT8 * line; //local buffer |
| inT32 linewidth; //width of buffer |
| }; |
| #endif |