diff options
Diffstat (limited to 'src/drivers/PostScript/Fl_PostScript.cxx')
| -rw-r--r-- | src/drivers/PostScript/Fl_PostScript.cxx | 446 |
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 |
