From 2fc9c1ea77eb02938debb6d4c2bdebd052309cc2 Mon Sep 17 00:00:00 2001 From: Kevin Ollivier Date: Sat, 20 Jun 2009 23:33:55 +0000 Subject: [PATCH] Forward port wxGraphicsBitmap cairo implementation, and fix the credit info in measuring.cpp git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61152 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/graphics.h | 5 - src/common/graphcmn.cpp | 8 -- src/generic/graphicc.cpp | 221 +++++++++++++++++++++-------------- tests/graphics/measuring.cpp | 8 +- 4 files changed, 138 insertions(+), 104 deletions(-) diff --git a/include/wx/graphics.h b/include/wx/graphics.h index 3be5731140..d93d63ba41 100644 --- a/include/wx/graphics.h +++ b/include/wx/graphics.h @@ -499,9 +499,7 @@ public: // image support // -#ifndef __WXGTK20__ virtual void DrawBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; -#endif virtual void DrawBitmap( const wxBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; @@ -657,14 +655,11 @@ public: // sets the font virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) = 0; -#ifndef __WXGTK20__ // create a native bitmap representation virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) = 0; // create a subimage from a native image representation virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) = 0; -#endif - private: wxDECLARE_NO_COPY_CLASS(wxGraphicsRenderer); diff --git a/src/common/graphcmn.cpp b/src/common/graphcmn.cpp index 9cdfdbac0c..aa286cc58a 100644 --- a/src/common/graphcmn.cpp +++ b/src/common/graphcmn.cpp @@ -781,20 +781,12 @@ wxGraphicsFont wxGraphicsContext::CreateFont( const wxFont &font , const wxColou wxGraphicsBitmap wxGraphicsContext::CreateBitmap( const wxBitmap& bmp ) const { -#ifndef __WXGTK20__ return GetRenderer()->CreateBitmap(bmp); -#else - return wxNullGraphicsBitmap; -#endif } wxGraphicsBitmap wxGraphicsContext::CreateSubBitmap( const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) const { -#ifndef __WXGTK20__ return GetRenderer()->CreateSubBitmap(bmp,x,y,w,h); -#else - return wxNullGraphicsBitmap; -#endif } /* static */ wxGraphicsContext* wxGraphicsContext::Create( const wxWindowDC& dc) diff --git a/src/generic/graphicc.cpp b/src/generic/graphicc.cpp index ebc8e253d0..aa3269a4c8 100644 --- a/src/generic/graphicc.cpp +++ b/src/generic/graphicc.cpp @@ -286,6 +286,23 @@ private : #endif }; +class wxCairoBitmapData : public wxGraphicsObjectRefData +{ +public: + wxCairoBitmapData( wxGraphicsRenderer* renderer, const wxBitmap& bmp ); + ~wxCairoBitmapData(); + + virtual cairo_surface_t* GetCairoSurface() { return m_surface; } + virtual cairo_pattern_t* GetCairoPattern() { return m_pattern; } + virtual wxSize GetSize() { return wxSize(m_width, m_height); } +private : + cairo_surface_t* m_surface; + cairo_pattern_t* m_pattern; + int m_width; + int m_height; + unsigned char* m_buffer; +}; + class WXDLLIMPEXP_CORE wxCairoContext : public wxGraphicsContext { public: @@ -993,6 +1010,91 @@ void * wxCairoMatrixData::GetNativeMatrix() const return (void*) &m_matrix; } +// wxCairoBitmap implementation +//----------------------------------------------------------------------------- + +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 + m_buffer = new unsigned char[bw*bh*4]; + wxUint32* data = (wxUint32*)buffer; + + // Create a surface object and copy the bitmap pixel data to it. if the + // image has alpha (or a mask represented as alpha) then we'll use a + // different format and iterator than if it doesn't... + if (bmpSource.HasAlpha() || bmpSource.GetMask()) + { + m_surface = cairo_image_surface_create_for_data( + m_buffer, CAIRO_FORMAT_ARGB32, bw, bh, bw*4); + wxAlphaPixelData pixData(bmpSource, wxPoint(0,0), wxSize(bw, bh)); + wxCHECK_RET( pixData, wxT("Failed to gain raw access to bitmap data.")); + + wxAlphaPixelData::Iterator p(pixData); + for (int y=0; yCreateBitmap(bmp); + DrawGraphicsBitmapInternal(bitmap, x, y, w, h); +} +void wxCairoContext::DrawBitmap(const wxGraphicsBitmap &bmp, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ PushState(); // In case we're scaling the image by using a width and height different // than the bitmap's size create a pattern transformation on the surface and // draw the transformed pattern. - cairo_pattern_t* pattern = cairo_pattern_create_for_surface(surface); - wxDouble scaleX = w / bw; - wxDouble scaleY = h / bh; + wxCairoBitmapData* data = static_cast(bmp.GetRefData()); + cairo_pattern_t* pattern = data->GetCairoPattern(); + wxSize size = data->GetSize(); + + wxDouble scaleX = w / size.GetWidth(); + wxDouble scaleY = h / size.GetHeight(); cairo_scale(m_context, scaleX, scaleY); // prepare to draw the image cairo_translate(m_context, x, y); cairo_set_source(m_context, pattern); // use the original size here since the context is scaled already... - cairo_rectangle(m_context, 0, 0, bw, bh); + cairo_rectangle(m_context, 0, 0, size.GetWidth(), size.GetHeight()); // fill the rectangle using the pattern cairo_fill(m_context); - // clean up - cairo_pattern_destroy(pattern); - cairo_surface_destroy(surface); - delete [] buffer; PopState(); } @@ -1664,18 +1701,10 @@ public : virtual wxGraphicsFont CreateFont( const wxFont &font , const wxColour &col = *wxBLACK ) ; // create a native bitmap representation -#if 0 - virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ) - { - return wxGraphicsBitmap; - } + virtual wxGraphicsBitmap CreateBitmap( const wxBitmap &bitmap ); // create a subimage from a native image representation - virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) - { - return wxGraphicsBitmap; - } -#endif + virtual wxGraphicsBitmap CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ); private : DECLARE_DYNAMIC_CLASS_NO_COPY(wxCairoRenderer) @@ -1833,4 +1862,22 @@ wxGraphicsFont wxCairoRenderer::CreateFont( const wxFont &font , const wxColour return wxNullGraphicsFont; } +wxGraphicsBitmap wxGraphicsRenderer::CreateBitmap( const wxBitmap& bmp ) +{ + if ( bmp.Ok() ) + { + wxGraphicsBitmap p; + p.SetRefData(new wxCairoBitmapData( this , bmp )); + return p; + } + else + return wxNullGraphicsBitmap; +} + +wxGraphicsBitmap wxGraphicsRenderer::CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h ) +{ + wxFAIL_MSG("wxCairoRenderer::CreateSubBitmap is not implemented."); + return wxNullGraphicsBitmap; +} + #endif // wxUSE_GRAPHICS_CONTEXT diff --git a/tests/graphics/measuring.cpp b/tests/graphics/measuring.cpp index b5e8419a49..9affc9882c 100644 --- a/tests/graphics/measuring.cpp +++ b/tests/graphics/measuring.cpp @@ -1,10 +1,10 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: tests/controls/clientsize.cpp -// Purpose: Client vs. window size handling unit test -// Author: Vaclav Slavik +// Name: tests/graphics/measuring.cpp +// Purpose: Tests for wxGraphicsRenderer::CreateMeasuringContext +// Author: Kevin Ollivier // Created: 2008-02-12 // RCS-ID: $Id: clientsize.cpp 53740 2008-05-25 02:56:22Z VZ $ -// Copyright: (c) 2008 Vaclav Slavik +// Copyright: (c) 2008 Kevin Ollivier /////////////////////////////////////////////////////////////////////////////// // ----------------------------------------------------------------------------