+ // page and document
+
+ virtual bool StartDoc(const wxString& WXUNUSED(message)) { return true; }
+ virtual void EndDoc() { }
+
+ virtual void StartPage() { }
+ virtual void EndPage() { }
+
+ // flushing the content of this dc immediately eg onto screen
+ virtual void Flush() { }
+
+ // bounding box
+
+ virtual void CalcBoundingBox(wxCoord x, wxCoord y)
+ {
+ if ( m_isBBoxValid )
+ {
+ if ( x < m_minX ) m_minX = x;
+ if ( y < m_minY ) m_minY = y;
+ if ( x > m_maxX ) m_maxX = x;
+ if ( y > m_maxY ) m_maxY = y;
+ }
+ else
+ {
+ m_isBBoxValid = true;
+
+ m_minX = x;
+ m_minY = y;
+ m_maxX = x;
+ m_maxY = y;
+ }
+ }
+ void ResetBoundingBox()
+ {
+ m_isBBoxValid = false;
+
+ m_minX = m_maxX = m_minY = m_maxY = 0;
+ }
+
+ wxCoord MinX() const { return m_minX; }
+ wxCoord MaxX() const { return m_maxX; }
+ wxCoord MinY() const { return m_minY; }
+ wxCoord MaxY() const { return m_maxY; }
+
+ // setters and getters
+
+ virtual void SetFont(const wxFont& font) = 0;
+ virtual const wxFont& GetFont() const { return m_font; }
+
+ virtual void SetPen(const wxPen& pen) = 0;
+ virtual const wxPen& GetPen() const { return m_pen; }
+
+ virtual void SetBrush(const wxBrush& brush) = 0;
+ virtual const wxBrush& GetBrush() const { return m_brush; }
+
+ virtual void SetBackground(const wxBrush& brush) = 0;
+ virtual const wxBrush& GetBackground() const { return m_backgroundBrush; }
+
+ virtual void SetBackgroundMode(int mode) = 0;
+ virtual int GetBackgroundMode() const { return m_backgroundMode; }
+
+ virtual void SetTextForeground(const wxColour& colour)
+ { m_textForegroundColour = colour; }
+ virtual const wxColour& GetTextForeground() const
+ { return m_textForegroundColour; }
+
+ virtual void SetTextBackground(const wxColour& colour)
+ { m_textBackgroundColour = colour; }
+ virtual const wxColour& GetTextBackground() const
+ { return m_textBackgroundColour; }
+
+#if wxUSE_PALETTE
+ virtual void SetPalette(const wxPalette& palette) = 0;
+#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);
+
+
+ // logical functions
+
+ virtual void SetLogicalFunction(wxRasterOperationMode function) = 0;
+ virtual wxRasterOperationMode GetLogicalFunction() const
+ { return m_logicalFunction; }
+
+ // text measurement
+
+ virtual wxCoord GetCharHeight() const = 0;
+ virtual wxCoord GetCharWidth() const = 0;
+ virtual void DoGetTextExtent(const wxString& string,
+ wxCoord *x, wxCoord *y,
+ wxCoord *descent = NULL,
+ wxCoord *externalLeading = NULL,
+ const wxFont *theFont = NULL) const = 0;
+ virtual void GetMultiLineTextExtent(const wxString& string,
+ wxCoord *width,
+ wxCoord *height,
+ wxCoord *heightLine = NULL,
+ const wxFont *font = NULL) const;
+ virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const;
+
+ // clearing
+
+ virtual void Clear() = 0;
+
+ // clipping
+
+ virtual void DoSetClippingRegion(wxCoord x, wxCoord y,
+ wxCoord width, wxCoord height) = 0;
+
+ // NB: this function works with device coordinates, not the logical ones!
+ virtual void DoSetDeviceClippingRegion(const wxRegion& region) = 0;
+
+ virtual void DoGetClippingBox(wxCoord *x, wxCoord *y,
+ wxCoord *w, wxCoord *h) const
+ {
+ if ( x )
+ *x = m_clipX1;
+ if ( y )
+ *y = m_clipY1;
+ if ( w )
+ *w = m_clipX2 - m_clipX1;
+ if ( h )
+ *h = m_clipY2 - m_clipY1;
+ }
+
+ virtual void DestroyClippingRegion() { ResetClipping(); }
+
+
+ // coordinates conversions and transforms
+
+ virtual wxCoord DeviceToLogicalX(wxCoord x) const;
+ virtual wxCoord DeviceToLogicalY(wxCoord y) const;
+ virtual wxCoord DeviceToLogicalXRel(wxCoord x) const;
+ virtual wxCoord DeviceToLogicalYRel(wxCoord y) const;
+ virtual wxCoord LogicalToDeviceX(wxCoord x) const;
+ virtual wxCoord LogicalToDeviceY(wxCoord y) const;
+ virtual wxCoord LogicalToDeviceXRel(wxCoord x) const;
+ virtual wxCoord LogicalToDeviceYRel(wxCoord y) const;
+
+ virtual void SetMapMode(wxMappingMode mode);
+ virtual wxMappingMode GetMapMode() const { return m_mappingMode; }
+
+ virtual void SetUserScale(double x, double y);
+ virtual void GetUserScale(double *x, double *y) const
+ {
+ if ( x ) *x = m_userScaleX;
+ if ( y ) *y = m_userScaleY;
+ }
+
+ virtual void SetLogicalScale(double x, double y);
+ virtual void GetLogicalScale(double *x, double *y)
+ {
+ if ( x ) *x = m_logicalScaleX;
+ if ( y ) *y = m_logicalScaleY;
+ }
+
+ virtual void SetLogicalOrigin(wxCoord x, wxCoord y);
+ virtual void DoGetLogicalOrigin(wxCoord *x, wxCoord *y) const
+ {
+ if ( x ) *x = m_logicalOriginX;
+ if ( y ) *y = m_logicalOriginY;
+ }
+
+ virtual void SetDeviceOrigin(wxCoord x, wxCoord y);
+ virtual void DoGetDeviceOrigin(wxCoord *x, wxCoord *y) const
+ {
+ if ( x ) *x = m_deviceOriginX;
+ if ( y ) *y = m_deviceOriginY;
+ }
+
+ virtual void SetDeviceLocalOrigin( wxCoord x, wxCoord y );
+
+ virtual void ComputeScaleAndOrigin();
+
+ // this needs to overidden if the axis is inverted
+ virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp);
+
+ // ---------------------------------------------------------
+ // the actual drawing API
+
+ virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col,
+ wxFloodFillStyle style = wxFLOOD_SURFACE) = 0;
+
+ virtual void DoGradientFillLinear(const wxRect& rect,
+ const wxColour& initialColour,
+ const wxColour& destColour,
+ wxDirection nDirection = wxEAST);
+
+ virtual void DoGradientFillConcentric(const wxRect& rect,
+ const wxColour& initialColour,
+ const wxColour& destColour,
+ const wxPoint& circleCenter);
+
+ virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const = 0;
+
+ virtual void DoDrawPoint(wxCoord x, wxCoord y) = 0;
+ virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2) = 0;
+
+ virtual void DoDrawArc(wxCoord x1, wxCoord y1,
+ wxCoord x2, wxCoord y2,
+ wxCoord xc, wxCoord yc) = 0;
+ virtual void DoDrawCheckMark(wxCoord x, wxCoord y,
+ wxCoord width, wxCoord height);
+ virtual void DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord h,
+ double sa, double ea) = 0;
+
+ virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) = 0;
+ virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y,
+ wxCoord width, wxCoord height,
+ double radius) = 0;
+ virtual void DoDrawEllipse(wxCoord x, wxCoord y,
+ wxCoord width, wxCoord height) = 0;
+
+ virtual void DoCrossHair(wxCoord x, wxCoord y) = 0;
+
+ virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y) = 0;
+ virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y,
+ bool useMask = false) = 0;
+
+ virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y) = 0;
+ virtual void DoDrawRotatedText(const wxString& text,
+ wxCoord x, wxCoord y, double angle) = 0;
+
+ 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) = 0;
+
+ 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);
+
+ virtual wxBitmap DoGetAsBitmap(const wxRect *WXUNUSED(subrect)) const
+ { return wxNullBitmap; }
+
+
+ virtual void DoDrawLines(int n, wxPoint points[],
+ wxCoord xoffset, wxCoord yoffset ) = 0;
+ virtual void DrawLines(const wxPointList *list,
+ wxCoord xoffset, wxCoord yoffset );
+
+ virtual void DoDrawPolygon(int n, wxPoint points[],
+ wxCoord xoffset, wxCoord yoffset,
+ wxPolygonFillMode fillStyle = wxODDEVEN_RULE) = 0;
+ virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[],
+ wxCoord xoffset, wxCoord yoffset,
+ wxPolygonFillMode fillStyle);
+ void DrawPolygon(const wxPointList *list,
+ wxCoord xoffset, wxCoord yoffset,
+ wxPolygonFillMode fillStyle );
+
+
+#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);
+#endif
+
+ // ---------------------------------------------------------
+ // wxMemoryDC Impl API
+
+ virtual void DoSelect(const wxBitmap& WXUNUSED(bmp))
+ { }
+
+ virtual const wxBitmap& GetSelectedBitmap() const
+ { return wxNullBitmap; }
+ virtual wxBitmap& GetSelectedBitmap()
+ { return wxNullBitmap; }
+
+ // ---------------------------------------------------------
+ // wxPrinterDC Impl API
+
+ virtual wxRect GetPaperRect() const
+ { int w = 0; int h = 0; DoGetSize( &w, &h ); return wxRect(0,0,w,h); }
+
+ virtual int GetResolution() const
+ { return -1; }
+
+private:
+ wxDC *m_owner;
+
+protected:
+ // unset clipping variables (after clipping region was destroyed)
+ void ResetClipping()
+ {
+ m_clipping = false;
+
+ m_clipX1 = m_clipX2 = m_clipY1 = m_clipY2 = 0;
+ }
+
+#ifdef __WXWINCE__
+ //! Generic method to draw ellipses, circles and arcs with current pen and brush.
+ /*! \param x Upper left corner of bounding box.
+ * \param y Upper left corner of bounding box.
+ * \param w Width of bounding box.
+ * \param h Height of bounding box.
+ * \param sa Starting angle of arc
+ * (counterclockwise, start at 3 o'clock, 360 is full circle).
+ * \param ea Ending angle of arc.
+ * \param angle Rotation angle, the Arc will be rotated after
+ * calculating begin and end.
+ */
+ void DrawEllipticArcRot( wxCoord x, wxCoord y,
+ wxCoord width, wxCoord height,
+ double sa = 0, double ea = 0, double angle = 0 )
+ { DoDrawEllipticArcRot( x, y, width, height, sa, ea, angle ); }
+
+ void DrawEllipticArcRot( const wxPoint& pt,
+ const wxSize& sz,
+ double sa = 0, double ea = 0, double angle = 0 )
+ { DoDrawEllipticArcRot( pt.x, pt.y, sz.x, sz.y, sa, ea, angle ); }
+
+ void DrawEllipticArcRot( const wxRect& rect,
+ double sa = 0, double ea = 0, double angle = 0 )
+ { DoDrawEllipticArcRot( rect.x, rect.y, rect.width, rect.height, sa, ea, angle ); }
+
+ virtual void DoDrawEllipticArcRot( wxCoord x, wxCoord y,
+ wxCoord w, wxCoord h,
+ double sa = 0, double ea = 0, double angle = 0 );
+
+ //! Rotates points around center.
+ /*! This is a quite straight method, it calculates in pixels
+ * and so it produces rounding errors.
+ * \param points The points inside will be rotated.
+ * \param angle Rotating angle (counterclockwise, start at 3 o'clock, 360 is full circle).
+ * \param center Center of rotation.
+ */
+ void Rotate( wxPointList* points, double angle, wxPoint center = wxPoint(0,0) );
+
+ // used by DrawEllipticArcRot
+ // Careful: wxList gets filled with points you have to delete later.
+ void CalculateEllipticPoints( wxPointList* points,
+ wxCoord xStart, wxCoord yStart,
+ wxCoord w, wxCoord h,
+ double sa, double ea );
+#endif // __WXWINCE__
+
+ // returns adjustment factor for converting wxFont "point size"; in wx
+ // it is point size on screen and needs to be multiplied by this value
+ // for rendering on higher-resolution DCs such as printer ones
+ static float GetFontPointSizeAdjustment(float dpi);
+
+ // window on which the DC draws or NULL
+ wxWindow *m_window;
+
+ // flags
+ bool m_colour:1;
+ bool m_ok:1;
+ bool m_clipping:1;
+ bool m_isInteractive:1;
+ bool m_isBBoxValid:1;
+
+ // coordinate system variables
+
+ wxCoord m_logicalOriginX, m_logicalOriginY;
+ wxCoord m_deviceOriginX, m_deviceOriginY; // Usually 0,0, can be change by user
+
+ wxCoord m_deviceLocalOriginX, m_deviceLocalOriginY; // non-zero if native top-left corner
+ // is not at 0,0. This was the case under
+ // Mac's GrafPorts (coordinate system
+ // used toplevel window's origin) and
+ // e.g. for Postscript, where the native
+ // origin in the bottom left corner.
+ double m_logicalScaleX, m_logicalScaleY;
+ double m_userScaleX, m_userScaleY;
+ double m_scaleX, m_scaleY; // calculated from logical scale and user scale
+
+ int m_signX, m_signY; // Used by SetAxisOrientation() to invert the axes
+
+ // what is a mm on a screen you don't know the size of?
+ double m_mm_to_pix_x,
+ m_mm_to_pix_y;
+
+ // bounding and clipping boxes
+ wxCoord m_minX, m_minY, m_maxX, m_maxY;
+ wxCoord m_clipX1, m_clipY1, m_clipX2, m_clipY2;
+
+ wxRasterOperationMode m_logicalFunction;
+ int m_backgroundMode;
+ wxMappingMode m_mappingMode;
+
+ wxPen m_pen;
+ wxBrush m_brush;
+ wxBrush m_backgroundBrush;
+ wxColour m_textForegroundColour;
+ wxColour m_textBackgroundColour;
+ wxFont m_font;
+
+#if wxUSE_PALETTE
+ wxPalette m_palette;
+ bool m_hasCustomPalette;
+#endif // wxUSE_PALETTE
+
+private:
+ DECLARE_ABSTRACT_CLASS(wxDCImpl)
+};
+
+
+class WXDLLIMPEXP_CORE wxDC : public wxObject
+{
+public:
+ // copy attributes (font, colours and writing direction) from another DC
+ void CopyAttributes(const wxDC& dc);
+
+ virtual ~wxDC() { delete m_pimpl; }
+
+ wxDCImpl *GetImpl()
+ { return m_pimpl; }
+ const wxDCImpl *GetImpl() const
+ { return m_pimpl; }
+
+ wxWindow *GetWindow() const
+ { return m_pimpl->GetWindow(); }
+
+ bool IsOk() const
+ { return m_pimpl && m_pimpl->IsOk(); }
+
+ // query capabilities
+
+ bool CanDrawBitmap() const
+ { return m_pimpl->CanDrawBitmap(); }
+ bool CanGetTextExtent() const
+ { return m_pimpl->CanGetTextExtent(); }
+
+ // query dimension, colour deps, resolution
+
+ void GetSize(int *width, int *height) const
+ { m_pimpl->DoGetSize(width, height); }
+ wxSize GetSize() const
+ { return m_pimpl->GetSize(); }
+
+ void GetSizeMM(int* width, int* height) const
+ { m_pimpl->DoGetSizeMM(width, height); }
+ wxSize GetSizeMM() const
+ {
+ int w, h;
+ m_pimpl->DoGetSizeMM(&w, &h);
+ return wxSize(w, h);
+ }
+
+ int GetDepth() const
+ { return m_pimpl->GetDepth(); }
+ wxSize GetPPI() const
+ { return m_pimpl->GetPPI(); }
+
+ virtual int GetResolution() const
+ { return m_pimpl->GetResolution(); }
+
+ // Right-To-Left (RTL) modes
+
+ void SetLayoutDirection(wxLayoutDirection dir)
+ { m_pimpl->SetLayoutDirection( dir ); }
+ wxLayoutDirection GetLayoutDirection() const
+ { return m_pimpl->GetLayoutDirection(); }
+
+ // page and document
+
+ bool StartDoc(const wxString& message)
+ { return m_pimpl->StartDoc(message); }
+ void EndDoc()
+ { m_pimpl->EndDoc(); }
+
+ void StartPage()
+ { m_pimpl->StartPage(); }
+ void EndPage()
+ { m_pimpl->EndPage(); }
+
+ // bounding box
+
+ void CalcBoundingBox(wxCoord x, wxCoord y)
+ { m_pimpl->CalcBoundingBox(x,y); }
+ void ResetBoundingBox()
+ { m_pimpl->ResetBoundingBox(); }
+
+ wxCoord MinX() const
+ { return m_pimpl->MinX(); }
+ wxCoord MaxX() const
+ { return m_pimpl->MaxX(); }
+ wxCoord MinY() const
+ { return m_pimpl->MinY(); }
+ wxCoord MaxY() const
+ { return m_pimpl->MaxY(); }
+
+ // setters and getters
+
+ void SetFont(const wxFont& font)
+ { m_pimpl->SetFont( font ); }
+ const wxFont& GetFont() const
+ { return m_pimpl->GetFont(); }
+
+ void SetPen(const wxPen& pen)
+ { m_pimpl->SetPen( pen ); }
+ const wxPen& GetPen() const
+ { return m_pimpl->GetPen(); }
+
+ void SetBrush(const wxBrush& brush)
+ { m_pimpl->SetBrush( brush ); }
+ const wxBrush& GetBrush() const
+ { return m_pimpl->GetBrush(); }
+
+ void SetBackground(const wxBrush& brush)
+ { m_pimpl->SetBackground( brush ); }
+ const wxBrush& GetBackground() const
+ { return m_pimpl->GetBackground(); }
+
+ void SetBackgroundMode(int mode)
+ { m_pimpl->SetBackgroundMode( mode ); }
+ int GetBackgroundMode() const
+ { return m_pimpl->GetBackgroundMode(); }
+
+ void SetTextForeground(const wxColour& colour)
+ { m_pimpl->SetTextForeground(colour); }
+ const wxColour& GetTextForeground() const
+ { return m_pimpl->GetTextForeground(); }
+
+ void SetTextBackground(const wxColour& colour)
+ { m_pimpl->SetTextBackground(colour); }
+ const wxColour& GetTextBackground() const
+ { return m_pimpl->GetTextBackground(); }
+
+#if wxUSE_PALETTE
+ void SetPalette(const wxPalette& palette)
+ { m_pimpl->SetPalette(palette); }
+#endif // wxUSE_PALETTE
+
+ // logical functions
+
+ void SetLogicalFunction(wxRasterOperationMode function)
+ { m_pimpl->SetLogicalFunction(function); }
+ wxRasterOperationMode GetLogicalFunction() const
+ { return m_pimpl->GetLogicalFunction(); }
+
+ // text measurement
+
+ wxCoord GetCharHeight() const
+ { return m_pimpl->GetCharHeight(); }
+ wxCoord GetCharWidth() const
+ { return m_pimpl->GetCharWidth(); }
+
+ void GetTextExtent(const wxString& string,
+ wxCoord *x, wxCoord *y,
+ wxCoord *descent = NULL,
+ wxCoord *externalLeading = NULL,
+ const wxFont *theFont = NULL) const
+ { m_pimpl->DoGetTextExtent(string, x, y, descent, externalLeading, theFont); }
+
+ wxSize GetTextExtent(const wxString& string) const
+ {
+ wxCoord w, h;
+ m_pimpl->DoGetTextExtent(string, &w, &h);
+ return wxSize(w, h);
+ }
+
+ void GetMultiLineTextExtent(const wxString& string,
+ wxCoord *width,
+ wxCoord *height,
+ wxCoord *heightLine = NULL,
+ const wxFont *font = NULL) const
+ { m_pimpl->GetMultiLineTextExtent( string, width, height, heightLine, font ); }
+
+ wxSize GetMultiLineTextExtent(const wxString& string) const
+ {
+ wxCoord w, h;
+ m_pimpl->GetMultiLineTextExtent(string, &w, &h);
+ return wxSize(w, h);
+ }
+
+ bool GetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
+ { return m_pimpl->DoGetPartialTextExtents(text, widths); }
+
+ // clearing
+
+ void Clear()
+ { m_pimpl->Clear(); }
+
+ // clipping
+
+ void SetClippingRegion(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
+ { m_pimpl->DoSetClippingRegion(x, y, width, height); }
+ void SetClippingRegion(const wxPoint& pt, const wxSize& sz)
+ { m_pimpl->DoSetClippingRegion(pt.x, pt.y, sz.x, sz.y); }
+ void SetClippingRegion(const wxRect& rect)
+ { m_pimpl->DoSetClippingRegion(rect.x, rect.y, rect.width, rect.height); }
+
+ // unlike the functions above, the coordinates of the region used in this
+ // one are in device coordinates, not the logical ones
+ void SetDeviceClippingRegion(const wxRegion& region)
+ { m_pimpl->DoSetDeviceClippingRegion(region); }
+
+ // this function is deprecated because its name is confusing: you may
+ // expect it to work with logical coordinates but, in fact, it does exactly
+ // the same thing as SetDeviceClippingRegion()
+ //
+ // please review the code using it and either replace it with calls to
+ // SetDeviceClippingRegion() or correct it if it was [wrongly] passing
+ // logical coordinates to this function
+ wxDEPRECATED_INLINE(void SetClippingRegion(const wxRegion& region),
+ SetDeviceClippingRegion(region); )
+
+ void DestroyClippingRegion()
+ { m_pimpl->DestroyClippingRegion(); }
+
+ void GetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const
+ { m_pimpl->DoGetClippingBox(x, y, w, h); }
+ void GetClippingBox(wxRect& rect) const
+ { m_pimpl->DoGetClippingBox(&rect.x, &rect.y, &rect.width, &rect.height); }
+
+ // coordinates conversions and transforms
+
+ wxCoord DeviceToLogicalX(wxCoord x) const
+ { return m_pimpl->DeviceToLogicalX(x); }
+ wxCoord DeviceToLogicalY(wxCoord y) const
+ { return m_pimpl->DeviceToLogicalY(y); }
+ wxCoord DeviceToLogicalXRel(wxCoord x) const
+ { return m_pimpl->DeviceToLogicalXRel(x); }
+ wxCoord DeviceToLogicalYRel(wxCoord y) const
+ { return m_pimpl->DeviceToLogicalYRel(y); }
+ wxCoord LogicalToDeviceX(wxCoord x) const
+ { return m_pimpl->LogicalToDeviceX(x); }
+ wxCoord LogicalToDeviceY(wxCoord y) const
+ { return m_pimpl->LogicalToDeviceY(y); }
+ wxCoord LogicalToDeviceXRel(wxCoord x) const
+ { return m_pimpl->LogicalToDeviceXRel(x); }
+ wxCoord LogicalToDeviceYRel(wxCoord y) const
+ { return m_pimpl->LogicalToDeviceYRel(y); }
+
+ void SetMapMode(wxMappingMode mode)
+ { m_pimpl->SetMapMode(mode); }
+ wxMappingMode GetMapMode() const
+ { return m_pimpl->GetMapMode(); }
+
+ void SetUserScale(double x, double y)
+ { m_pimpl->SetUserScale(x,y); }
+ void GetUserScale(double *x, double *y) const
+ { m_pimpl->GetUserScale( x, y ); }
+
+ void SetLogicalScale(double x, double y)
+ { m_pimpl->SetLogicalScale( x, y ); }
+ void GetLogicalScale(double *x, double *y)
+ { m_pimpl->GetLogicalScale( x, y ); }
+
+ void SetLogicalOrigin(wxCoord x, wxCoord y)
+ { m_pimpl->SetLogicalOrigin(x,y); }
+ void GetLogicalOrigin(wxCoord *x, wxCoord *y) const
+ { m_pimpl->DoGetLogicalOrigin(x, y); }
+ wxPoint GetLogicalOrigin() const
+ { wxCoord x, y; m_pimpl->DoGetLogicalOrigin(&x, &y); return wxPoint(x, y); }