// // "$Id$" // // Printing support 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 // /** \file Fl_Printer.H \brief declaration of classes Fl_System_Printer, Fl_PostScript_Printer, Fl_Printer, Fl_Device_Plugin. */ #ifndef Fl_Printer_H #define Fl_Printer_H #include #include #include #include #include #include #if !(defined(__APPLE__) || defined(WIN32)) #include #endif #if defined(__APPLE__) || defined(WIN32) || defined(FL_DOXYGEN) /** \brief Print support under MSWindows and Mac OS X. * Class Fl_System_Printer is implemented only on the MSWindows and Mac OS X platforms. Use Fl_Printer instead that is cross-platform and has the same API. Fl_Printer is typedef'ed to Fl_System_Printer under MSWindows and Mac OS X. */ class Fl_System_Printer : public Fl_Paged_Device { private: /** \brief the printer's graphics context, if there's one, NULL otherwise */ void *gc; void set_current(void); #ifdef __APPLE__ float scale_x; float scale_y; float angle; // rotation angle in radians PMPrintSession printSession; PMPageFormat pageFormat; PMPrintSettings printSettings; #elif defined(WIN32) int abortPrint; PRINTDLG pd; HDC hPr; int prerr; int left_margin; int top_margin; void absolute_printable_rect(int *x, int *y, int *w, int *h); #endif public: static const char *device_type; /** @brief The constructor. */ Fl_System_Printer(void); int start_job(int pagecount, int *frompage = NULL, int *topage = NULL); 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); /** @brief The destructor. */ ~Fl_System_Printer(void); #ifndef FL_DOXYGEN public: static const char *dialog_title; static const char *dialog_printer; static const char *dialog_range; static const char *dialog_copies; static const char *dialog_all; static const char *dialog_pages; static const char *dialog_from; static const char *dialog_to; static const char *dialog_properties; static const char *dialog_copyNo; static const char *dialog_print_button; static const char *dialog_cancel_button; static const char *dialog_print_to_file; static const char *property_title; static const char *property_pagesize; static const char *property_mode; static const char *property_use; static const char *property_save; static const char *property_cancel; #endif // FL_DOXYGEN }; // class Fl_System_Printer typedef Fl_System_Printer Fl_Printer; #endif #if !(defined(__APPLE__) || defined(WIN32)) /** \brief Print support under Unix/Linux. * Class Fl_PostScript_Printer is implemented only on the Unix/Linux platform. Use Fl_Printer instead that is cross-platform and has the same API. Fl_Printer is typedef'ed to Fl_PostScript_Printer under Unix/Linux. */ class Fl_PostScript_Printer : public Fl_PostScript_File_Device { public: static const char *device_type; int start_job(int pages, int *firstpage = NULL, int *lastpage = NULL); #ifndef FL_DOXYGEN static const char *dialog_title; static const char *dialog_printer; static const char *dialog_range; static const char *dialog_copies; static const char *dialog_all; static const char *dialog_pages; static const char *dialog_from; static const char *dialog_to; static const char *dialog_properties; static const char *dialog_copyNo; static const char *dialog_print_button; static const char *dialog_cancel_button; static const char *dialog_print_to_file; static const char *property_title; static const char *property_pagesize; static const char *property_mode; static const char *property_use; static const char *property_save; static const char *property_cancel; #endif // FL_DOXYGEN }; typedef Fl_PostScript_Printer Fl_Printer; #endif /** * @brief OS-independent print support. * Fl_Printer allows to use all FLTK drawing, color, text, and clip functions, and to have them operate on printed page(s). There are two main, non exclusive, ways to use it.
  • Print any widget (standard, custom, Fl_Window, Fl_Gl_Window) as it appears on screen, with optional translation, scaling and rotation. This is done by calling print_widget() or print_window_part().
  • Use a series of FLTK graphics commands (e.g., font, text, lines, colors, clip, image) to compose a page appropriately shaped for printing.
In both cases, begin by start_job(), start_page(), printable_rect() and origin() calls and finish by end_page() and end_job() calls.

Platform specifics
Fl_Printer is typedef'ed to Fl_PostScript_Printer under Unix/Linux and to Fl_System_Printer otherwise. Both classes have the same API.

  • Unix/Linux platforms: Class Fl_RGB_Image prints but loses its transparency if it has one. See class Fl_PostScript_Graphics_Driver for a description of how UTF-8 strings appear in print. Use the static public attributes of this class to set the print dialog to other languages than English. For example, the "Printer:" dialog item Fl_Printer::dialog_printer can be set to French with: \code Fl_Printer::dialog_printer = "Imprimante:"; \endcode before creation of the Fl_Printer object. Use Fl_PostScript_File_Device::file_chooser_title to customize the title of the file chooser dialog that opens when using the "Print To File" option of the print dialog.
  • MSWindows platform: Transparent Fl_RGB_Image 's don't print with exact transparency on most printers. Fl_RGB_Image 's don't rotate() well. A workaround is to use the print_window_part() call.
  • Mac OS X platform: all graphics requests print as on display.
*/ #ifdef FL_DOXYGEN // this class is NOT compiled. It's here for Doxygen documentation purpose only class Fl_Printer : public Fl_System_Printer, Fl_PostScript_Printer { public: static const char *device_type; /** @brief The constructor */ Fl_Printer(void); int start_job(int pagecount, int *frompage = NULL, int *topage = NULL); 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); /** @brief The destructor */ ~Fl_Printer(void); /** \name These attributes are effective under the Xlib platform only. \{ */ static const char *dialog_title; static const char *dialog_printer; static const char *dialog_range; static const char *dialog_copies; static const char *dialog_all; static const char *dialog_pages; static const char *dialog_from; static const char *dialog_to; static const char *dialog_properties; static const char *dialog_copyNo; static const char *dialog_print_button; static const char *dialog_cancel_button; static const char *dialog_print_to_file; static const char *property_title; static const char *property_pagesize; static const char *property_mode; static const char *property_use; static const char *property_save; static const char *property_cancel; /** \} */ }; #endif #endif // Fl_Printer_H // // End of "$Id$" //