1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
//
// CUPS raster file display widget header file.
//
// Copyright 2002-2018 by Michael R Sweet.
//
// Licensed under Apache License v2.0. See the file "LICENSE" for more
// information.
//
#ifndef RasterDisplay_h
# define RasterDisplay_h
//
// Include necessary headers...
//
# include "raster.h"
# include <FL/Fl.H>
# include <FL/Fl_Group.H>
# include <FL/Fl_Scrollbar.H>
# include <zlib.h>
// Maximum pages
# define RASTER_MAX_PAGES 1000
//
// Display control modes...
//
enum
{
RASTER_MODE_PAN,
RASTER_MODE_ZOOM_IN,
RASTER_MODE_ZOOM_OUT,
RASTER_MODE_CLICK
};
//
// RasterDisplay widget...
//
class RasterDisplay : public Fl_Group
{
cups_raster_t *ras_; // Raster stream
const char *filename_; // Filename
gzFile fp_; // File pointer
int page_, // Current page number
num_pages_; // Number of pages
z_off_t pages_[RASTER_MAX_PAGES];
// Page offsets
cups_page_header2_t header_; // Page header for current page
int bpc_, // Bytes per color
bpp_; // Bytes per pixel
uchar *pixels_; // Pixel buffer
long alloc_pixels_; // Number of bytes allocated
uchar *colors_; // Color data buffer
long alloc_colors_; // Numebr of colors allocated
float factor_; // Zoom factor
int xsize_; // Bresenheim variables
int xstep_; // ...
int xmod_; // ...
int ysize_; // ...
Fl_Scrollbar xscrollbar_; // Horizontal scrollbar
Fl_Scrollbar yscrollbar_; // Vertical scrollbar
int mode_; // Viewing mode
int start_ex_, // Start position (mouse coords)
start_ey_;
int start_x_, // Start position (image coords)
start_y_;
int mouse_x_, // Current position (image coords)
mouse_y_;
int last_x_, // Previous position (image coords)
last_y_;
uchar device_colors_[15][3];
// CMY device colors
static void image_cb(void *p, int X, int Y, int W, uchar *D);
void load_colors();
void save_colors();
static void scrollbar_cb(Fl_Widget *w, void *d);
void update_mouse_xy();
void update_scrollbars();
protected:
void draw();
public:
RasterDisplay(int X, int Y, int W, int H, const char *L = 0);
~RasterDisplay();
int bytes_per_color() const { return bpc_; }
int bytes_per_pixel() const { return bpp_; }
int close_file();
void device_color(int n, Fl_Color c) { uchar r,g,b; Fl::get_color(c, r, g, b); device_colors_[n][0] = 255-r; device_colors_[n][1] = 255-g; device_colors_[n][2] = 255-b; save_colors();}
Fl_Color device_color(int n) { return (fl_rgb_color(255-device_colors_[n][0], 255-device_colors_[n][1], 255-device_colors_[n][2])); }
uchar *get_color(int X, int Y);
uchar *get_pixel(int X, int Y);
int handle(int event);
cups_page_header2_t *header() { return &header_; }
int is_subtractive();
int load_page();
void mode(int m) { mode_ = m; }
int mode() const { return mode_; }
int mouse_x() const { return mouse_x_; }
int mouse_y() const { return mouse_y_; }
int num_pages() const { return num_pages_; }
int page(void);
void page(int number);
void position(int X, int Y);
void resize(int X, int Y, int W, int H);
void scale(float factor);
float scale() const { return factor_; }
int start_x() const { return start_x_; }
int start_y() const { return start_y_; }
int open_file(const char *filename);
int xposition() { return xscrollbar_.value(); }
int yposition() { return yscrollbar_.value(); }
};
#endif // !RasterDisplay_h
|