You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
700 lines
26 KiB
700 lines
26 KiB
/*************************************************************** |
|
* Name: ScaledDC.h |
|
* Purpose: Defines scaled DC class |
|
* Author: Michal Bližňák (michal.bliznak@tiscali.cz) |
|
* Created: 2008-11-7 |
|
* Copyright: Michal Bližňák |
|
* License: wxWidgets license (www.wxwidgets.org) |
|
* Notes: |
|
**************************************************************/ |
|
|
|
#ifndef _WXSFSCALEDDC_H |
|
#define _WXSFSCALEDDC_H |
|
|
|
#include <wx/graphics.h> |
|
#include <wx/dc.h> |
|
#include <math.h> |
|
#include <wx/dcclient.h> |
|
#include <wx/wxsf/Defs.h> |
|
|
|
#if wxVERSION_NUMBER < 2900 |
|
|
|
/*! \brief Class acts as a wrapper for given DC class and provides modified |
|
* drawing functions cooperating with the shape canvas able to draw scaled graphics. |
|
* All drawing operations performed by the shapes should be done via this class otherwise |
|
* the global scalling capabilities provided by the shape canvas wont be available. |
|
* \sa wxSFShapeCanvas |
|
*/ |
|
|
|
|
|
class WXDLLIMPEXP_SF wxSFScaledDC : public wxDC { |
|
|
|
public: |
|
wxSFScaledDC( wxWindowDC* target, double scale ); |
|
virtual ~wxSFScaledDC(); |
|
|
|
// public member data accessors |
|
/*! |
|
* \brief Set the global graphics scale. |
|
* \param scale Scale |
|
*/ |
|
void SetScale(double scale){m_nScale = scale;} |
|
|
|
/** |
|
* \brief Prepare wxGraphicsContext similiarly to PrepareDC() function. |
|
*/ |
|
void PrepareGC(); |
|
/** |
|
* \brief Enable/Disable usage of wxGraphicsContext. |
|
* \param enab Set to TRUE if the wxGraphicsContext should be used for drawing |
|
*/ |
|
static void EnableGC(bool enab){m_fEnableGC = enab;} |
|
|
|
public: |
|
virtual void CalcBoundingBox(wxCoord x, wxCoord y); |
|
virtual bool CanDrawBitmap() const; |
|
virtual bool CanGetTextExtent() const; |
|
virtual void Clear(); |
|
virtual void ComputeScaleAndOrigin(); |
|
virtual void DrawObject(wxDrawObject* drawobject); |
|
virtual void EndDoc(); |
|
virtual void EndPage(); |
|
virtual const wxBrush& GetBackground() const; |
|
virtual int GetBackgroundMode() const; |
|
virtual const wxBrush& GetBrush() const; |
|
virtual wxCoord GetCharHeight() const; |
|
virtual wxCoord GetCharWidth() const; |
|
virtual int GetDepth() const; |
|
virtual const wxFont& GetFont() const; |
|
#ifdef __WXGTK__ |
|
virtual GdkWindow* GetGDKWindow() const; |
|
#endif |
|
virtual wxLayoutDirection GetLayoutDirection() const; |
|
virtual int GetLogicalFunction() const; |
|
virtual void GetLogicalScale(double *x, double *y); |
|
virtual int GetMapMode() const; |
|
virtual void GetMultiLineTextExtent(const wxString& string, wxCoord *width, wxCoord *height, wxCoord *heightLine = NULL, wxFont *font = NULL) const; |
|
virtual wxSize GetPPI() const; |
|
virtual const wxPen& GetPen() const; |
|
virtual wxBitmap GetSelectedBitmap() const; |
|
virtual const wxColour& GetTextBackground() const; |
|
virtual const wxColour& GetTextForeground() const; |
|
virtual void GetUserScale(double *x, double *y) const; |
|
virtual bool IsOk() const; |
|
virtual bool Ok() const; |
|
virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); |
|
virtual void SetBackground(const wxBrush& brush); |
|
virtual void SetBackgroundMode(int mode); |
|
virtual void SetBrush(const wxBrush& brush); |
|
virtual void SetDeviceOrigin(wxCoord x, wxCoord y); |
|
virtual void SetFont(const wxFont& font); |
|
virtual void SetLayoutDirection(wxLayoutDirection dir); |
|
virtual void SetLogicalFunction(int function); |
|
virtual void SetLogicalOrigin( wxCoord x, wxCoord y ); |
|
virtual void SetLogicalScale(double x, double y); |
|
virtual void SetMapMode( int mode ); |
|
virtual void SetPalette(const wxPalette& palette); |
|
virtual void SetPen(const wxPen& pen); |
|
virtual void SetTextBackground(const wxColour& colour); |
|
virtual void SetTextForeground(const wxColour& colour); |
|
virtual void SetUserScale( double x, double y ); |
|
virtual bool StartDoc( const wxString& message ); |
|
virtual void StartPage(); |
|
|
|
protected: |
|
// protected data members |
|
/*! \brief Global graphics scale. */ |
|
double m_nScale; |
|
/*! \brief wxGraphicsContext usage flag. */ |
|
static bool m_fEnableGC; |
|
/*! \brief Pointer to wrapped device context. */ |
|
wxWindowDC *m_pTargetDC; |
|
|
|
#if wxUSE_GRAPHICS_CONTEXT |
|
/*! \brief Pointer to wxGraphicsContext instance. */ |
|
wxGraphicsContext *m_pGC; |
|
#endif |
|
|
|
// protected function |
|
/** |
|
* \brief Scale given value. |
|
* \param val Value to scale |
|
* \return Scaled value |
|
*/ |
|
wxCoord Scale(wxCoord val){return (wxCoord)ceil((double)val*m_nScale);} |
|
|
|
/** |
|
* \brief Initialize wxGraphicsContext. |
|
*/ |
|
void InitGC(); |
|
/** |
|
* \brief Uninitialize wxGraphicsContext. |
|
*/ |
|
void UninitGC(); |
|
|
|
virtual bool DoBlit(wxCoord xdest, wxCoord ydest, wxCoord width, wxCoord height, wxDC *source, wxCoord xsrc, wxCoord ysrc, int rop = wxCOPY, bool useMask = false, wxCoord xsrcMask = wxDefaultCoord, wxCoord ysrcMask = wxDefaultCoord); |
|
virtual void DoCrossHair(wxCoord x, wxCoord y); |
|
virtual void DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc); |
|
virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask = false); |
|
virtual void DoDrawCheckMark(wxCoord x, wxCoord y, wxCoord width, wxCoord height); |
|
virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); |
|
virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, double sa, double ea); |
|
virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); |
|
virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); |
|
virtual void DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset); |
|
virtual void DoDrawPoint(wxCoord x, wxCoord y); |
|
virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle); |
|
virtual void DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int fillStyle = wxODDEVEN_RULE); |
|
virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); |
|
virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, double angle); |
|
virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius); |
|
virtual void DoDrawSpline(wxList *points); |
|
virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); |
|
virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, int style = wxFLOOD_SURFACE); |
|
virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const; |
|
virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const; |
|
virtual void DoGetClippingRegion(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h); |
|
virtual void DoGetDeviceOrigin(wxCoord *x, wxCoord *y) const; |
|
virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const; |
|
virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; |
|
virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const; |
|
virtual void DoGetSize(int *width, int *height) const; |
|
virtual void DoGetSizeMM(int* width, int* height) const; |
|
virtual void DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, wxCoord *descent = NULL, wxCoord *externalLeading = NULL, wxFont *theFont = NULL) const; |
|
virtual void DoGradientFillConcentric(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, const wxPoint& circleCenter); |
|
virtual void DoGradientFillLinear(const wxRect& rect, const wxColour& initialColour, const wxColour& destColour, wxDirection nDirection = wxEAST); |
|
virtual void DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height); |
|
virtual void DoSetClippingRegionAsRegion(const wxRegion& region); |
|
|
|
}; |
|
|
|
#else // ! wxVERSION_NUMBER < 2900 |
|
|
|
#include <wx/dcclient.h> |
|
class WXDLLIMPEXP_SF wxSFScaledDC; |
|
|
|
class wxSFDCImplWrapper : public wxDCImpl |
|
{ |
|
public: |
|
friend class wxSFScaledDC; |
|
|
|
wxSFDCImplWrapper( wxDCImpl *orig, double scale ) : wxDCImpl( orig->GetOwner() ) |
|
{ |
|
m_pOrig = orig; |
|
m_nScale = scale; |
|
} |
|
virtual ~wxSFDCImplWrapper() |
|
{ |
|
} |
|
|
|
wxDC *GetOwner() const { return m_pOrig->GetOwner(); } |
|
|
|
wxWindow* GetWindow() const { return m_pOrig->GetWindow(); } |
|
|
|
virtual bool IsOk() const { return m_pOrig->IsOk(); } |
|
|
|
// query capabilities |
|
|
|
virtual bool CanDrawBitmap() const { return m_pOrig->CanDrawBitmap(); } |
|
virtual bool CanGetTextExtent() const { return m_pOrig->CanGetTextExtent(); } |
|
|
|
// get Cairo context |
|
virtual void* GetCairoContext() const |
|
{ |
|
return m_pOrig->GetCairoContext(); |
|
} |
|
|
|
// query dimension, colour deps, resolution |
|
|
|
virtual void DoGetSize(int *width, int *height) const { m_pOrig->DoGetSize( width, height); } |
|
void GetSize(int *width, int *height) const |
|
{ |
|
DoGetSize(width, height); |
|
return ; |
|
} |
|
|
|
wxSize GetSize() const |
|
{ |
|
int w, h; |
|
DoGetSize(&w, &h); |
|
return wxSize(w, h); |
|
} |
|
|
|
virtual void DoGetSizeMM(int* width, int* height) const { m_pOrig->DoGetSizeMM( width, height); } |
|
|
|
virtual int GetDepth() const { return m_pOrig->GetDepth(); } |
|
virtual wxSize GetPPI() const { return m_pOrig->GetPPI(); } |
|
|
|
// Right-To-Left (RTL) modes |
|
|
|
virtual void SetLayoutDirection(wxLayoutDirection dir) { m_pOrig->SetLayoutDirection( dir ); } |
|
virtual wxLayoutDirection GetLayoutDirection() const { return m_pOrig->GetLayoutDirection(); } |
|
|
|
// page and document |
|
|
|
virtual bool StartDoc(const wxString& message) { return m_pOrig->StartDoc( message ); } |
|
virtual void EndDoc() { return m_pOrig->EndDoc(); } |
|
|
|
virtual void StartPage() { m_pOrig->StartPage(); } |
|
virtual void EndPage() { m_pOrig->EndPage(); } |
|
|
|
// flushing the content of this dc immediately eg onto screen |
|
virtual void Flush() { m_pOrig->Flush(); } |
|
|
|
// bounding box |
|
|
|
virtual void CalcBoundingBox(wxCoord x, wxCoord y) { m_pOrig->CalcBoundingBox( x, y); } |
|
|
|
wxCoord MinX() const { return m_pOrig->MinX(); } |
|
wxCoord MaxX() const { return m_pOrig->MaxX(); } |
|
wxCoord MinY() const { return m_pOrig->MinY(); } |
|
wxCoord MaxY() const { return m_pOrig->MaxY(); } |
|
|
|
// setters and getters |
|
|
|
virtual void SetFont(const wxFont& font) { m_pOrig->SetFont( font ); } |
|
virtual const wxFont& GetFont() const { return m_pOrig->GetFont(); } |
|
|
|
virtual void SetPen(const wxPen& pen) { m_pOrig->SetPen( pen ); } |
|
virtual const wxPen& GetPen() const { return m_pOrig->GetPen(); } |
|
|
|
virtual void SetBrush(const wxBrush& brush) { m_pOrig->SetBrush( brush ); } |
|
virtual const wxBrush& GetBrush() const { return m_pOrig->GetBrush(); } |
|
|
|
virtual void SetBackground(const wxBrush& brush) { m_pOrig->SetBackground( brush ); } |
|
virtual const wxBrush& GetBackground() const { return m_pOrig->GetBackground(); } |
|
|
|
virtual void SetBackgroundMode(int mode) { m_pOrig->SetBackgroundMode( mode ); } |
|
virtual int GetBackgroundMode() const { return m_pOrig->GetBackgroundMode(); } |
|
|
|
virtual void SetTextForeground(const wxColour& colour) { m_pOrig->SetTextForeground( colour ); } |
|
virtual const wxColour& GetTextForeground() const { return m_pOrig->GetTextForeground(); } |
|
|
|
virtual void SetTextBackground(const wxColour& colour) { m_pOrig->SetTextBackground( colour ); } |
|
virtual const wxColour& GetTextBackground() const { return m_pOrig->GetTextBackground(); } |
|
|
|
#if wxUSE_PALETTE |
|
virtual void SetPalette(const wxPalette& palette) { m_pOrig->SetPalette( palette ); } |
|
#endif // wxUSE_PALETTE |
|
|
|
// inherit the DC attributes (font and colours) from the given window |
|
// |
|
// this is called automatically when a window, client or paint DC is |
|
// created |
|
virtual void InheritAttributes(wxWindow *win) { m_pOrig->InheritAttributes( win ); } |
|
|
|
|
|
// logical functions |
|
|
|
virtual void SetLogicalFunction(wxRasterOperationMode function) { m_pOrig->SetLogicalFunction( function ); } |
|
virtual wxRasterOperationMode GetLogicalFunction() const { return m_pOrig->GetLogicalFunction(); } |
|
|
|
// text measurement |
|
|
|
virtual wxCoord GetCharHeight() const { return m_pOrig->GetCharHeight(); } |
|
virtual wxCoord GetCharWidth() const { return m_pOrig->GetCharWidth(); } |
|
virtual void DoGetTextExtent(const wxString& string, |
|
wxCoord *x, wxCoord *y, |
|
wxCoord *descent = NULL, |
|
wxCoord *externalLeading = NULL, |
|
const wxFont *theFont = NULL) const { m_pOrig->DoGetTextExtent( string, x, y, descent, externalLeading, theFont ); } |
|
virtual void GetMultiLineTextExtent(const wxString& string, |
|
wxCoord *width, |
|
wxCoord *height, |
|
wxCoord *heightLine = NULL, |
|
const wxFont *font = NULL) const { m_pOrig->GetMultiLineTextExtent( string, width, height, heightLine, font ); } |
|
virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const { return m_pOrig->DoGetPartialTextExtents( text, widths); } |
|
|
|
// clearing |
|
|
|
virtual void Clear() { m_pOrig->Clear(); } |
|
|
|
// clipping |
|
|
|
virtual void DoSetClippingRegion(wxCoord x, wxCoord y, |
|
wxCoord width, wxCoord height) { m_pOrig->DoSetClippingRegion( x, y, width, height ); } |
|
|
|
// NB: this function works with device coordinates, not the logical ones! |
|
virtual void DoSetDeviceClippingRegion(const wxRegion& region) { m_pOrig->DoSetDeviceClippingRegion( region ); } |
|
|
|
virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, |
|
wxCoord *w, wxCoord *h) const { m_pOrig->DoGetClippingBox( x, y, w, h ); } |
|
|
|
virtual void DestroyClippingRegion() { m_pOrig->DestroyClippingRegion(); } |
|
|
|
|
|
// coordinates conversions and transforms |
|
|
|
virtual wxCoord DeviceToLogicalX(wxCoord x) const { return m_pOrig->DeviceToLogicalX(x); } |
|
virtual wxCoord DeviceToLogicalY(wxCoord y) const { return m_pOrig->DeviceToLogicalY(y); } |
|
virtual wxCoord DeviceToLogicalXRel(wxCoord x) const { return m_pOrig->DeviceToLogicalXRel(x); } |
|
virtual wxCoord DeviceToLogicalYRel(wxCoord y) const { return m_pOrig->DeviceToLogicalYRel(y); } |
|
virtual wxCoord LogicalToDeviceX(wxCoord x) const { return m_pOrig->LogicalToDeviceX(x); } |
|
virtual wxCoord LogicalToDeviceY(wxCoord y) const { return m_pOrig->LogicalToDeviceY(y); } |
|
virtual wxCoord LogicalToDeviceXRel(wxCoord x) const { return m_pOrig->LogicalToDeviceXRel(x); } |
|
virtual wxCoord LogicalToDeviceYRel(wxCoord y) const { return m_pOrig->LogicalToDeviceYRel(y); } |
|
|
|
virtual void SetMapMode(wxMappingMode mode) { m_pOrig->SetMapMode(mode); } |
|
virtual wxMappingMode GetMapMode() const { return m_pOrig->GetMapMode(); } |
|
|
|
virtual void SetUserScale(double x, double y) { m_pOrig->SetUserScale( x, y ); } |
|
virtual void GetUserScale(double *x, double *y) const { m_pOrig->GetUserScale( x, y ); } |
|
|
|
virtual void SetLogicalScale(double x, double y) { m_pOrig->SetLogicalScale( x, y ); } |
|
virtual void GetLogicalScale(double *x, double *y) { m_pOrig->GetLogicalScale( x, y ); } |
|
|
|
virtual void SetLogicalOrigin(wxCoord x, wxCoord y) { m_pOrig->SetLogicalOrigin( x, y ); } |
|
virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const { m_pOrig->DoGetLogicalOrigin( x, y); } |
|
|
|
virtual void SetDeviceOrigin(wxCoord x, wxCoord y) { m_pOrig->SetDeviceOrigin( x, y ); } |
|
virtual void DoGetDeviceOrigin(wxCoord *x, wxCoord *y) const { m_pOrig->DoGetDeviceOrigin( x, y ); } |
|
|
|
virtual void SetDeviceLocalOrigin( wxCoord x, wxCoord y ) { m_pOrig->SetDeviceLocalOrigin( x, y ); } |
|
|
|
virtual void ComputeScaleAndOrigin() { m_pOrig->ComputeScaleAndOrigin(); } |
|
|
|
// this needs to overidden if the axis is inverted |
|
virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp) { m_pOrig->SetAxisOrientation( xLeftRight, yBottomUp); } |
|
|
|
// --------------------------------------------------------- |
|
// the actual drawing API |
|
|
|
virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, |
|
wxFloodFillStyle style = wxFLOOD_SURFACE) |
|
{ |
|
return m_pOrig->DoFloodFill( ScaleCoord(x), ScaleCoord(y), col, style ); |
|
} |
|
|
|
virtual void DoGradientFillLinear(const wxRect& rect, |
|
const wxColour& initialColour, |
|
const wxColour& destColour, |
|
wxDirection nDirection = wxEAST) |
|
{ |
|
m_pOrig->DoGradientFillLinear( wxRect( ScaleInt(rect.x), ScaleInt(rect.y), ScaleInt(rect.width), ScaleInt(rect.height)), |
|
initialColour, destColour, nDirection ); |
|
} |
|
|
|
virtual void DoGradientFillConcentric(const wxRect& rect, |
|
const wxColour& initialColour, |
|
const wxColour& destColour, |
|
const wxPoint& circleCenter) |
|
{ |
|
m_pOrig->DoGradientFillConcentric( wxRect( ScaleInt(rect.x), ScaleInt(rect.y), ScaleInt(rect.width), ScaleInt(rect.height)), |
|
initialColour, destColour, |
|
wxPoint( ScaleInt(circleCenter.x), ScaleInt(circleCenter.y)) ); |
|
} |
|
|
|
virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const |
|
{ |
|
return m_pOrig->DoGetPixel( (wxCoord)ceil((double)x*m_nScale), (wxCoord)ceil((double)y*m_nScale), col ); |
|
} |
|
|
|
virtual void DoDrawPoint(wxCoord x, wxCoord y) |
|
{ |
|
m_pOrig->DoDrawPoint( ScaleCoord(x), ScaleCoord(y) ); |
|
} |
|
virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) |
|
{ |
|
m_pOrig->DoDrawLine( ScaleCoord(x1), ScaleCoord(y1), ScaleCoord(x2), ScaleCoord(y2) ); |
|
} |
|
|
|
virtual void DoDrawArc(wxCoord x1, wxCoord y1, |
|
wxCoord x2, wxCoord y2, |
|
wxCoord xc, wxCoord yc) |
|
{ |
|
m_pOrig->DoDrawArc( ScaleCoord(x1), ScaleCoord(y1), |
|
ScaleCoord(x2), ScaleCoord(y2), |
|
ScaleCoord(xc), ScaleCoord(yc) ); |
|
} |
|
|
|
virtual void DoDrawCheckMark(wxCoord x, wxCoord y, |
|
wxCoord width, wxCoord height) |
|
{ |
|
m_pOrig->DoDrawCheckMark( ScaleCoord(x), ScaleCoord(y), ScaleCoord(width), ScaleCoord(height) ); |
|
} |
|
|
|
virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h, |
|
double sa, double ea) |
|
{ |
|
m_pOrig->DoDrawEllipticArc( ScaleCoord(x), ScaleCoord(y), ScaleCoord(w), ScaleCoord(h), sa, ea ); |
|
} |
|
|
|
virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) |
|
{ |
|
m_pOrig->DoDrawRectangle( ScaleCoord(x), ScaleCoord(y), ScaleCoord(width), ScaleCoord(height) ); |
|
} |
|
|
|
virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, |
|
wxCoord width, wxCoord height, |
|
double radius) |
|
{ |
|
m_pOrig->DoDrawRoundedRectangle( ScaleCoord(x), ScaleCoord(y), ScaleCoord(width), ScaleCoord(height), radius*m_nScale ); |
|
} |
|
|
|
virtual void DoDrawEllipse(wxCoord x, wxCoord y, |
|
wxCoord width, wxCoord height) |
|
{ |
|
m_pOrig->DoDrawEllipse( ScaleCoord(x), ScaleCoord(y), ScaleCoord(width), ScaleCoord(height) ); |
|
} |
|
|
|
virtual void DoCrossHair(wxCoord x, wxCoord y) |
|
{ |
|
m_pOrig->DoCrossHair( ScaleCoord(x), ScaleCoord(y) ); |
|
} |
|
|
|
virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) |
|
{ |
|
m_pOrig->DoDrawIcon( icon, ScaleCoord(x), ScaleCoord(y) ); |
|
} |
|
|
|
virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, |
|
bool useMask = false) |
|
{ |
|
m_pOrig->DoDrawBitmap( bmp, ScaleCoord(x), ScaleCoord(y), useMask ); |
|
} |
|
|
|
virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) |
|
{ |
|
wxFont font = GetFont(); |
|
wxFont prevfont = font; |
|
|
|
if(font != wxNullFont) |
|
{ |
|
font.SetPointSize(int(font.GetPointSize()*m_nScale)); |
|
SetFont(font); |
|
} |
|
|
|
m_pOrig->DoDrawText( text, ScaleCoord(x), ScaleCoord(y) ); |
|
|
|
SetFont(prevfont); |
|
} |
|
|
|
virtual void DoDrawRotatedText(const wxString& text, |
|
wxCoord x, wxCoord y, double angle) |
|
{ |
|
wxFont font = GetFont(); |
|
wxFont prevfont = font; |
|
|
|
if(font != wxNullFont) |
|
{ |
|
font.SetPointSize(int(font.GetPointSize()*m_nScale)); |
|
SetFont(font); |
|
} |
|
|
|
m_pOrig->DoDrawRotatedText( text, ScaleCoord(x), ScaleCoord(y), angle ); |
|
|
|
SetFont(prevfont); |
|
} |
|
|
|
virtual bool DoBlit(wxCoord xdest, wxCoord ydest, |
|
wxCoord width, wxCoord height, |
|
wxDC *source, |
|
wxCoord xsrc, wxCoord ysrc, |
|
wxRasterOperationMode rop = wxCOPY, |
|
bool useMask = false, |
|
wxCoord xsrcMask = wxDefaultCoord, |
|
wxCoord ysrcMask = wxDefaultCoord) |
|
{ |
|
return m_pOrig->DoBlit( ScaleCoord(xdest), ScaleCoord(ydest), |
|
width, height, source, xsrc, ysrc, rop, useMask, xsrcMask, ysrcMask ); |
|
} |
|
|
|
virtual bool DoStretchBlit(wxCoord xdest, wxCoord ydest, |
|
wxCoord dstWidth, wxCoord dstHeight, |
|
wxDC *source, |
|
wxCoord xsrc, wxCoord ysrc, |
|
wxCoord srcWidth, wxCoord srcHeight, |
|
wxRasterOperationMode rop = wxCOPY, |
|
bool useMask = false, |
|
wxCoord xsrcMask = wxDefaultCoord, |
|
wxCoord ysrcMask = wxDefaultCoord) |
|
{ |
|
return m_pOrig->DoStretchBlit( ScaleCoord(xdest), ScaleCoord(ydest), ScaleCoord(dstWidth), ScaleCoord(dstHeight), |
|
source, xsrc, ysrc, srcWidth, srcHeight, rop, useMask, xsrcMask, ysrcMask ); |
|
} |
|
|
|
virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const |
|
{ |
|
return m_pOrig->DoGetAsBitmap( subrect ); |
|
} |
|
|
|
#if wxVERSION_NUMBER < 2905 |
|
virtual void DoDrawLines(int n, wxPoint points[], |
|
#else |
|
virtual void DoDrawLines(int n, const wxPoint points[], |
|
#endif |
|
wxCoord xoffset, wxCoord yoffset ) |
|
{ |
|
wxPoint *updPoints = new wxPoint[n]; |
|
|
|
for(int i = 0; i < n; i++) |
|
{ |
|
(updPoints + i)->x = ScaleInt((points + i)->x); |
|
(updPoints + i)->y = ScaleInt((points + i)->y); |
|
} |
|
|
|
m_pOrig->DoDrawLines( n, updPoints, ScaleCoord(xoffset), ScaleCoord(yoffset) ); |
|
|
|
delete [] updPoints; |
|
} |
|
|
|
virtual void DrawLines(const wxPointList *list, |
|
wxCoord xoffset, wxCoord yoffset ) |
|
{ |
|
int i = 0; |
|
wxPoint *pts = new wxPoint[list->GetCount()]; |
|
|
|
wxPointList::compatibility_iterator node = list->GetFirst(); |
|
while( node ) |
|
{ |
|
*(pts + i) = *node->GetData(); |
|
i++; |
|
node = node->GetNext(); |
|
} |
|
|
|
wxSFDCImplWrapper::DoDrawLines( i, pts, xoffset, yoffset ); |
|
|
|
delete [] pts; |
|
} |
|
|
|
#if wxVERSION_NUMBER < 2905 |
|
virtual void DoDrawPolygon(int n, wxPoint points[], |
|
#else |
|
virtual void DoDrawPolygon(int n, const wxPoint points[], |
|
#endif |
|
wxCoord xoffset, wxCoord yoffset, |
|
wxPolygonFillMode fillStyle = wxODDEVEN_RULE) |
|
{ |
|
wxPoint *updPoints = new wxPoint[n]; |
|
|
|
for(int i = 0; i < n; i++) |
|
{ |
|
(updPoints + i)->x = ScaleInt((points + i)->x); |
|
(updPoints + i)->y = ScaleInt((points + i)->y); |
|
} |
|
|
|
m_pOrig->DoDrawPolygon(n, updPoints, ScaleCoord(xoffset), ScaleCoord(yoffset), fillStyle); |
|
|
|
delete [] updPoints; |
|
} |
|
|
|
virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], |
|
wxCoord xoffset, wxCoord yoffset, |
|
wxPolygonFillMode fillStyle) |
|
{ |
|
int nTotalPoints = 0; |
|
|
|
for(int i = 0; i < n; i++)nTotalPoints += count[i]; |
|
|
|
wxPoint *updPoints = new wxPoint[nTotalPoints]; |
|
|
|
for(int i = 0; i < nTotalPoints; i++) |
|
{ |
|
(updPoints + i)->x = ScaleInt((points + i)->x); |
|
(updPoints + i)->y = ScaleInt((points + i)->y); |
|
} |
|
|
|
m_pOrig->DoDrawPolyPolygon(n, count, updPoints, ScaleCoord(xoffset), ScaleCoord(yoffset), fillStyle); |
|
|
|
delete [] updPoints; |
|
} |
|
|
|
void DrawPolygon(const wxPointList *list, |
|
wxCoord xoffset, wxCoord yoffset, |
|
wxPolygonFillMode fillStyle ) |
|
{ |
|
int i = 0; |
|
wxPoint *pts = new wxPoint[list->GetCount()]; |
|
|
|
wxPointList::compatibility_iterator node = list->GetFirst(); |
|
while( node ) |
|
{ |
|
*(pts + i) = *node->GetData(); |
|
i++; |
|
node = node->GetNext(); |
|
} |
|
|
|
wxSFDCImplWrapper::DoDrawPolygon( i, pts, xoffset, yoffset, fillStyle ); |
|
|
|
delete [] pts; |
|
} |
|
|
|
|
|
#if wxUSE_SPLINES |
|
void DrawSpline(wxCoord x1, wxCoord y1, |
|
wxCoord x2, wxCoord y2, |
|
wxCoord x3, wxCoord y3); |
|
void DrawSpline(int n, wxPoint points[]); |
|
void DrawSpline(const wxPointList *points) { DoDrawSpline(points); } |
|
|
|
virtual void DoDrawSpline(const wxPointList *points) |
|
{ |
|
wxPoint *pPt; |
|
wxPointList updPoints; |
|
|
|
wxPointList::compatibility_iterator node = points->GetFirst(); |
|
while( node ) |
|
{ |
|
pPt = node->GetData(); |
|
updPoints.Append( new wxPoint( ScaleInt(pPt->x), ScaleInt(pPt->y)) ); |
|
node = node->GetNext(); |
|
} |
|
|
|
m_pOrig->DoDrawSpline( &updPoints ); |
|
|
|
updPoints.DeleteContents( true ); |
|
updPoints.Clear(); |
|
} |
|
#endif |
|
|
|
// --------------------------------------------------------- |
|
// wxMemoryDC Impl API |
|
|
|
virtual void DoSelect(const wxBitmap& bmp) { m_pOrig->DoSelect( bmp ); } |
|
|
|
virtual const wxBitmap& GetSelectedBitmap() const { return m_pOrig->GetSelectedBitmap(); } |
|
virtual wxBitmap& GetSelectedBitmap() { return m_pOrig->GetSelectedBitmap(); } |
|
|
|
// --------------------------------------------------------- |
|
// wxPrinterDC Impl API |
|
|
|
virtual wxRect GetPaperRect() const { return m_pOrig->GetPaperRect(); } |
|
|
|
virtual int GetResolution() const { return m_pOrig->GetResolution(); } |
|
|
|
protected: |
|
/*! \brief Pointer to original DC implementation. */ |
|
wxDCImpl *m_pOrig; |
|
/*! \brief Global graphics scale. */ |
|
double m_nScale; |
|
|
|
/** |
|
* \brief Scale given value. |
|
* \param val Value to scale |
|
* \return Scaled value |
|
*/ |
|
wxCoord ScaleCoord(wxCoord val){return (wxCoord)ceil((double)val*m_nScale);} |
|
|
|
/** |
|
* \brief Scale given value. |
|
* \param val Value to scale |
|
* \return Scaled value |
|
*/ |
|
wxCoord ScaleInt(int val){return (int)ceil((double)val*m_nScale);} |
|
}; |
|
|
|
/*! \brief Class acts as a wrapper for given DC class and provides modified |
|
* drawing functions cooperating with the shape canvas able to draw scaled graphics. |
|
* All drawing operations performed by the shapes should be done via this class otherwise |
|
* the global scalling capabilities provided by the shape canvas wont be available. |
|
* \sa wxSFShapeCanvas |
|
*/ |
|
class WXDLLIMPEXP_SF wxSFScaledDC : public wxDC { |
|
|
|
public: |
|
wxSFScaledDC( wxWindowDC* target, double scale ); |
|
virtual ~wxSFScaledDC(); |
|
}; |
|
#endif // wxVERSION_NUMBER < 2900 |
|
|
|
#endif // _WXSFSCALEDDC_H
|
|
|