X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66f917a7eaf5d9c90fe76f7bbefeba2dd30a7de3..00b4dbd74e7b77733f6f9545995f8ddb9c63aa33:/src/generic/graphicc.cpp diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index d2a9ab089f..0cc09b6751 100644 --- a/src/generic/graphicc.cpp +++ b/src/generic/graphicc.cpp @@ -19,6 +19,10 @@ #include "wx/graphics.h" +#if wxUSE_CAIRO + +#include "wx/cairo.h" + #ifndef WX_PRECOMP #include "wx/bitmap.h" #include "wx/icon.h" @@ -60,6 +64,10 @@ using namespace std; #endif #include +#ifdef __WXMSW__ +#include +#endif + #ifdef __WXGTK__ #include #include "wx/fontutil.h" @@ -284,12 +292,16 @@ private : cairo_font_slant_t m_slant; cairo_font_weight_t m_weight; #endif +#ifdef __WXMSW__ + wxCairoContext( wxGraphicsRenderer* renderer, HDC context ); +#endif }; class wxCairoBitmapData : public wxGraphicsObjectRefData { public: wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitmap& bmp ); + wxCairoBitmapData( wxGraphicsRenderer* renderer, cairo_surface_t* bitmap ); ~wxCairoBitmapData(); virtual cairo_surface_t* GetCairoSurface() { return m_surface; } @@ -330,6 +342,9 @@ public: } virtual void Clip( const wxRegion ®ion ); +#ifdef __WXMSW__ + cairo_surface_t* m_mswSurface; +#endif // clips drawings to the rect virtual void Clip( wxDouble x, wxDouble y, wxDouble w, wxDouble h ); @@ -1014,6 +1029,13 @@ void * wxCairoMatrixData::GetNativeMatrix() const // wxCairoBitmap implementation //----------------------------------------------------------------------------- +wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, cairo_surface_t* bitmap ) : + wxGraphicsObjectRefData( renderer ) +{ + m_surface = bitmap; + m_pattern = cairo_pattern_create_for_surface(m_surface); +} + wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitmap& bmp ) : wxGraphicsObjectRefData( renderer ) { wxCHECK_RET( bmp.IsOk(), wxT("Invalid bitmap in wxCairoContext::DrawBitmap")); @@ -1219,6 +1241,18 @@ wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, GdkDrawable *drawa } #endif +#ifdef __WXMSW__ +wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, HDC handle ) +: wxGraphicsContext(renderer) +{ + m_mswSurface = cairo_win32_surface_create(handle); + m_context = cairo_create(m_mswSurface); + PushState(); + PushState(); +} +#endif + + wxCairoContext::wxCairoContext( wxGraphicsRenderer* renderer, cairo_t *context ) : wxGraphicsContext(renderer) { @@ -1250,9 +1284,17 @@ wxCairoContext::~wxCairoContext() if ( m_context ) { PopState(); +#ifdef __WXMSW__ + m_mswSurface = cairo_win32_surface_create((HDC)window->GetHandle()); + m_context = cairo_create(m_mswSurface); +#endif PopState(); cairo_destroy(m_context); } +#ifdef __WXMSW__ + if ( m_mswSurface ) + cairo_surface_destroy(m_mswSurface); +#endif } void wxCairoContext::Init(cairo_t *context) @@ -1708,6 +1750,9 @@ public : // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ); + // create a graphics bitmap from a native bitmap + virtual wxGraphicsBitmap CreateBitmapFromNativeBitmap( void* bitmap ); + // create a subimage from a native image representation virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); @@ -1757,7 +1802,12 @@ wxGraphicsContext * wxCairoRenderer::CreateContext( const wxPrinterDC& dc) wxGraphicsContext * wxCairoRenderer::CreateContextFromNativeContext( void * context ) { +#ifdef __WXMSW__ + return new wxCairoContext(this,(HDC)context); +#endif +#ifdef __WXGTK__ return new wxCairoContext(this,(cairo_t*)context); +#endif } @@ -1879,6 +1929,18 @@ wxGraphicsBitmap wxCairoRenderer::CreateBitmap( const wxBitmap& bmp ) return wxNullGraphicsBitmap; } +wxGraphicsBitmap wxCairoRenderer::CreateBitmapFromNativeBitmap( void* bitmap ) +{ + if ( bitmap != NULL ) + { + wxGraphicsBitmap p; + p.SetRefData(new wxCairoBitmapData( this , (cairo_surface_t*) bitmap )); + return p; + } + else + return wxNullGraphicsBitmap; +} + wxGraphicsBitmap wxCairoRenderer::CreateSubBitmap(const wxGraphicsBitmap& WXUNUSED(bitmap), wxDouble WXUNUSED(x), @@ -1890,4 +1952,15 @@ wxCairoRenderer::CreateSubBitmap(const wxGraphicsBitmap& WXUNUSED(bitmap), return wxNullGraphicsBitmap; } -#endif // wxUSE_GRAPHICS_CONTEXT +#endif // wxUSE_CAIRO + +wxGraphicsRenderer* wxGraphicsRenderer::GetCairoRenderer() +{ +#if wxUSE_CAIRO + return &gs_cairoGraphicsRenderer; +#else + return NULL; +#endif +} + +#endif // wxUSE_GRAPHICS_CONTEXT