diff --git a/src/Fl.cxx b/src/Fl.cxx index f97b67e..5a26b90 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -746,9 +746,9 @@ void Fl::flush() { for (Fl_X* i = Fl_X::first; i; i = i->next) { if (i->wait_for_expose) {damage_ = 1; continue;} Fl_Window* wi = i->w; - wi->make_current(); // Fl::cairo_make_current(wi); if (!wi->visible_r()) continue; + wi->make_current(); if (wi->damage()) {i->flush(); wi->clear_damage();} // destroy damage regions for windows that don't use them: if (i->region) {XDestroyRegion(i->region); i->region = 0;} diff --git a/src/Fl_Cairo_Graphics_Driver.cxx b/src/Fl_Cairo_Graphics_Driver.cxx index ad10de3..d6c152a 100644 --- a/src/Fl_Cairo_Graphics_Driver.cxx +++ b/src/Fl_Cairo_Graphics_Driver.cxx @@ -57,7 +57,9 @@ #include #include -static double line_width = 0.5; +static double lw = 1; +static double hlw; + Fl_Cairo_Graphics_Driver::Fl_Cairo_Graphics_Driver ( ) : Fl_Xlib_Graphics_Driver () { @@ -91,13 +93,23 @@ void Fl_Cairo_Graphics_Driver::line_style ( int style, int t, char* ) { cairo_t *cr = Fl::cairo_cc(); - line_width = t > 0 ? t : 0.5; + if ( t == 0 || t == 1 ) + { + double w1, w2; + w1 = w2 = 1.0; + cairo_device_to_user_distance (cr, &w1, &w2); + lw = w1 > w2 ? w1 : w2; + } + else + lw = t; + + hlw = lw / 2.0; - cairo_set_line_width( cr, line_width ); + cairo_set_line_width( cr, lw ); if ( style & FL_DASH ) { - const double dash[] = { line_width, line_width }; + const double dash[] = { lw, lw }; int len = sizeof(dash) / sizeof(dash[0]); cairo_set_dash( cr, dash, len, 0 ); @@ -140,6 +152,9 @@ void Fl_Cairo_Graphics_Driver::color ( uchar r, uchar g, uchar b ) cairo_t *cr = Fl::cairo_cc(); Fl_Xlib_Graphics_Driver::color( r, g, b ); + + if ( ! cr ) + return; cairo_set_source_rgb( cr, r / 255.0f, g / 255.0f, b / 255.0f ); } @@ -208,6 +223,9 @@ void Fl_Cairo_Graphics_Driver::color (uchar r, uchar g, uchar b, uchar a ) Fl_Xlib_Graphics_Driver::color( r, g, b ); + if ( ! cr ) + return; + cairo_set_source_rgba( cr, r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f ); } @@ -287,7 +305,7 @@ void Fl_Cairo_Graphics_Driver::pie( int x, int y, int w, int h, double a1, doubl cairo_save( cr ); cairo_translate( cr, cx, cy ); // cairo_scale( cr, w, 0 - h ); - cairo_scale( cr, (w - line_width * 2) - 1.0f, 0 - ((h - line_width * 2) - 1.0f )); + cairo_scale( cr, (w - lw * 2) - 1.0f, 0 - ((h - lw * 2) - 1.0f )); cairo_arc( cr, 0.0, 0.0, 0.5, a1R, a2R ); cairo_line_to( cr, 0, 0 ); cairo_close_path( cr ); @@ -299,8 +317,8 @@ void Fl_Cairo_Graphics_Driver::line( int x1, int y1, int x2, int y2 ) { cairo_t *cr = Fl::cairo_cc(); - cairo_move_to( cr, x1, y1 ); - cairo_line_to( cr, x2, y2 ); + cairo_move_to( cr, x1 + 0.5, y1 + 0.5 ); + cairo_line_to( cr, x2 + 0.5, y2 + 0.5 ); cairo_stroke( cr ); } @@ -308,9 +326,9 @@ void Fl_Cairo_Graphics_Driver::line( int x1, int y1, int x2, int y2, int x3, int { cairo_t *cr = Fl::cairo_cc(); - cairo_move_to( cr, x1, y1 ); - cairo_line_to( cr, x2, y2 ); - cairo_line_to( cr, x3, y3 ); + cairo_move_to( cr, x1 + 0.5, y1 + 0.5 ); + cairo_line_to( cr, x2 + 0.5, y2 + 0.5); + cairo_line_to( cr, x3 + 0.5, y3 + 0.5 ); cairo_stroke( cr ); } @@ -321,11 +339,11 @@ void Fl_Cairo_Graphics_Driver::rect ( int x, int y, int w, int h ) /* cairo draws lines half inside and half outside of the path... */ - const double line_width = cairo_get_line_width( cr ); - const double o = line_width / 2.0; + /* const double line_width = cairo_get_line_width( cr ); */ + /* const double o = line_width / 2.0; */ - cairo_rectangle( cr, x + o, y + o, w - line_width - 1, h - line_width - 1); -// cairo_rectangle( cr, x, y, w, h ); +// cairo_rectangle( cr, x + hlw, y + hlw, w - lw - 1, h - lw - 1); + cairo_rectangle( cr, x + 0.5, y + 0.5, w, h ); cairo_stroke( cr ); } @@ -334,7 +352,7 @@ void Fl_Cairo_Graphics_Driver::rectf ( int x, int y, int w, int h ) cairo_t *cr = Fl::cairo_cc(); /* cairo fills the inside of the path... */ - cairo_rectangle( cr, x, y, w, h ); + cairo_rectangle( cr, x + 0.5, y + 0.5, w, h ); cairo_fill( cr ); } @@ -348,10 +366,10 @@ void Fl_Cairo_Graphics_Driver::end_line ( void ) return; } - cairo_move_to( cr, p[0].x, p[0].y ); + cairo_move_to( cr, p[0].x + 0.5, p[0].y + 0.5 ); for (int i=1; iregion); myi->region = 0; fl_window = myi->other_xid; - +#if FLTK_HAVE_CAIRO Fl::cairo_set_drawable( this ); +#endif draw(); fl_window = myi->xid; @@ -412,7 +413,9 @@ void Fl_Double_Window::flush(int eraseoverlay) { } #else // X: fl_window = myi->other_xid; +#if FLTK_HAVE_CAIRO Fl::cairo_set_drawable( this ); +#endif draw(); fl_window = myi->xid; #endif diff --git a/src/Fl_x.cxx b/src/Fl_x.cxx index d6120f3..4f6a6d9 100644 --- a/src/Fl_x.cxx +++ b/src/Fl_x.cxx @@ -1608,8 +1608,10 @@ Fl_X* Fl_X::set_xid(Fl_Window* win, Window winxid) { Fl_X* xp = new Fl_X; xp->xid = winxid; xp->other_xid = 0; +#if FLTK_HAVE_CAIRO xp->cc = 0; xp->cs = 0; +#endif xp->setwindow(win); xp->next = Fl_X::first; xp->region = 0;