Created FL/Fl_PSfile_Device.H to reduce size of FL/Fl_Printer.H

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7306 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy
2010-03-20 08:31:19 +00:00
parent aca570e1ce
commit e107a3682c
7 changed files with 526 additions and 518 deletions
+12 -5
View File
@@ -161,16 +161,23 @@ protected:
virtual void draw(Fl_Bitmap * bmp,int XP, int YP, int WP, int HP, int cx, int cy);
public:
/**
@brief All implemented graphics output devices.
*/
enum device_types {
xlib_display = 0, quartz_display, gdi_display,
gdi_printer = 256, quartz_printer, postscript_device
xlib_display = 0, /**< The X11 display. */
quartz_display, /**< The Mac OS X display. */
gdi_display, /**< The MSWindows display. */
gdi_printer = 256, /**< The MSWindows printer. */
quartz_printer, /**< The Mac OS X printer. */
postscript_device /**< The PostScript device. */
};
/**
@brief An RTTI emulation of device classes. It returns values < 256 if it is a screen device
@brief An RTTI emulation of device classes. It returns values < 256 if it is a display device
*/
int type() {return type_;};
/**
@brief Sets this device (display, local file, printer) as the target of future graphics calls.
@brief Sets this device (display, printer, local file) as the target of future graphics calls.
*
@return The current target device of graphics calls.
*/
@@ -195,7 +202,7 @@ extern Fl_Device *fl_device;
@brief A virtual class subclassed for OS-specific display graphics.
*/
class Fl_Display : public Fl_Device {
friend class Fl_PSfile_Device; //RK: temporary hack for font sizes
friend class Fl_PSfile_Device;
};
#if defined(__APPLE__) || defined(FL_DOXYGEN)
+293
View File
@@ -0,0 +1,293 @@
//
// "$Id:$"
//
// Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK).
//
// Copyright 2010 by Bill Spitzak and others.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA.
//
// Please report all bugs and problems on the following page:
//
// http://www.fltk.org/str.php
//
#include <FL/Fl_Printer.H>
#ifndef Fl_PSfile_Device_H
#define Fl_PSfile_Device_H
/**
\brief Sends all graphics to a local PostScript file; same API as Fl_Printer class.
*
This class has the same API as class Fl_Printer except for start_job() member function.
\see class Fl_Printer.
*/
class Fl_PSfile_Device : public Fl_Abstract_Printer {
public:
/**
@brief Possible page formats.
*/
enum Page_Format{
A0 = 0,
A1,
A2,
A3,
A4,
A5,
A6,
A7,
A8,
A9,
B0,
B1,
B2,
B3,
B4,
B5,
B6,
B7,
B8,
B9,
B10,
C5E,
DLE,
EXECUTIVE,
FOLIO,
LEDGER,
LEGAL,
LETTER,
TABLOID,
ENVELOPE,
MEDIA = 0x1000
};
/**
@brief Possible page layouts.
*/
enum Page_Layout {PORTRAIT = 0, LANDSCAPE = 0x100, REVERSED = 0x200, ORIENTATION = 0x300};
#ifndef FL_DOXYGEN
private:
enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS};
class Clip{
public:
int x, y, w, h;
Clip *prev;
};
Clip * clip_;
int lang_level_;
int font_;
int size_;
Fl_Color color_;
int gap_;
int pages_;
double width_;
double height_;
int shape_;
int linewidth_;// need for clipping, lang level 1-2
int linestyle_;//
int interpolate_; //interpolation of images
unsigned char cr_,cg_,cb_;
char linedash_[256];//should be enought
void concat(); // transform ror scalable dradings...
void reconcat(); //invert
void recover(); //recovers the state afrer grestore (such as line styles...)
void reset();
uchar * mask;
int mx; // width of mask;
int my; // mask lines
//Fl_Color bg_;
int (*close_cmd_)(FILE *);
int page_policy_;
int nPages;
int orientation_;
float scale_x;
float scale_y;
float angle;
int left_margin;
int top_margin;
protected:
struct page_format {
int width;
int height;
const char *name;
};
FILE *output;
double pw_, ph_;
static const int NO_PAGE_FORMATS=30;
static const struct page_format page_formats[NO_PAGE_FORMATS];
uchar bg_r, bg_g, bg_b;
int start_postscript (int pagecount, enum Page_Format format, enum Page_Layout layout);
/* int alpha_mask(const uchar * data, int w, int h, int D, int LD=0);
*/
void draw(const char* s, int n, int x, int y) {transformed_draw(s,n,x,y); };
void draw(int angle, const char *str, int n, int x, int y);
void transformed_draw(const char* s, int n, double x, double y); //precise text placing
void transformed_draw(const char* s, double x, double y);
int alpha_mask(const uchar * data, int w, int h, int D, int LD=0);
void draw_scaled_image(const uchar *data, double x, double y, double w, double h, int iw, int ih, int D=3, int LD=0);
void draw_scaled_image_mono(const uchar *data, double x, double y, double w, double h, int iw, int ih, int D=3, int LD=0);
void draw_scaled_image(Fl_Draw_Image_Cb call, void *data, double x, double y, double w, double h, int iw, int ih, int D);
void draw_scaled_image_mono(Fl_Draw_Image_Cb call, void *data, double x, double y, double w, double h, int iw, int ih, int D);
enum Page_Format page_format_;
char *ps_filename_;
// implementation of drawing methods
void color(Fl_Color c);
//void bg_color(Fl_Color bg);
void color(uchar r, uchar g, uchar b);
Fl_Color color(){return color_;};
void push_clip(int x, int y, int w, int h);
int clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, int &H);
int not_clipped(int x, int y, int w, int h);
void push_no_clip();
void pop_clip();
void line_style(int style, int width=0, char* dashes=0);
void rect(int x, int y, int w, int h);
void rectf(int x, int y, int w, int h);
void xyline(int x, int y, int x1);
void xyline(int x, int y, int x1, int y2);
void xyline(int x, int y, int x1, int y2, int x3);
void yxline(int x, int y, int y1);
void yxline(int x, int y, int y1, int x2);
void yxline(int x, int y, int y1, int x2, int y3);
void line(int x1, int y1, int x2, int y2);
void line(int x1, int y1, int x2, int y2, int x3, int y3);
void loop(int x0, int y0, int x1, int y1, int x2, int y2);
void loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2);
void polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3);
void point(int x, int y);
void begin_points();
void begin_line();
void begin_loop();
void begin_polygon();
void vertex(double x, double y);
void curve(double x, double y, double x1, double y1, double x2, double y2, double x3, double y3);
void circle(double x, double y, double r);
void arc(double x, double y, double r, double start, double a);
void arc(int x, int y, int w, int h, double a1, double a2);
void pie(int x, int y, int w, int h, double a1, double a2);
void end_points();
void end_line();
void end_loop();
void end_polygon();
void begin_complex_polygon(){begin_polygon();};
void gap(){gap_=1;};
void end_complex_polygon(){end_polygon();};
void transformed_vertex(double x, double y);
void font(int face, int size);
int font(){return font_;};
int size(){return size_;};
double width(unsigned c);
double width(const char* s, int n);
int descent();
int height();
void draw_image(const uchar* d, int x,int y,int w,int h, int delta=3, int ldelta=0){draw_scaled_image(d,x,y,w,h,w,h,delta,ldelta);};
void draw_image_mono(const uchar* d, int x,int y,int w,int h, int delta=1, int ld=0){draw_scaled_image_mono(d,x,y,w,h,w,h,delta,ld);};
void draw_image(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=3){draw_scaled_image(call,data, x, y, w, h, w, h, delta);};
void draw_image_mono(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=1){draw_scaled_image_mono(call, data, x, y, w, h, w, h, delta);};
void draw(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy);
void draw(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy);
public:
void page_policy(int p);
int page_policy(){return page_policy_;};
void close_command( int (*cmd)(FILE *)){close_cmd_=cmd;};
FILE * file() {return output;};
//void orientation (int o);
//Fl_PSfile_Device(FILE *o, int lang_level, int pages = 0); // ps (also multi-page) constructor
//Fl_PSfile_Device(FILE *o, int lang_level, int x, int y, int w, int h); //eps constructor
void interpolate(int i){interpolate_=i;};
int interpolate(){return interpolate_;}
void page(double pw, double ph, int media = 0);
void page(int format);
void place(double x, double y, double tx, double ty, double scale = 1);
int start_page (void);
int printable_rect(int *w, int *h);
void margins(int *left, int *top, int *right, int *bottom);
void origin(int x, int y);
void scale (float scale_x, float scale_y);
void rotate(float angle);
void translate(int x, int y);
void untranslate(void);
int end_page (void);
void end_job (void);
#endif // FL_DOXYGEN
/**
@brief The constructor.
*/
Fl_PSfile_Device(void);
/**
@brief Begins the session where all graphics will go to a local PostScript file.
*
Opens a file dialog to select an output PostScript file.
@param pagecount The total number of pages to be created.
@param format Desired page format.
@param layout Desired page layout.
@return 0 iff OK
*/
int start_job(int pagecount, enum Page_Format format = A4, enum Page_Layout layout = PORTRAIT);
/**
@brief Begins the session where all graphics will go to named PostScript file.
*
@param fname The name of the output local PostScript file.
@param pagecount The total number of pages to be created.
@param format Desired page format.
@param layout Desired page layout.
@return 0 iff OK
*/
int start_job(const char *fname, int pagecount, enum Page_Format format = A4, enum Page_Layout layout = PORTRAIT);
/**
@brief The destructor.
*/
virtual ~Fl_PSfile_Device();
};
#endif // Fl_PSfile_Device_H
//
// End of "$Id:$"
//
+193 -483
View File
File diff suppressed because it is too large Load Diff
+13 -13
View File
@@ -34,7 +34,7 @@
extern HWND fl_window;
Fl_GDI_Printer::Fl_GDI_Printer(void) : Fl_Abstract_Printer() {
Fl_Printer::Fl_Printer(void) : Fl_Abstract_Printer() {
hPr = NULL;
type_ = gdi_printer;
}
@@ -56,7 +56,7 @@ static void WIN_SetupPrinterDeviceContext(HDC prHDC)
}
int Fl_GDI_Printer::start_job (int pagecount, int *frompage, int *topage)
int Fl_Printer::start_job (int pagecount, int *frompage, int *topage)
// returns 0 iff OK
{
DWORD commdlgerr;
@@ -109,7 +109,7 @@ int Fl_GDI_Printer::start_job (int pagecount, int *frompage, int *topage)
return err;
}
void Fl_GDI_Printer::end_job (void)
void Fl_Printer::end_job (void)
{
Fl_Device::display_device()->set_current();
if (hPr != NULL) {
@@ -129,7 +129,7 @@ void Fl_GDI_Printer::end_job (void)
}
}
void Fl_GDI_Printer::absolute_printable_rect(int *x, int *y, int *w, int *h)
void Fl_Printer::absolute_printable_rect(int *x, int *y, int *w, int *h)
{
POINT physPageSize;
POINT pixelsPerInch;
@@ -155,7 +155,7 @@ void Fl_GDI_Printer::absolute_printable_rect(int *x, int *y, int *w, int *h)
origin(x_offset, y_offset);
}
void Fl_GDI_Printer::margins(int *left, int *top, int *right, int *bottom)
void Fl_Printer::margins(int *left, int *top, int *right, int *bottom)
{
int x, y, w, h;
absolute_printable_rect(&x, &y, &w, &h);
@@ -165,14 +165,14 @@ void Fl_GDI_Printer::margins(int *left, int *top, int *right, int *bottom)
if (bottom) *bottom = y;
}
int Fl_GDI_Printer::printable_rect(int *w, int *h)
int Fl_Printer::printable_rect(int *w, int *h)
{
int x, y;
absolute_printable_rect(&x, &y, w, h);
return 0;
}
int Fl_GDI_Printer::start_page (void)
int Fl_Printer::start_page (void)
{
int rsult, w, h;
@@ -193,14 +193,14 @@ int Fl_GDI_Printer::start_page (void)
return rsult;
}
void Fl_GDI_Printer::origin (int deltax, int deltay)
void Fl_Printer::origin (int deltax, int deltay)
{
SetWindowOrgEx(fl_gc, - left_margin - deltax, - top_margin - deltay, NULL);
x_offset = deltax;
y_offset = deltay;
}
void Fl_GDI_Printer::scale (float scalex, float scaley)
void Fl_Printer::scale (float scalex, float scaley)
{
int w, h;
SetWindowExtEx(fl_gc, (int)(720 / scalex + 0.5), (int)(720 / scaley + 0.5), NULL);
@@ -208,7 +208,7 @@ void Fl_GDI_Printer::scale (float scalex, float scaley)
origin(0, 0);
}
void Fl_GDI_Printer::rotate (float rot_angle)
void Fl_Printer::rotate (float rot_angle)
{
XFORM mat;
float angle;
@@ -221,7 +221,7 @@ void Fl_GDI_Printer::rotate (float rot_angle)
SetWorldTransform(fl_gc, &mat);
}
int Fl_GDI_Printer::end_page (void)
int Fl_Printer::end_page (void)
{
int rsult;
@@ -254,7 +254,7 @@ static void do_translate(int x, int y)
ModifyWorldTransform(fl_gc, &tr, MWT_LEFTMULTIPLY);
}
void Fl_GDI_Printer::translate (int x, int y)
void Fl_Printer::translate (int x, int y)
{
do_translate(x, y);
if (translate_stack_depth < translate_stack_max) {
@@ -264,7 +264,7 @@ void Fl_GDI_Printer::translate (int x, int y)
}
}
void Fl_GDI_Printer::untranslate (void)
void Fl_Printer::untranslate (void)
{
if (translate_stack_depth > 0) {
translate_stack_depth--;
+2 -2
View File
@@ -25,7 +25,7 @@
// http://www.fltk.org/str.php
//
#include <FL/Fl_Device.H>
#include <FL/Fl_PSfile_Device.H>
#include <FL/Fl.H>
#include <FL/fl_ask.H>
@@ -1248,7 +1248,7 @@ void Fl_PSfile_Device::end_job (void)
}
#if ! (defined(__APPLE__) || defined(WIN32) )
int Fl_PS_Printer::start_job(int pages, int *firstpage, int *lastpage) {
int Fl_Printer::start_job(int pages, int *firstpage, int *lastpage) {
enum Page_Format format;
enum Page_Layout layout;
+12 -12
View File
@@ -37,14 +37,14 @@
extern void fl_quartz_restore_line_style_();
Fl_Quartz_Printer::Fl_Quartz_Printer(void)
Fl_Printer::Fl_Printer(void)
{
x_offset = 0;
y_offset = 0;
type_ = quartz_printer;
}
int Fl_Quartz_Printer::start_job (int pagecount, int *frompage, int *topage)
int Fl_Printer::start_job (int pagecount, int *frompage, int *topage)
//printing using a Quartz graphics context
//returns 0 iff OK
{
@@ -128,7 +128,7 @@ int Fl_Quartz_Printer::start_job (int pagecount, int *frompage, int *topage)
return 0;
}
void Fl_Quartz_Printer::margins(int *left, int *top, int *right, int *bottom)
void Fl_Printer::margins(int *left, int *top, int *right, int *bottom)
{
PMPaper paper;
PMGetPageFormatPaper(pageFormat, &paper);
@@ -150,7 +150,7 @@ void Fl_Quartz_Printer::margins(int *left, int *top, int *right, int *bottom)
}
}
int Fl_Quartz_Printer::printable_rect(int *w, int *h)
int Fl_Printer::printable_rect(int *w, int *h)
//returns 0 iff OK
{
OSStatus status;
@@ -167,7 +167,7 @@ int Fl_Quartz_Printer::printable_rect(int *w, int *h)
return 0;
}
void Fl_Quartz_Printer::origin(int x, int y)
void Fl_Printer::origin(int x, int y)
{
x_offset = x;
y_offset = y;
@@ -180,7 +180,7 @@ void Fl_Quartz_Printer::origin(int x, int y)
CGContextSaveGState(fl_gc);
}
void Fl_Quartz_Printer::scale (float s_x, float s_y)
void Fl_Printer::scale (float s_x, float s_y)
{
scale_x = s_x;
scale_y = s_y;
@@ -193,7 +193,7 @@ void Fl_Quartz_Printer::scale (float s_x, float s_y)
CGContextSaveGState(fl_gc);
}
void Fl_Quartz_Printer::rotate (float rot_angle)
void Fl_Printer::rotate (float rot_angle)
{
angle = - rot_angle * M_PI / 180.;
CGContextRestoreGState(fl_gc);
@@ -205,20 +205,20 @@ void Fl_Quartz_Printer::rotate (float rot_angle)
CGContextSaveGState(fl_gc);
}
void Fl_Quartz_Printer::translate(int x, int y)
void Fl_Printer::translate(int x, int y)
{
CGContextSaveGState(fl_gc);
CGContextTranslateCTM(fl_gc, x, y );
CGContextSaveGState(fl_gc);
}
void Fl_Quartz_Printer::untranslate(void)
void Fl_Printer::untranslate(void)
{
CGContextRestoreGState(fl_gc);
CGContextRestoreGState(fl_gc);
}
int Fl_Quartz_Printer::start_page (void)
int Fl_Printer::start_page (void)
{
OSStatus status = PMSessionBeginPageNoDialog(printSession, pageFormat, NULL);
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
@@ -267,7 +267,7 @@ int Fl_Quartz_Printer::start_page (void)
return status != noErr;
}
int Fl_Quartz_Printer::end_page (void)
int Fl_Printer::end_page (void)
{
CGContextFlush(fl_gc);
CGContextRestoreGState(fl_gc);
@@ -278,7 +278,7 @@ int Fl_Quartz_Printer::end_page (void)
return status != noErr;
}
void Fl_Quartz_Printer::end_job (void)
void Fl_Printer::end_job (void)
{
OSStatus status;
+1 -3
View File
@@ -29,13 +29,11 @@
#include <math.h>
#include <string.h>
#include <FL/Fl_Printer.H>
#include <FL/Fl_PSfile_Device.H>
#include <FL/Fl.H>
#include <FL/Fl_Pixmap.H>
#include <FL/Fl_Bitmap.H>
int Fl_PSfile_Device::alpha_mask(const uchar * data, int w, int h, int D, int LD){
mask = 0;