Browse Source

Attempt to draw better 1-pixel lines with cairo.

tags/v1.3.1000
Jonathan Moore Liles 14 years ago
parent
commit
74eb0fb12d
4 changed files with 79 additions and 56 deletions
  1. +1
    -1
      src/Fl.cxx
  2. +72
    -54
      src/Fl_Cairo_Graphics_Driver.cxx
  3. +4
    -1
      src/Fl_Double_Window.cxx
  4. +2
    -0
      src/Fl_x.cxx

+ 1
- 1
src/Fl.cxx View File

@@ -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;}


+ 72
- 54
src/Fl_Cairo_Graphics_Driver.cxx View File

@@ -57,7 +57,9 @@
#include <math.h>
#include <FL/Fl_Device.H>

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; i<n; i++)
cairo_line_to( cr, p[i].x, p[i].y);
cairo_line_to( cr, p[i].x + 0.5, p[i].y + 0.5 );

cairo_stroke( cr );
}
@@ -361,7 +379,7 @@ void Fl_Cairo_Graphics_Driver::end_points ( void )
cairo_t *cr = Fl::cairo_cc();

for (int i=0; i<n; i++)
cairo_rectangle( cr, p[1].x, p[1].y, 1, 1 );
cairo_rectangle( cr, p[1].x + 0.5, p[1].y + 0.5, 1, 1 );

cairo_fill( cr );
}
@@ -389,10 +407,10 @@ void Fl_Cairo_Graphics_Driver::end_complex_polygon ( 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; i<n; i++)
cairo_line_to( cr, p[i].x, p[i].y);
cairo_line_to( cr, p[i].x + 0.5, p[i].y + 0.5);

cairo_close_path( cr );

@@ -411,10 +429,10 @@ void Fl_Cairo_Graphics_Driver::end_polygon ( 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; i<n; i++)
cairo_line_to( cr, p[i].x, p[i].y);
cairo_line_to( cr, p[i].x + 0.5, p[i].y + 0.5 );

cairo_close_path( cr );
cairo_fill( cr );
@@ -432,9 +450,9 @@ void Fl_Cairo_Graphics_Driver::polygon ( int x, int y, int x1, int y1, int x2, i
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y1 );
cairo_line_to( cr, x2, y2 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x1 + 0.5, y1 + 0.5 );
cairo_line_to( cr, x2 + 0.5, y2 + 0.5 );
cairo_close_path( cr );
cairo_fill( cr );
}
@@ -443,10 +461,10 @@ void Fl_Cairo_Graphics_Driver::polygon ( int x, int y, int x1, int y1, int x2, i
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y1 );
cairo_line_to( cr, x2, y2 );
cairo_line_to( cr, x3, y3 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_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_close_path( cr );
cairo_fill( cr );
}
@@ -455,9 +473,9 @@ void Fl_Cairo_Graphics_Driver::loop ( int x, int y, int x1, int y1, int x2, int
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y1 );
cairo_line_to( cr, x2, y2 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x1 + 0.5, y1 + 0.5 );
cairo_line_to( cr, x2 + 0.5, y2 + 0.5 );
cairo_close_path( cr );
cairo_stroke( cr );
}
@@ -466,10 +484,10 @@ void Fl_Cairo_Graphics_Driver::loop ( int x, int y, int x1, int y1, int x2, int
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y1 );
cairo_line_to( cr, x2, y2 );
cairo_line_to( cr, x3, y3 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_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_close_path( cr );
cairo_stroke( cr );
}
@@ -479,8 +497,8 @@ void Fl_Cairo_Graphics_Driver::xyline ( int x, int y, int x1 )
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y );
cairo_move_to( cr, x + 0.5, y + 0.5);
cairo_line_to( cr, x1 + 0.5, y + 0.5 );
cairo_stroke( cr );
}
@@ -489,9 +507,9 @@ void Fl_Cairo_Graphics_Driver::xyline ( int x, int y, int x1, int y2 )
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y );
cairo_line_to( cr, x1, y2 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x1 + 0.5, y + 0.5 );
cairo_line_to( cr, x1 + 0.5, y2 + 0.5 );

cairo_stroke( cr );
}
@@ -500,10 +518,10 @@ void Fl_Cairo_Graphics_Driver::xyline ( int x, int y, int x1, int y2, int x3 )
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x1, y );
cairo_line_to( cr, x1, y2 );
cairo_line_to( cr, x3, y2 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x1 + 0.5, y + 0.5 );
cairo_line_to( cr, x1 + 0.5, y2 + 0.5 );
cairo_line_to( cr, x3 + 0.5, y2 + 0.5 );

cairo_stroke( cr );
}
@@ -512,8 +530,8 @@ void Fl_Cairo_Graphics_Driver::yxline ( int x, int y, int y1 )
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x, y1 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x + 0.5, y1 + 0.5 );
cairo_stroke( cr );
}
@@ -522,9 +540,9 @@ void Fl_Cairo_Graphics_Driver::yxline ( int x, int y, int y1, int x2 )
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x, y1 );
cairo_line_to( cr, x2, y1 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x + 0.5, y1 + 0.5 );
cairo_line_to( cr, x2 + 0.5, y1 + 0.5 );

cairo_stroke( cr );
}
@@ -533,10 +551,10 @@ void Fl_Cairo_Graphics_Driver::yxline ( int x, int y, int y1, int x2, int y3 )
{
cairo_t *cr = Fl::cairo_cc();
cairo_move_to( cr, x, y );
cairo_line_to( cr, x, y1 );
cairo_line_to( cr, x2, y1 );
cairo_line_to( cr, x2, y3 );
cairo_move_to( cr, x + 0.5, y + 0.5 );
cairo_line_to( cr, x + 0.5, y1 + 0.5 );
cairo_line_to( cr, x2 + 0.5, y1 + 0.5 );
cairo_line_to( cr, x2 + 0.5, y3 + 0.5 );

cairo_stroke( cr );
}


+ 4
- 1
src/Fl_Double_Window.cxx View File

@@ -370,8 +370,9 @@ void Fl_Double_Window::flush(int eraseoverlay) {
if (damage()) {
fl_clip_region(myi->region); 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


+ 2
- 0
src/Fl_x.cxx View File

@@ -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;


Loading…
Cancel
Save