summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FL/Fl_Device.H25
-rw-r--r--FL/Fl_Paged_Device.H65
-rw-r--r--FL/Fl_PostScript.H63
-rw-r--r--FL/Fl_Printer.H22
-rw-r--r--src/Fl_Paged_Device.cxx44
-rw-r--r--src/Fl_PostScript.cxx95
6 files changed, 167 insertions, 147 deletions
diff --git a/FL/Fl_Device.H b/FL/Fl_Device.H
index 39a0d4895..975c99aa2 100644
--- a/FL/Fl_Device.H
+++ b/FL/Fl_Device.H
@@ -26,7 +26,8 @@
// http://www.fltk.org/str.php
//
/** \file Fl_Device.H
- \brief declaration of classes Fl_Device, Fl_Graphics_Driver, Fl_Surface_Device, Fl_Display_Device.
+ \brief declaration of classes Fl_Device, Fl_Graphics_Driver, Fl_Surface_Device,
+ Fl_Display_Device, Fl_Device_Plugin.
*/
#ifndef Fl_Device_H
@@ -374,6 +375,28 @@ public:
static Fl_Display_Device *display_device() { return fl_display_device; };
};
+/**
+ This plugin socket allows the integration of new device drivers for special
+ window or screen types. It is currently used to provide an automated printing
+ service for OpenGL windows, if linked with fltk_gl.
+ */
+class Fl_Device_Plugin : public Fl_Plugin {
+public:
+ /** \brief The constructor */
+ Fl_Device_Plugin(const char *name)
+ : Fl_Plugin(klass(), name) { }
+ /** \brief Returns the class name */
+ virtual const char *klass() { return "fltk:device"; }
+ /** \brief Returns the plugin name */
+ virtual const char *name() = 0;
+ /** \brief Prints a widget
+ \param w the widget
+ \param x,y offsets where to print relatively to coordinates origin
+ \param height height of the current drawing area
+ */
+ virtual int print(Fl_Widget* w, int x, int y, int height) { return 0; }
+};
+
#endif // Fl_Device_H
//
diff --git a/FL/Fl_Paged_Device.H b/FL/Fl_Paged_Device.H
index 088afc606..4ee04abd7 100644
--- a/FL/Fl_Paged_Device.H
+++ b/FL/Fl_Paged_Device.H
@@ -34,6 +34,8 @@
#include <FL/Fl_Device.H>
+#define NO_PAGE_FORMATS 30 /* MSVC6 compilation fix */
+
/**
\brief Represents page-structured drawing surfaces.
*
@@ -41,6 +43,69 @@
or Fl_PostScript_File_Device instead.
*/
class Fl_Paged_Device : public Fl_Surface_Device {
+public:
+ /**
+ \brief Possible page formats.
+
+ All paper formats with pre-defined width and height.
+ */
+ enum Page_Format {
+ A0 = 0, /**< A0 format */
+ A1,
+ A2,
+ A3,
+ A4, /**< A4 format */
+ A5,
+ A6,
+ A7,
+ A8,
+ A9,
+ B0,
+ B1,
+ B2,
+ B3,
+ B4,
+ B5,
+ B6,
+ B7,
+ B8,
+ B9,
+ B10,
+ C5E,
+ DLE,
+ EXECUTIVE,
+ FOLIO,
+ LEDGER,
+ LEGAL,
+ LETTER, /**< Letter format */
+ TABLOID,
+ ENVELOPE,
+ MEDIA = 0x1000
+ };
+ /**
+ \brief Possible page layouts.
+ */
+ enum Page_Layout {
+ PORTRAIT = 0, /**< Portrait orientation */
+ LANDSCAPE = 0x100, /**< Landscape orientation */
+ REVERSED = 0x200, /**< Reversed orientation */
+ ORIENTATION = 0x300 /**< orientation */
+ };
+
+ /** \brief width, height and name of a page format
+ */
+ typedef struct {
+ /** \brief width in points */
+ int width;
+ /** \brief height in points */
+ int height;
+ /** \brief format name */
+ const char *name;
+ } page_format;
+ /** \brief width, height and name of all elements of the enum \ref Page_Format.
+ */
+ static const page_format page_formats[NO_PAGE_FORMATS];
+
private:
#ifdef __APPLE__
struct chain_elt {
diff --git a/FL/Fl_PostScript.H b/FL/Fl_PostScript.H
index 7a1907731..9e32bccf8 100644
--- a/FL/Fl_PostScript.H
+++ b/FL/Fl_PostScript.H
@@ -35,8 +35,6 @@
#include <FL/Fl_Paged_Device.H>
#include <FL/fl_draw.H>
-#define NO_PAGE_FORMATS 30 /* MSVC6 compilation fix */
-
/**
\brief PostScript graphical backend.
*
@@ -66,58 +64,10 @@
class Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver {
public:
static const char *device_type;
- /**
- \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
public:
enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS};
-typedef struct page_format {
- int width;
- int height;
- const char *name;
-} page_format;
-
class Clip {
public:
int x, y, w, h;
@@ -162,10 +112,9 @@ class Clip {
FILE *output;
double pw_, ph_;
- static const 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 start_postscript (int pagecount, enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::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); };
@@ -178,7 +127,7 @@ class Clip {
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_;
+ enum Fl_Paged_Device::Page_Format page_format_;
char *ps_filename_;
// implementation of drawing methods
void color(Fl_Color c);
@@ -280,10 +229,10 @@ public:
static const char *device_type;
Fl_PostScript_File_Device();
~Fl_PostScript_File_Device();
- int start_job(int pagecount, enum Fl_PostScript_Graphics_Driver::Page_Format format = Fl_PostScript_Graphics_Driver::A4,
- enum Fl_PostScript_Graphics_Driver::Page_Layout layout = Fl_PostScript_Graphics_Driver::PORTRAIT);
- int start_job(FILE *ps_output, int pagecount, enum Fl_PostScript_Graphics_Driver::Page_Format format = Fl_PostScript_Graphics_Driver::A4,
- enum Fl_PostScript_Graphics_Driver::Page_Layout layout = Fl_PostScript_Graphics_Driver::PORTRAIT);
+ int start_job(int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,
+ enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT);
+ int start_job(FILE *ps_output, int pagecount, enum Fl_Paged_Device::Page_Format format = Fl_Paged_Device::A4,
+ enum Fl_Paged_Device::Page_Layout layout = Fl_Paged_Device::PORTRAIT);
int start_page (void);
int printable_rect(int *w, int *h);
void margins(int *left, int *top, int *right, int *bottom);
diff --git a/FL/Fl_Printer.H b/FL/Fl_Printer.H
index 671dcdb77..59d36ce2c 100644
--- a/FL/Fl_Printer.H
+++ b/FL/Fl_Printer.H
@@ -239,28 +239,6 @@ public:
};
#endif
-/**
- This plugin socket allows the integration of new device drivers for special
- window or screen types. It is currently used to provide an automated printing
- service for OpenGL windows, if linked with fltk_gl.
- */
-class Fl_Device_Plugin : public Fl_Plugin {
-public:
- /** \brief The constructor */
- Fl_Device_Plugin(const char *name)
- : Fl_Plugin(klass(), name) { }
- /** \brief Returns the class name */
- virtual const char *klass() { return "fltk:device"; }
- /** \brief Returns the plugin name */
- virtual const char *name() = 0;
- /** \brief Prints a widget
- \param w the widget
- \param x,y offsets where to print relatively to coordinates origin
- \param height height of the current drawing area
- */
- virtual int print(Fl_Widget* w, int x, int y, int height) { return 0; }
-};
-
#endif // Fl_Printer_H
//
diff --git a/src/Fl_Paged_Device.cxx b/src/Fl_Paged_Device.cxx
index 0af786dd9..2b14b08cd 100644
--- a/src/Fl_Paged_Device.cxx
+++ b/src/Fl_Paged_Device.cxx
@@ -28,8 +28,9 @@
\brief implementation of class Fl_Paged_Device.
*/
+#include <FL/Fl_Paged_Device.H>
#include <FL/Fl.H>
-#include <FL/Fl_Printer.H>
+#include <FL/fl_draw.H>
const char *Fl_Paged_Device::device_type = "Fl_Paged_Device";
@@ -286,6 +287,47 @@ void Fl_Paged_Device::translate(int x, int y) {}
*/
void Fl_Paged_Device::untranslate(void) {}
+const Fl_Paged_Device::page_format Fl_Paged_Device::page_formats[NO_PAGE_FORMATS] = {
+ // order of enum Page_Format
+ // comes from appendix B of 5003.PPD_Spec_v4.3.pdf
+
+ // A* // index(Ai) = i
+ {2384, 3370, "A0"},
+ {1684, 2384, "A1"},
+ {1191, 1684, "A2"},
+ { 842, 1191, "A3"},
+ { 595, 842, "A4"},
+ { 420, 595, "A5"},
+ { 297, 420, "A6"},
+ { 210, 297, "A7"},
+ { 148, 210, "A8"},
+ { 105, 148, "A9"},
+
+ // B* // index(Bi) = i+10
+ {2920, 4127, "B0"},
+ {2064, 2920, "B1"},
+ {1460, 2064, "B2"},
+ {1032, 1460, "B3"},
+ { 729, 1032, "B4"},
+ { 516, 729, "B5"},
+ { 363, 516, "B6"},
+ { 258, 363, "B7"},
+ { 181, 258, "B8"},
+ { 127, 181, "B9"},
+ { 91, 127, "B10"},
+
+ // others
+ { 459, 649, "EnvC5"}, // envelope
+ { 312, 624, "EnvDL"}, // envelope
+ { 522, 756, "Executive"},
+ { 595, 935, "Folio"},
+ {1224, 792, "Ledger"}, // landscape
+ { 612, 1008, "Legal"},
+ { 612, 792, "Letter"},
+ { 792, 1224, "Tabloid"},
+ { 297, 684, "Env10"} // envelope
+};
+
//
// End of "$Id$".
//
diff --git a/src/Fl_PostScript.cxx b/src/Fl_PostScript.cxx
index 9ccdcfe11..bcf14e5a3 100644
--- a/src/Fl_PostScript.cxx
+++ b/src/Fl_PostScript.cxx
@@ -87,7 +87,8 @@ Fl_PostScript_Graphics_Driver *Fl_PostScript_File_Device::driver()
@param layout Desired page layout.
@return 0 iff OK, 1 if user cancelled the file dialog, 2 if fopen failed on user-selected output file.
*/
-int Fl_PostScript_File_Device::start_job (int pagecount, enum Fl_PostScript_Graphics_Driver::Page_Format format, enum Fl_PostScript_Graphics_Driver::Page_Layout layout)
+int Fl_PostScript_File_Device::start_job (int pagecount, enum Fl_Paged_Device::Page_Format format,
+ enum Fl_Paged_Device::Page_Layout layout)
{
Fl_Native_File_Chooser fnfc;
fnfc.title(Fl_PostScript_File_Device::file_chooser_title);
@@ -120,7 +121,8 @@ static int dont_close(FILE *f)
@param layout Desired page layout.
@return always 0.
*/
-int Fl_PostScript_File_Device::start_job (FILE *ps_output, int pagecount, enum Fl_PostScript_Graphics_Driver::Page_Format format, enum Fl_PostScript_Graphics_Driver::Page_Layout layout)
+int Fl_PostScript_File_Device::start_job (FILE *ps_output, int pagecount,
+ enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout)
{
Fl_PostScript_Graphics_Driver *ps = driver();
ps->output = ps_output;
@@ -145,46 +147,6 @@ Fl_PostScript_File_Device::~Fl_PostScript_File_Device() {
#include "print_panel.cxx"
#endif
-const Fl_PostScript_Graphics_Driver::page_format Fl_PostScript_Graphics_Driver::page_formats[NO_PAGE_FORMATS] = { // order of enum Page_Format
-// comes from appendix B of 5003.PPD_Spec_v4.3.pdf
-
- // A* // index(Ai) = i
- {2384, 3370, "A0"},
- {1684, 2384, "A1"},
- {1191, 1684, "A2"},
- { 842, 1191, "A3"},
- { 595, 842, "A4"},
- { 420, 595, "A5"},
- { 297, 420, "A6"},
- { 210, 297, "A7"},
- { 148, 210, "A8"},
- { 105, 148, "A9"},
-
- // B* // index(Bi) = i+10
- {2920, 4127, "B0"},
- {2064, 2920, "B1"},
- {1460, 2064, "B2"},
- {1032, 1460, "B3"},
- { 729, 1032, "B4"},
- { 516, 729, "B5"},
- { 363, 516, "B6"},
- { 258, 363, "B7"},
- { 181, 258, "B8"},
- { 127, 181, "B9"},
- { 91, 127, "B10"},
-
- // others
- { 459, 649, "EnvC5"}, // envelope
- { 312, 624, "EnvDL"}, // envelope
- { 522, 756, "Executive"},
- { 595, 935, "Folio"},
- {1224, 792, "Ledger"}, // landscape
- { 612, 1008, "Legal"},
- { 612, 792, "Letter"},
- { 792, 1224, "Tabloid"},
- { 297, 684, "Env10"} // envelope
-};
-
// Prolog string
static const char * prolog =
@@ -566,11 +528,12 @@ static const char * prolog_3 = // prolog relevant only if lang_level >2
// end prolog
-int Fl_PostScript_Graphics_Driver::start_postscript (int pagecount, enum Fl_PostScript_Graphics_Driver::Page_Format format, enum Fl_PostScript_Graphics_Driver::Page_Layout layout)
+int Fl_PostScript_Graphics_Driver::start_postscript (int pagecount,
+ enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout)
//returns 0 iff OK
{
int w, h, x;
- if (format == A4) {
+ if (format == Fl_Paged_Device::A4) {
left_margin = 18;
top_margin = 18;
}
@@ -578,7 +541,7 @@ int Fl_PostScript_Graphics_Driver::start_postscript (int pagecount, enum Fl_Post
left_margin = 12;
top_margin = 12;
}
- page_format_ = (enum Page_Format)(format | layout);
+ page_format_ = (enum Fl_Paged_Device::Page_Format)(format | layout);
fputs("%!PS-Adobe-3.0\n", output);
fputs("%%Creator: FLTK\n", output);
@@ -588,10 +551,10 @@ int Fl_PostScript_Graphics_Driver::start_postscript (int pagecount, enum Fl_Post
fprintf(output, "%%%%Pages: %i\n", pagecount);
else
fputs("%%Pages: (atend)\n", output);
- fprintf(output, "%%%%BeginFeature: *PageSize %s\n", page_formats[format].name );
- w = page_formats[format].width;
- h = page_formats[format].height;
- if (lang_level_ == 3 && (layout & LANDSCAPE) ) { x = w; w = h; h = x; }
+ fprintf(output, "%%%%BeginFeature: *PageSize %s\n", Fl_Paged_Device::page_formats[format].name );
+ w = Fl_Paged_Device::page_formats[format].width;
+ h = Fl_Paged_Device::page_formats[format].height;
+ if (lang_level_ == 3 && (layout & Fl_Paged_Device::LANDSCAPE) ) { x = w; w = h; h = x; }
fprintf(output, "<</PageSize[%d %d]>>setpagedevice\n", w, h );
fputs("%%EndFeature\n", output);
fputs("%%EndComments\n", output);
@@ -672,8 +635,8 @@ void Fl_PostScript_Graphics_Driver::page(double pw, double ph, int media) {
}
fprintf(output, "%%%%BeginPageSetup\n");
- if((media & MEDIA) &&(lang_level_>1)){
- int r = media & REVERSED;
+ if((media & Fl_Paged_Device::MEDIA) &&(lang_level_>1)){
+ int r = media & Fl_Paged_Device::REVERSED;
if(r) r = 2;
fprintf(output, "<< /PageSize [%i %i] /Orientation %i>> setpagedevice\n", (int)(pw+.5), (int)(ph+.5), r);
}
@@ -690,9 +653,9 @@ void Fl_PostScript_Graphics_Driver::page(double pw, double ph, int media) {
line_style(0);
fprintf(output, "GS\n");
- if (!((media & MEDIA) &&(lang_level_>1))){
+ if (!((media & Fl_Paged_Device::MEDIA) &&(lang_level_>1))){
if (pw > ph) {
- if(media & REVERSED) {
+ if(media & Fl_Paged_Device::REVERSED) {
fprintf(output, "-90 rotate %i 0 translate\n", int(-pw));
}
else {
@@ -700,7 +663,7 @@ void Fl_PostScript_Graphics_Driver::page(double pw, double ph, int media) {
}
}
else {
- if(media & REVERSED)
+ if(media & Fl_Paged_Device::REVERSED)
fprintf(output, "180 rotate %i %i translate\n", int(-pw), int(-ph));
}
}
@@ -710,12 +673,12 @@ void Fl_PostScript_Graphics_Driver::page(double pw, double ph, int media) {
void Fl_PostScript_Graphics_Driver::page(int format){
- if(format & LANDSCAPE){
- ph_=Fl_PostScript_Graphics_Driver::page_formats[format & 0xFF].width;
- pw_=Fl_PostScript_Graphics_Driver::page_formats[format & 0xFF].height;
+ if(format & Fl_Paged_Device::LANDSCAPE){
+ ph_=Fl_Paged_Device::page_formats[format & 0xFF].width;
+ pw_=Fl_Paged_Device::page_formats[format & 0xFF].height;
}else{
- pw_=Fl_PostScript_Graphics_Driver::page_formats[format & 0xFF].width;
- ph_=Fl_PostScript_Graphics_Driver::page_formats[format & 0xFF].height;
+ pw_=Fl_Paged_Device::page_formats[format & 0xFF].width;
+ ph_=Fl_Paged_Device::page_formats[format & 0xFF].height;
}
page(pw_,ph_,format & 0xFF00);//,orientation only;
}
@@ -1488,8 +1451,8 @@ void Fl_PostScript_File_Device::end_job (void)
#if ! (defined(__APPLE__) || defined(WIN32) )
int Fl_Printer::start_job(int pages, int *firstpage, int *lastpage) {
- enum Fl_PostScript_Graphics_Driver::Page_Format format;
- enum Fl_PostScript_Graphics_Driver::Page_Layout layout;
+ enum Fl_Paged_Device::Page_Format format;
+ enum Fl_Paged_Device::Page_Layout layout;
// first test version for print dialog
if (!print_panel) make_print_panel();
@@ -1507,7 +1470,7 @@ int Fl_Printer::start_job(int pages, int *firstpage, int *lastpage) {
// get options
- format = print_page_size->value() ? Fl_PostScript_Graphics_Driver::A4 : Fl_PostScript_Graphics_Driver::LETTER;
+ format = print_page_size->value() ? Fl_Paged_Device::A4 : Fl_Paged_Device::LETTER;
{ // page range choice
int from = 1, to = pages;
if (print_pages->value()) {
@@ -1522,10 +1485,10 @@ int Fl_Printer::start_job(int pages, int *firstpage, int *lastpage) {
pages = to - from + 1;
}
- if (print_output_mode[0]->value()) layout = Fl_PostScript_Graphics_Driver::PORTRAIT;
- else if (print_output_mode[1]->value()) layout = Fl_PostScript_Graphics_Driver::LANDSCAPE;
- else if (print_output_mode[2]->value()) layout = Fl_PostScript_Graphics_Driver::PORTRAIT;
- else layout = Fl_PostScript_Graphics_Driver::LANDSCAPE;
+ if (print_output_mode[0]->value()) layout = Fl_Paged_Device::PORTRAIT;
+ else if (print_output_mode[1]->value()) layout = Fl_Paged_Device::LANDSCAPE;
+ else if (print_output_mode[2]->value()) layout = Fl_Paged_Device::PORTRAIT;
+ else layout = Fl_Paged_Device::LANDSCAPE;
int print_pipe = print_choice->value(); // 0 = print to file, >0 = printer (pipe)