#include "wx/wxprec.h"
-#include "wx/dc.h"
-
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
+#include "wx/dc.h"
+
#if wxUSE_GRAPHICS_CONTEXT
#ifndef WX_PRECOMP
#include "wx/private/graphics.h"
#include "wx/msw/wrapgdip.h"
#include "wx/msw/dc.h"
+#include "wx/dcgraph.h"
#include "wx/stack.h"
virtual void StrokePath( const wxGraphicsPath& p );
virtual void FillPath( const wxGraphicsPath& p , wxPolygonFillMode fillStyle = wxODDEVEN_RULE );
- // stroke lines connecting each of the points
+ // stroke lines connecting each of the points
virtual void StrokeLines( size_t n, const wxPoint2DDouble *points);
// draws a polygon
virtual void BeginLayer(wxDouble opacity);
virtual void EndLayer();
-
+
virtual void Translate( wxDouble dx , wxDouble dy );
virtual void Scale( wxDouble xScale , wxDouble yScale );
virtual void Rotate( wxDouble angle );
DECLARE_DYNAMIC_CLASS_NO_COPY(wxGDIPlusContext)
};
-class WXDLLIMPEXP_CORE wxGDIPlusMeasuringContext : public wxGDIPlusContext
+class wxGDIPlusMeasuringContext : public wxGDIPlusContext
{
public:
wxGDIPlusMeasuringContext( wxGraphicsRenderer* renderer ) : wxGDIPlusContext( renderer , m_hdc = GetDC(NULL), 1000, 1000 )
if (m_composition == wxCOMPOSITION_DEST)
return;
- if ( !m_pen.IsNull() )
- {
- wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() );
- Point *cpoints = new Point[n];
- for (size_t i = 0; i < n; i++)
- {
- cpoints[i].X = (int)(points[i].m_x );
- cpoints[i].Y = (int)(points[i].m_y );
-
- } // for (size_t i = 0; i < n; i++)
- m_context->DrawLines( ((wxGDIPlusPenData*)m_pen.GetGraphicsData())->GetGDIPlusPen() , cpoints , n ) ;
- delete[] cpoints;
- }
+ if ( !m_pen.IsNull() )
+ {
+ wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() );
+ Point *cpoints = new Point[n];
+ for (size_t i = 0; i < n; i++)
+ {
+ cpoints[i].X = (int)(points[i].m_x );
+ cpoints[i].Y = (int)(points[i].m_y );
+
+ } // for (size_t i = 0; i < n; i++)
+ m_context->DrawLines( ((wxGDIPlusPenData*)m_pen.GetGraphicsData())->GetGDIPlusPen() , cpoints , n ) ;
+ delete[] cpoints;
+ }
}
void wxGDIPlusContext::DrawLines( size_t n, const wxPoint2DDouble *points, wxPolygonFillMode WXUNUSED(fillStyle) )
return;
wxGDIPlusOffsetHelper helper( m_context , ShouldOffset() );
- Point *cpoints = new Point[n];
- for (size_t i = 0; i < n; i++)
- {
- cpoints[i].X = (int)(points[i].m_x );
- cpoints[i].Y = (int)(points[i].m_y );
+ Point *cpoints = new Point[n];
+ for (size_t i = 0; i < n; i++)
+ {
+ cpoints[i].X = (int)(points[i].m_x );
+ cpoints[i].Y = (int)(points[i].m_y );
- } // for (int i = 0; i < n; i++)
- if ( !m_brush.IsNull() )
- m_context->FillPolygon( ((wxGDIPlusBrushData*)m_brush.GetRefData())->GetGDIPlusBrush() , cpoints , n ) ;
- if ( !m_pen.IsNull() )
- m_context->DrawLines( ((wxGDIPlusPenData*)m_pen.GetGraphicsData())->GetGDIPlusPen() , cpoints , n ) ;
- delete[] cpoints;
+ } // for (int i = 0; i < n; i++)
+ if ( !m_brush.IsNull() )
+ m_context->FillPolygon( ((wxGDIPlusBrushData*)m_brush.GetRefData())->GetGDIPlusBrush() , cpoints , n ) ;
+ if ( !m_pen.IsNull() )
+ m_context->DrawLines( ((wxGDIPlusPenData*)m_pen.GetGraphicsData())->GetGDIPlusPen() , cpoints , n ) ;
+ delete[] cpoints;
}
void wxGDIPlusContext::StrokePath( const wxGraphicsPath& path )
{
if (m_antialias == antialias)
return true;
-
+
m_antialias = antialias;
-
+
SmoothingMode antialiasMode;
switch (antialias)
{
{
if ( m_composition == op )
return true;
-
+
m_composition = op;
-
+
if (m_composition == wxCOMPOSITION_DEST)
return true;
void wxGDIPlusContext::EndLayer()
{
// TODO
-}
+}
void wxGDIPlusContext::Rotate( wxDouble angle )
{
RectF layoutRect(0,0, 100000.0f, 100000.0f);
StringFormat strFormat( StringFormat::GenericTypographic() );
- CharacterRange* ranges = new CharacterRange[len] ;
- Region* regions = new Region[len];
- for( size_t i = 0 ; i < len ; ++i)
- {
- ranges[i].First = i ;
- ranges[i].Length = 1 ;
- }
- strFormat.SetMeasurableCharacterRanges(len,ranges);
- strFormat.SetFormatFlags( StringFormatFlagsMeasureTrailingSpaces | strFormat.GetFormatFlags() );
- m_context->MeasureCharacterRanges(ws, -1 , f,layoutRect, &strFormat,1,regions) ;
+ size_t startPosition = 0;
+ size_t remainder = len;
+ const size_t maxSpan = 32;
+ CharacterRange* ranges = new CharacterRange[maxSpan] ;
+ Region* regions = new Region[maxSpan];
- RectF bbox ;
- for ( size_t i = 0 ; i < len ; ++i)
+ while( remainder > 0 )
{
- regions[i].GetBounds(&bbox,m_context);
- widths[i] = bbox.GetRight()-bbox.GetLeft();
+ size_t span = wxMin( maxSpan, remainder );
+
+ for( size_t i = 0 ; i < span ; ++i)
+ {
+ ranges[i].First = 0 ;
+ ranges[i].Length = startPosition+i+1 ;
+ }
+ strFormat.SetMeasurableCharacterRanges(span,ranges);
+ strFormat.SetFormatFlags( StringFormatFlagsMeasureTrailingSpaces | strFormat.GetFormatFlags() );
+ m_context->MeasureCharacterRanges(ws, -1 , f,layoutRect, &strFormat,span,regions) ;
+
+ RectF bbox ;
+ for ( size_t i = 0 ; i < span ; ++i)
+ {
+ regions[i].GetBounds(&bbox,m_context);
+ widths[startPosition+i] = bbox.Width;
+ }
+ remainder -= span;
+ startPosition += span;
}
+
+ delete[] ranges;
+ delete[] regions;
}
bool wxGDIPlusContext::ShouldOffset() const
// 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 );
return wxNullGraphicsBitmap;
}
+wxGraphicsBitmap wxGDIPlusRenderer::CreateBitmapFromNativeBitmap( void *bitmap )
+{
+ ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap);
+ if ( bitmap != NULL )
+ {
+ wxGraphicsBitmap p;
+ p.SetRefData(new wxGDIPlusBitmapData( this , (Bitmap*) bitmap ));
+ return p;
+ }
+ else
+ return wxNullGraphicsBitmap;
+}
+
wxGraphicsBitmap wxGDIPlusRenderer::CreateSubBitmap( const wxGraphicsBitmap &bitmap, wxDouble x, wxDouble y, wxDouble w, wxDouble h )
{
ENSURE_LOADED_OR_RETURN(wxNullGraphicsBitmap);
IMPLEMENT_DYNAMIC_CLASS(wxGDIPlusRendererModule, wxModule)
+// ----------------------------------------------------------------------------
+// wxMSW-specific parts of wxGCDC
+// ----------------------------------------------------------------------------
+
+WXHDC wxGCDC::AcquireHDC()
+{
+ wxGraphicsContext * const gc = GetGraphicsContext();
+ if ( !gc )
+ return NULL;
+
+ Graphics * const g = static_cast<Graphics *>(gc->GetNativeContext());
+ return g ? g->GetHDC() : NULL;
+}
+
+void wxGCDC::ReleaseHDC(WXHDC hdc)
+{
+ if ( !hdc )
+ return;
+
+ wxGraphicsContext * const gc = GetGraphicsContext();
+ wxCHECK_RET( gc, "can't release HDC because there is no wxGraphicsContext" );
+
+ Graphics * const g = static_cast<Graphics *>(gc->GetNativeContext());
+ wxCHECK_RET( g, "can't release HDC because there is no Graphics" );
+
+ g->ReleaseHDC((HDC)hdc);
+}
+
#endif // wxUSE_GRAPHICS_CONTEXT