mirror of https://github.com/fltk/fltk.git
Browse Source
Use cairo-PostScript to output PostScript when pango is available. This allows to draw in vectorial form any script. Before, only the Latin script could be drawn to PostScript in vectorial form.pull/150/head
12 changed files with 1305 additions and 491 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,231 @@ |
|||||||
|
//
|
||||||
|
// Support for graphics output to PostScript file for the Fast Light Tool Kit (FLTK).
|
||||||
|
//
|
||||||
|
// Copyright 2010-2020 by Bill Spitzak and others.
|
||||||
|
//
|
||||||
|
// This library is free software. Distribution and use rights are outlined in
|
||||||
|
// the file "COPYING" which should have been included with this file. If this
|
||||||
|
// file is missing or damaged, see the license at:
|
||||||
|
//
|
||||||
|
// https://www.fltk.org/COPYING.php
|
||||||
|
//
|
||||||
|
// Please see the following page on how to report bugs and issues:
|
||||||
|
//
|
||||||
|
// https://www.fltk.org/bugs.php
|
||||||
|
//
|
||||||
|
|
||||||
|
/** \file Fl_Pango_PostScript_Graphics_Driver.H
|
||||||
|
Declaration of class Fl_PostScript_Graphics_Driver. |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef FL_POSTSCRIPT_GRAPHICS_DRIVER_H |
||||||
|
#define FL_POSTSCRIPT_GRAPHICS_DRIVER_H |
||||||
|
|
||||||
|
#include "../../config_lib.h" |
||||||
|
#include <FL/Fl_PostScript.H> |
||||||
|
|
||||||
|
#ifndef USE_PANGO |
||||||
|
#define USE_PANGO 0 |
||||||
|
#endif |
||||||
|
|
||||||
|
#if USE_PANGO |
||||||
|
typedef struct _cairo_surface cairo_surface_t; |
||||||
|
typedef struct _cairo cairo_t; |
||||||
|
typedef struct _PangoLayout PangoLayout; |
||||||
|
#endif |
||||||
|
|
||||||
|
/**
|
||||||
|
\cond DriverDev |
||||||
|
\addtogroup DriverDeveloper |
||||||
|
\{ |
||||||
|
*/ |
||||||
|
|
||||||
|
/**
|
||||||
|
PostScript graphical backend. |
||||||
|
*/ |
||||||
|
|
||||||
|
class FL_EXPORT Fl_PostScript_Graphics_Driver : public Fl_Graphics_Driver { |
||||||
|
private: |
||||||
|
#if USE_PANGO |
||||||
|
cairo_t *cairo_; |
||||||
|
PangoLayout *pango_layout_; |
||||||
|
void draw_rgb_bitmap_(Fl_Image *img,int XP, int YP, int WP, int HP, int cx, int cy); |
||||||
|
#else |
||||||
|
void transformed_draw_extra(const char* str, int n, double x, double y, int w, bool rtl); |
||||||
|
void *prepare_rle85(); |
||||||
|
void write_rle85(uchar b, void *data); |
||||||
|
void close_rle85(void *data); |
||||||
|
void *prepare85(); |
||||||
|
void write85(void *data, const uchar *p, int len); |
||||||
|
void close85(void *data); |
||||||
|
int scale_for_image_(Fl_Image *img, int XP, int YP, int WP, int HP,int cx, int cy); |
||||||
|
#endif |
||||||
|
protected: |
||||||
|
uchar **mask_bitmap() {return &mask;} |
||||||
|
public: |
||||||
|
Fl_PostScript_Graphics_Driver(); |
||||||
|
#ifndef FL_DOXYGEN |
||||||
|
enum SHAPE{NONE=0, LINE, LOOP, POLYGON, POINTS}; |
||||||
|
|
||||||
|
class Clip { |
||||||
|
public: |
||||||
|
int x, y, w, h; |
||||||
|
Clip *prev; |
||||||
|
}; |
||||||
|
Clip * clip_; |
||||||
|
|
||||||
|
int lang_level_; |
||||||
|
int gap_; |
||||||
|
int pages_; |
||||||
|
|
||||||
|
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 enough
|
||||||
|
void concat(); // transform ror scalable dradings...
|
||||||
|
void reconcat(); //invert
|
||||||
|
void recover(); //recovers the state after grestore (such as line styles...)
|
||||||
|
void reset(); |
||||||
|
|
||||||
|
uchar * mask; |
||||||
|
int mx; // width of mask;
|
||||||
|
int my; // mask lines
|
||||||
|
Fl_PostScript_Close_Command close_cmd_; |
||||||
|
int page_policy_; |
||||||
|
int nPages; |
||||||
|
int orientation_; |
||||||
|
|
||||||
|
float scale_x; |
||||||
|
float scale_y; |
||||||
|
float angle; |
||||||
|
int left_margin; |
||||||
|
int top_margin; |
||||||
|
|
||||||
|
FILE *output; |
||||||
|
double pw_, ph_; |
||||||
|
|
||||||
|
uchar bg_r, bg_g, bg_b; |
||||||
|
int start_postscript (int pagecount, enum Fl_Paged_Device::Page_Format format, enum Fl_Paged_Device::Page_Layout layout); |
||||||
|
int start_eps(int width, int height); |
||||||
|
/* int alpha_mask(const uchar * data, int w, int h, int D, int LD=0);
|
||||||
|
*/ |
||||||
|
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); |
||||||
|
|
||||||
|
enum Fl_Paged_Device::Page_Format page_format_; |
||||||
|
char *ps_filename_; |
||||||
|
|
||||||
|
void page_policy(int p); |
||||||
|
int page_policy(){return page_policy_;}; |
||||||
|
void close_command(Fl_PostScript_Close_Command cmd){close_cmd_=cmd;}; |
||||||
|
FILE * file() {return output;}; |
||||||
|
//void orientation (int o);
|
||||||
|
//Fl_PostScript_Graphics_Driver(FILE *o, int lang_level, int pages = 0); // ps (also multi-page) constructor
|
||||||
|
void interpolate(int i){interpolate_=i;}; |
||||||
|
int interpolate(){return interpolate_;} |
||||||
|
|
||||||
|
void page(double pw, double ph, int media = 0); |
||||||
|
void page(int format); |
||||||
|
#endif // FL_DOXYGEN
|
||||||
|
|
||||||
|
// implementation of drawing methods
|
||||||
|
void color(Fl_Color c); |
||||||
|
void color(uchar r, uchar g, uchar b); |
||||||
|
|
||||||
|
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 draw_image(const uchar* d, int x,int y,int w,int h, int delta=3, int ldelta=0); |
||||||
|
void draw_image_mono(const uchar* d, int x,int y,int w,int h, int delta=1, int ld=0); |
||||||
|
void draw_image(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=3); |
||||||
|
void draw_image_mono(Fl_Draw_Image_Cb call, void* data, int x,int y, int w, int h, int delta=1); |
||||||
|
|
||||||
|
void draw(const char* s, int nBytes, int x, int y) {transformed_draw(s,nBytes,x,y); }; |
||||||
|
void draw(const char* s, int nBytes, float x, float y) {transformed_draw(s,nBytes,x,y); }; |
||||||
|
void draw(int angle, const char *str, int n, int x, int y); |
||||||
|
void rtl_draw(const char* s, int n, int x, int y); |
||||||
|
void font(int face, int size); |
||||||
|
double width(const char *, int); |
||||||
|
double width(unsigned int u); |
||||||
|
void text_extents(const char *c, int n, int &dx, int &dy, int &w, int &h); |
||||||
|
int height(); |
||||||
|
int descent(); |
||||||
|
void draw_pixmap(Fl_Pixmap * pxm,int XP, int YP, int WP, int HP, int cx, int cy); |
||||||
|
void draw_bitmap(Fl_Bitmap * bitmap,int XP, int YP, int WP, int HP, int cx, int cy); |
||||||
|
void draw_rgb(Fl_RGB_Image * rgb,int XP, int YP, int WP, int HP, int cx, int cy); |
||||||
|
#if USE_PANGO |
||||||
|
cairo_t *cr() { return cairo_; } |
||||||
|
PangoLayout *pango_layout() {return pango_layout_;}; |
||||||
|
void check_status(void); |
||||||
|
#else |
||||||
|
/** Shields output PostScript data from modifications of the current locale.
|
||||||
|
It typically avoids PostScript errors caused if the current locale uses comma instead of dot |
||||||
|
as "decimal point". |
||||||
|
\param format directives controlling output PostScript data |
||||||
|
\return value returned by vfprintf() call |
||||||
|
*/ |
||||||
|
int clocale_printf(const char *format, ...); |
||||||
|
#endif |
||||||
|
~Fl_PostScript_Graphics_Driver(); |
||||||
|
// ---
|
||||||
|
Fl_Bitmask create_bitmask(int w, int h, const uchar *array) { return 0L; } |
||||||
|
virtual int has_feature(driver_feature feature_mask) { return feature_mask & PRINTER; } |
||||||
|
|
||||||
|
void ps_origin(int x, int y); |
||||||
|
void ps_translate(int, int); |
||||||
|
void ps_untranslate(); |
||||||
|
}; |
||||||
|
|
||||||
|
/**
|
||||||
|
\} |
||||||
|
\endcond |
||||||
|
*/ |
||||||
|
|
||||||
|
#endif // FL_POSTSCRIPT_GRAPHICS_DRIVER_H
|
Loading…
Reference in new issue