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