summaryrefslogtreecommitdiff
path: root/src/drivers/PostScript/Fl_PostScript.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/PostScript/Fl_PostScript.cxx')
-rw-r--r--src/drivers/PostScript/Fl_PostScript.cxx446
1 files changed, 4 insertions, 442 deletions
diff --git a/src/drivers/PostScript/Fl_PostScript.cxx b/src/drivers/PostScript/Fl_PostScript.cxx
index 53811d6cf..c041923d2 100644
--- a/src/drivers/PostScript/Fl_PostScript.cxx
+++ b/src/drivers/PostScript/Fl_PostScript.cxx
@@ -100,6 +100,7 @@ Fl_PostScript_File_Device::~Fl_PostScript_File_Device() {
\{
*/
+#if ! USE_PANGO
static const int dashes_flat[5][7]={
{-1,0,0,0,0,0,0},
{3,1,-1,0,0,0,0},
@@ -116,6 +117,7 @@ static const double dashes_cap[5][7]={
{2,2,0.01,1.99,-1,0,0},
{2,2,0.01,1.99,0.01,1.99,-1}
};
+#endif
/**
\brief The constructor.
@@ -1500,448 +1502,8 @@ int Fl_PostScript_Graphics_Driver::start_eps(int width, int height) {
return 0;
}
-void Fl_PostScript_Graphics_Driver::rectf(int x, int y, int w, int h) {
- cairo_rectangle(cairo_, x, y, w, h);
- cairo_fill(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::rect(int x, int y, int w, int h) {
- cairo_rectangle(cairo_, x, y, w, h);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::line(int x1, int y1, int x2, int y2) {
- cairo_new_path(cairo_);
- cairo_move_to(cairo_, x1, y1);
- cairo_line_to(cairo_, x2, y2);
- cairo_stroke(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::line(int x0, int y0, int x1, int y1, int x2, int y2) {
- cairo_new_path(cairo_);
- cairo_move_to(cairo_, x0, y0);
- cairo_line_to(cairo_, x1, y1);
- cairo_line_to(cairo_, x2, y2);
- cairo_stroke(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::xyline(int x, int y, int x1) {
- cairo_move_to(cairo_, x, y);
- cairo_line_to(cairo_, x1, y);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::xyline(int x, int y, int x1, int y2) {
- cairo_move_to(cairo_, x, y);
- cairo_line_to(cairo_, x1, y);
- cairo_line_to(cairo_, x1, y2);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::xyline(int x, int y, int x1, int y2, int x3) {
- cairo_move_to(cairo_, x, y);
- cairo_line_to(cairo_, x1, y);
- cairo_line_to(cairo_, x1, y2);
- cairo_line_to(cairo_, x3, y2);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::yxline(int x, int y, int y1) {
- cairo_move_to(cairo_, x, y);
- cairo_line_to(cairo_, x, y1);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::yxline(int x, int y, int y1, int x2) {
- cairo_move_to(cairo_, x, y);
- cairo_line_to(cairo_, x, y1);
- cairo_line_to(cairo_, x2, y1);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::yxline(int x, int y, int y1, int x2, int y3) {
- cairo_move_to(cairo_, x, y);
- cairo_line_to(cairo_, x, y1);
- cairo_line_to(cairo_, x2, y1);
- cairo_line_to(cairo_, x2, y3);
- cairo_stroke(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int y2) {
- cairo_save(cairo_);
- cairo_new_path(cairo_);
- cairo_move_to(cairo_, x0, y0);
- cairo_line_to(cairo_, x1, y1);
- cairo_line_to(cairo_, x2, y2);
- cairo_close_path(cairo_);
- cairo_stroke(cairo_);
- cairo_restore(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::loop(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) {
- cairo_save(cairo_);
- cairo_new_path(cairo_);
- cairo_move_to(cairo_, x0, y0);
- cairo_line_to(cairo_, x1, y1);
- cairo_line_to(cairo_, x2, y2);
- cairo_line_to(cairo_, x3, y3);
- cairo_close_path(cairo_);
- cairo_stroke(cairo_);
- cairo_restore(cairo_);
-
-}
-
-void Fl_PostScript_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, int y2) {
- cairo_save(cairo_);
- cairo_new_path(cairo_);
- cairo_move_to(cairo_, x0, y0);
- cairo_line_to(cairo_, x1, y1);
- cairo_line_to(cairo_, x2, y2);
- cairo_close_path(cairo_);
- cairo_fill(cairo_);
- cairo_restore(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::polygon(int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) {
- cairo_save(cairo_);
- cairo_new_path(cairo_);
- cairo_move_to(cairo_, x0, y0);
- cairo_line_to(cairo_, x1, y1);
- cairo_line_to(cairo_, x2, y2);
- cairo_line_to(cairo_, x3, y3);
- cairo_close_path(cairo_);
- cairo_fill(cairo_);
- cairo_restore(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::line_style(int style, int width, char* dashes) {
- linewidth_=width;
- linestyle_=style;
- if(dashes){
- if(dashes != linedash_)
- strcpy(linedash_,dashes);
-
- } else
- linedash_[0]=0;
- char width0 = 0;
- if (!width){
- width=1; //for screen drawing compatibility
- width0=1;
- }
- cairo_set_line_width(cairo_, width);
-
- if(!style && (!dashes || !(*dashes)) && width0) //system lines
- style = FL_CAP_SQUARE;
-
- int cap = (style &0xf00);
- cairo_line_cap_t c_cap;
- if (cap == FL_CAP_SQUARE) c_cap = CAIRO_LINE_CAP_SQUARE;
- else if (cap == FL_CAP_FLAT) c_cap = CAIRO_LINE_CAP_BUTT;
- else if (cap == FL_CAP_ROUND) c_cap = CAIRO_LINE_CAP_ROUND;
- else c_cap = CAIRO_LINE_CAP_BUTT;
- cairo_set_line_cap(cairo_, c_cap);
-
- int join = (style & 0xf000);
- cairo_line_join_t c_join;
- if (join == FL_JOIN_MITER) c_join = CAIRO_LINE_JOIN_MITER;
- else if (join == FL_JOIN_ROUND)c_join = CAIRO_LINE_JOIN_ROUND;
- else if (join == FL_JOIN_BEVEL) c_join = CAIRO_LINE_JOIN_BEVEL;
- else c_join = CAIRO_LINE_JOIN_MITER;
- cairo_set_line_join(cairo_, c_join);
-
- double *ddashes = NULL;
- int l = 0;
- if (dashes && *dashes){
- ddashes = new double[strlen(dashes)];
- while (dashes[l]) {ddashes[l] = dashes[l]; l++; }
- } else if (style & 0xff) {
- ddashes = new double[6];
- if (style & 0x200){ // round and square caps, dash length need to be adjusted
- const double *dt = dashes_cap[style & 0xff];
- while (*dt >= 0){
- ddashes[l++] = width * (*dt);
- dt++;
- }
- } else {
- const int *ds = dashes_flat[style & 0xff];
- while (*ds >= 0){
- ddashes[l++] = width * (*ds);
- ds++;
- }
- }
- }
- cairo_set_dash(cairo_, ddashes, l, 0);
- delete[] ddashes;
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::color(unsigned char r, unsigned char g, unsigned char b) {
- Fl_Graphics_Driver::color( fl_rgb_color(r, g, b) );
- cr_ = r; cg_ = g; cb_ = b;
- double fr, fg, fb;
- fr = r/255.0;
- fg = g/255.0;
- fb = b/255.0;
- cairo_set_source_rgb(cairo_, fr, fg, fb);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::draw(int rotation, const char *str, int n, int x, int y)
-{
- cairo_save(cairo_);
- cairo_translate(cairo_, x, y);
- cairo_rotate(cairo_, -rotation * M_PI / 180);
- this->transformed_draw(str, n, 0, 0);
- cairo_restore(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::transformed_draw(const char* str, int n, double x, double y) {
- if (!n) return;
- pango_layout_set_font_description(pango_layout_, Fl_Xlib_Graphics_Driver::pango_font_description(Fl_Graphics_Driver::font()));
- int pwidth, pheight;
- cairo_save(cairo_);
- pango_layout_set_text(pango_layout_, str, n);
- pango_layout_get_size(pango_layout_, &pwidth, &pheight);
- if (pwidth > 0) {
- double s = width(str, n);
- cairo_translate(cairo_, x, y - height() + descent());
- s = (s/pwidth) * PANGO_SCALE;
- cairo_scale(cairo_, s, s);
- pango_cairo_show_layout(cairo_, pango_layout_);
- }
- cairo_restore(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::rtl_draw(const char* str, int n, int x, int y) {
- int w = (int)width(str, n);
- transformed_draw(str, n, x - w, y);
-}
-
-void Fl_PostScript_Graphics_Driver::concat(){
- cairo_matrix_t mat = {fl_matrix->a , fl_matrix->b , fl_matrix->c , fl_matrix->d , fl_matrix->x , fl_matrix->y};
- cairo_transform(cairo_, &mat);
-}
-
-void Fl_PostScript_Graphics_Driver::reconcat(){
- cairo_matrix_t mat = {fl_matrix->a , fl_matrix->b , fl_matrix->c , fl_matrix->d , fl_matrix->x , fl_matrix->y};
- cairo_status_t stat = cairo_matrix_invert(&mat);
- if (stat != CAIRO_STATUS_SUCCESS) {
- fputs("error in cairo_matrix_invert\n", stderr);
- }
- cairo_transform(cairo_, &mat);
-}
-
-void Fl_PostScript_Graphics_Driver::begin_points() {
- cairo_save(cairo_);
- concat();
- cairo_new_path(cairo_);
- gap_=1;
- shape_=POINTS;
-}
-
-void Fl_PostScript_Graphics_Driver::begin_line() {
- cairo_save(cairo_);
- concat();
- cairo_new_path(cairo_);
- gap_=1;
- shape_=LINE;
-}
-
-void Fl_PostScript_Graphics_Driver::begin_loop() {
- cairo_save(cairo_);
- concat();
- cairo_new_path(cairo_);
- gap_=1;
- shape_=LOOP;
-}
-
-void Fl_PostScript_Graphics_Driver::begin_polygon() {
- cairo_save(cairo_);
- concat();
- cairo_new_path(cairo_);
- gap_=1;
- shape_=POLYGON;
-}
-
-void Fl_PostScript_Graphics_Driver::vertex(double x, double y) {
- if(shape_==POINTS){
- cairo_move_to(cairo_, x, y);
- gap_=1;
- return;
- }
- if(gap_){
- cairo_move_to(cairo_, x, y);
- gap_=0;
- }else
- cairo_line_to(cairo_, x, y);
-}
-
-void Fl_PostScript_Graphics_Driver::curve(double x, double y, double x1, double y1, double x2, double y2, double x3, double y3)
-{
- if(shape_==NONE) return;
- if(gap_)
- cairo_move_to(cairo_, x, y);
- else
- cairo_line_to(cairo_, x, y);
- gap_=0;
- cairo_curve_to(cairo_, x1 , y1 , x2 , y2 , x3 , y3);
-}
-
-void Fl_PostScript_Graphics_Driver::circle(double x, double y, double r){
- if (shape_==NONE){
- cairo_save(cairo_);
- concat();
- cairo_arc(cairo_, x, y, r, 0, 2*M_PI);
- reconcat();
- cairo_restore(cairo_);
- } else
- cairo_arc(cairo_, x, y, r, 0, 2*M_PI);
-}
-
-void Fl_PostScript_Graphics_Driver::arc(double x, double y, double r, double start, double a){
- if (shape_==NONE) return;
- gap_ = 0;
- if(start > a)
- cairo_arc(cairo_, x, y, r, -start*M_PI/180, -a*M_PI/180);
- else
- cairo_arc_negative(cairo_, x, y, r, -start*M_PI/180, -a*M_PI/180);
-}
-
-void Fl_PostScript_Graphics_Driver::arc(int x, int y, int w, int h, double a1, double a2) {
- if (w <= 1 || h <= 1) return;
- cairo_save(cairo_);
- begin_line();
- cairo_translate(cairo_, x + w/2.0 -0.5 , y + h/2.0 - 0.5);
- cairo_scale(cairo_, (w-1)/2.0 , (h-1)/2.0);
- arc(0,0,1,a2,a1);
- cairo_scale(cairo_, 2.0/(w-1) , 2.0/(h-1));
- cairo_translate(cairo_, -x - w/2.0 +0.5 , -y - h/2.0 +0.5);
- end_line();
- cairo_restore(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::pie(int x, int y, int w, int h, double a1, double a2) {
- cairo_save(cairo_);
- begin_polygon();
- cairo_translate(cairo_, x + w/2.0 -0.5 , y + h/2.0 - 0.5);
- cairo_scale(cairo_, (w-1)/2.0 , (h-1)/2.0);
- vertex(0,0);
- arc(0.0,0.0, 1, a2, a1);
- end_polygon();
- cairo_restore(cairo_);
-}
-
-void Fl_PostScript_Graphics_Driver::end_points() {
- end_line();
-}
-
-void Fl_PostScript_Graphics_Driver::end_line() {
- gap_=1;
- reconcat();
- cairo_stroke(cairo_);
- cairo_restore(cairo_);
- shape_=NONE;
-}
-
-void Fl_PostScript_Graphics_Driver::end_loop(){
- gap_=1;
- reconcat();
- cairo_close_path(cairo_);
- cairo_stroke(cairo_);
- cairo_restore(cairo_);
- shape_=NONE;
-}
-
-void Fl_PostScript_Graphics_Driver::end_polygon() {
- gap_=1;
- reconcat();
- cairo_close_path(cairo_);
- cairo_fill(cairo_);
- cairo_restore(cairo_);
- shape_=NONE;
-}
-
-void Fl_PostScript_Graphics_Driver::transformed_vertex(double x, double y) {
- reconcat();
- if(gap_){
- cairo_move_to(cairo_, x, y);
- gap_=0;
- }else
- cairo_line_to(cairo_, x, y);
- concat();
-}
-
-void Fl_PostScript_Graphics_Driver::push_clip(int x, int y, int w, int h) {
- Clip * c=new Clip();
- clip_box(x,y,w,h,c->x,c->y,c->w,c->h);
- c->prev=clip_;
- clip_=c;
- cairo_save(cairo_);
- cairo_rectangle(cairo_, clip_->x-0.5 , clip_->y-0.5 , clip_->w , clip_->h);
- cairo_clip(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::push_no_clip() {
- Clip * c = new Clip();
- c->prev=clip_;
- clip_=c;
- clip_->x = clip_->y = clip_->w = clip_->h = -1;
- cairo_save(cairo_);
- cairo_reset_clip(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::pop_clip() {
- if(!clip_)return;
- Clip * c=clip_;
- clip_=clip_->prev;
- delete c;
- cairo_restore(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::ps_origin(int x, int y) {
- cairo_restore(cairo_);
- cairo_restore(cairo_);
- cairo_save(cairo_);
- cairo_scale(cairo_, scale_x, scale_y);
- cairo_translate(cairo_, x, y);
- cairo_rotate(cairo_, angle * M_PI / 180);
- cairo_save(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::ps_translate(int x, int y)
-{
- cairo_save(cairo_);
- cairo_translate(cairo_, x, y);
- cairo_save(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::ps_untranslate(void)
-{
- cairo_restore(cairo_);
- cairo_restore(cairo_);
- check_status();
-}
-
-void Fl_PostScript_Graphics_Driver::check_status(void) {
-#ifdef DEBUG
- if (cairo_status(cairo_) != CAIRO_STATUS_SUCCESS) {
- fprintf(stderr,"we have a problem");
- }
-#endif
+PangoFontDescription* Fl_PostScript_Graphics_Driver::pango_font_description(Fl_Font fnum) {
+ return Fl_Xlib_Graphics_Driver::pango_font_description(fnum);
}
#endif // USE_PANGO