X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/03647350fc7cd141953c72e0284e928847d30f44..0aaa6ace7ede4240453251d6a1c84c918c54c321:/src/generic/graphicc.cpp diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index af0031b536..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,11 +1029,17 @@ 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")); - cairo_surface_t* surface; int bw = bmp.GetWidth(); int bh = bmp.GetHeight(); wxBitmap bmpSource = bmp; // we need a non-const instance @@ -1085,12 +1106,17 @@ wxCairoBitmapData::wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitm p.OffsetY(pixData, 1); } } + m_pattern = cairo_pattern_create_for_surface(m_surface); } wxCairoBitmapData::~wxCairoBitmapData() { - cairo_pattern_destroy(m_pattern); - cairo_surface_destroy(m_surface); + if (m_pattern) + cairo_pattern_destroy(m_pattern); + + if (m_surface) + cairo_surface_destroy(m_surface); + delete [] m_buffer; } @@ -1215,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) { @@ -1246,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) @@ -1704,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 ); @@ -1753,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 } @@ -1875,10 +1929,38 @@ wxGraphicsBitmap wxCairoRenderer::CreateBitmap( const wxBitmap& bmp ) return wxNullGraphicsBitmap; } -wxGraphicsBitmap wxCairoRenderer::CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +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), + wxDouble WXUNUSED(y), + wxDouble WXUNUSED(w), + wxDouble WXUNUSED(h)) { wxFAIL_MSG("wxCairoRenderer::CreateSubBitmap is not implemented."); 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