[cairo] Question concerning Win32 surfaces.

Andrew S Katz (tb) akatz712 at gmail.com
Sat Jun 6 05:00:27 PDT 2009


I am looking for the fastest way to get my designs drawn to my Windows 
application. I noticed that Firefox uses Cairo for Canvas, and I can 
draw many designs and it shows up instantaneously. So, why is there a 
delay for me. I have written my user interface in a language called 
Euphoria with its Windows library, and it calls a DLL I wrote in C with 
Cairo calls. I had an idea that one of these calls would be faster, but 
they do not work, so please explain how and why they are used:
cairo_win32_surface_create_with_dib ()
cairo_win32_surface_create_with_ddb ()

Thanks,
Andy

Here is my code:

-- this is what Cairo draws to
snapshotx = createEx(Pixmap,"",0,0,0,cx,cy,0,0)

setCtlSize( DRAWIN, cx, cy ) -- assume this triggers paint

hDC = getDC (snapshotx)
DRAWINsize = getCtlSize(DRAWIN)
c_proc (start_cairo_screen_C, {hDC, backcolor, DRAWINsize[ptx], 
DRAWINsize[pty]})

    for i=1 to length(mgs) do -- loop for designs
        c_proc (redraw_C, {mgs[i][mgcolor], mgs[i][penwidth], 
mgdivs[i][2], mgdivs[i][1]}) -- contains the points for bezier curves
    end for

c_proc (end_cairo_screen_C, {})
releaseDC (snapshotx)

-- do repaint now
bitBlt(DRAWIN,0,0,snapshotx,0,0,DRAWINsize[ptx],DRAWINsize[pty],SrcCopy)

------------------------------------------------------------------------------------------------------------------------------------------

DLLIMPORT void start_cairo_screen(HDC hDC, COLORREF backcolor, int 
iwidth, int iheight)
{
    surface = cairo_win32_surface_create(hDC);
    cr = cairo_create(surface);
    cairo_set_source_rgb(cr, (backcolor&0xFF)/255.0, 
((backcolor>>8)&0xFF)/255.0, ((backcolor>>16)&0xFF)/255.0);
    cairo_rectangle(cr, 0.0, 0.0, (double)iwidth, (double)iheight);
    cairo_fill(cr);
}

DLLIMPORT void redraw_xxxx(COLORREF color, int stroke, DIV *div, int 
segments) // redraw_C
{
    int i,j;
   
    if (segments == 0) return;
   
    cairo_set_source_rgb(cr, (color&0xFF)/255.0, 
((color>>8)&0xFF)/255.0, ((color>>16)&0xFF)/255.0);
    cairo_set_line_width(cr, (double)stroke);

    for (i=0; i<segments; i+=4)
    {
        for (j=0; j<4; j++)
        {
            bezierx[j] = div[i+j].x;
            beziery[j] = div[i+j].y;
        }
        cairo_move_to( cr, bezierx[0], beziery[0] );
        cairo_curve_to( cr, bezierx[1], beziery[1],    bezierx[2], 
beziery[2],    bezierx[3], beziery[3]);
    }
    cairo_stroke(cr);
}

DLLIMPORT void end_cairo_screen()
{
    cairo_destroy(cr);
    cairo_surface_destroy(surface);
}




More information about the cairo mailing list