Cairo で落書き

巷では Wayland が注目されているようですが・・・。

AzXClass のウィンドウに Cairo で描写してみました。

#include <AXWindow.h>

#include <math.h> // M_PI
#include <cairo/cairo-xlib.h>

class AXCanvas : public AXWindow
{
protected:
    cairo_t *cr;

public:
    virtual ~AXCanvas();
    AXCanvas(AXWindow *pParent, UINT uID, UINT uStyle, UINT uSubStyle, DWORD dwPadding);
    
    virtual void OnPaint(PAINTSTRUCT *ps);
    virtual void OnSize();
};

AXCanvas::~AXCanvas()
{
    cairo_destroy(cr);
    cr = NULL;
}

AXCanvas::AXCanvas(AXWindow *pParent, UINT uID, UINT uStyle, UINT uSubStyle, DWORD dwPadding)
    : AXWindow(pParent, uID, 1, 1, uStyle, uSubStyle, dwPadding)
{
    cairo_surface_t *pSurface = cairo_xlib_surface_create(GetAppDisp(), m_id, GetAppVisual(), 1, 1);
    if (cairo_surface_status(pSurface) == CAIRO_STATUS_SUCCESS)
    {
        cr = cairo_create(pSurface);
        cairo_xlib_surface_set_size(pSurface, m_nW, m_nH);
    } else {
        cairo_surface_destroy(pSurface);
        cr = NULL;
    }
}

void AXCanvas::OnSize()
{
    if (cr) {
        cairo_surface_t *pSurface = cairo_get_target(cr);
        if (pSurface) {
            cairo_xlib_surface_set_size(pSurface, m_nW, m_nH);
            cairo_destroy(cr);
            cr = cairo_create(pSurface);
        }
    }
}

void AXCanvas::OnPaint(PAINTSTRUCT *ps)
{
    if (cr) {
        cairo_rectangle(cr, 0, 0, m_nW, m_nH);
        cairo_clip(cr);
        cairo_rectangle(cr, 0, 0, m_nW, m_nH);
        cairo_set_source_rgb(cr, 1, 1, 1);
        cairo_fill(cr);
        
        
        cairo_set_source_rgb(cr, 0, 0, 0);
        cairo_set_line_width(cr, 4);
        
        cairo_arc(cr, m_nW / 2, m_nH / 2, m_nW / 2 - 10, 0, 2*M_PI);
        cairo_stroke_preserve(cr);
        
        cairo_set_source_rgb(cr, 1, 1, 1);
        cairo_fill(cr);
    }
}

FLTK の ML を見ていたら、FLTK の Cairo バックエンドでは円の描写が遅いそうです[1]。Wayland になったら OpenGL で描写へ移行なんでしょうか。

[1] http://www.fltk.org/newsgroups.php?s12646+gfltk.development+v12665+T0