X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2bda0e173844e8e0f8acf4e8ad8b5c26e5c6fe5d..5c836c463a8ece980b66ebc9920f1b045d9a8f33:/include/wx/msw/dc.h diff --git a/include/wx/msw/dc.h b/include/wx/msw/dc.h index b0c49d268f..045299277b 100644 --- a/include/wx/msw/dc.h +++ b/include/wx/msw/dc.h @@ -5,337 +5,271 @@ // Modified by: // Created: 01/02/97 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifndef __DCH__ -#define __DCH__ +#ifndef _WX_DC_H_ +#define _WX_DC_H_ -#ifdef __GNUG__ -#pragma interface "dc.h" +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) + #pragma interface "dc.h" #endif -#include "wx/pen.h" -#include "wx/brush.h" -#include "wx/icon.h" -#include "wx/font.h" -#include "wx/gdicmn.h" +#include "wx/defs.h" -class WXDLLEXPORT wxDC: public wxObject +// --------------------------------------------------------------------------- +// macros +// --------------------------------------------------------------------------- + +#if wxUSE_DC_CACHEING +/* + * Cached blitting, maintaining a cache + * of bitmaps required for transparent blitting + * instead of constant creation/deletion + */ + +class wxDCCacheEntry: public wxObject { - DECLARE_ABSTRACT_CLASS(wxDC) - protected: public: - wxDC(void); - ~wxDC(void); - - inline void wxDC::BeginDrawing(void) {} - inline void wxDC::EndDrawing(void) {} - - virtual void FloodFill(long x1, long y1, wxColour *col, int style=wxFLOOD_SURFACE) ; - virtual bool GetPixel(long x1, long y1, wxColour *col) const ; - - virtual void DrawLine(long x1, long y1, long x2, long y2); - virtual void CrossHair(long x, long y) ; - virtual void DrawArc(long x1,long y1,long x2,long y2,double xc, double yc); - virtual void DrawEllipticArc (long x, long y, long w, long h, double sa, double ea); - virtual void DrawPoint(long x, long y); - - virtual void DrawLines(int n, wxPoint points[], long xoffset = 0, long yoffset = 0); - - virtual void DrawPolygon(int n, wxPoint points[], long xoffset = 0, long yoffset = 0, int fillStyle=wxODDEVEN_RULE); - - virtual void DrawRectangle(long x, long y, long width, long height); - virtual void DrawRoundedRectangle(long x, long y, long width, long height, double radius = 20.0); - virtual void DrawEllipse(long x, long y, long width, long height); - - virtual void DrawIcon(const wxIcon& icon, long x, long y); - - virtual void Clear(void); - virtual void SetFont(const wxFont& font); - virtual void SetPen(const wxPen& pen); - virtual void SetBrush(const wxBrush& brush); - virtual void SetLogicalFunction(int function); - virtual void SetBackground(const wxBrush& brush); - virtual void SetBackgroundMode(int mode); - virtual void SetClippingRegion(long x, long y, long width, long height); - virtual void SetPalette(const wxPalette& palette); -#if WXWIN_COMPATIBILITY - virtual inline void SetColourMap(const wxPalette& palette) { SetPalette(palette); }; -#endif - virtual void DestroyClippingRegion(void); - virtual void DrawText(const wxString& text, long x, long y, bool use16bit = FALSE); - - virtual long GetCharHeight(void) const; - virtual long GetCharWidth(void) const; - virtual void GetTextExtent(const wxString& string, long *x, long *y, - long *descent = NULL, long *externalLeading = NULL, - wxFont *theFont = NULL, bool use16bit = FALSE) const; -#if WXWIN_COMPATIBILITY - void GetTextExtent(const wxString& string, float *x, float *y, - float *descent = NULL, float *externalLeading = NULL, - wxFont *theFont = NULL, bool use16bit = FALSE) const ; + wxDCCacheEntry(WXHBITMAP hBitmap, int w, int h, int depth); + wxDCCacheEntry(WXHDC hDC, int depth); + ~wxDCCacheEntry(); + + WXHBITMAP m_bitmap; + WXHDC m_dc; + int m_width; + int m_height; + int m_depth; +}; #endif - // Size in device units - virtual void GetSize(int* width, int* height) const; - inline wxSize GetSize(void) const { int w, h; GetSize(&w, &h); return wxSize(w, h); } - - // Size in mm - virtual void GetSizeMM(long* width, long* height) const ; - - // Compatibility -#if WXWIN_COMPATIBILITY - inline void GetSize(float* width, float* height) const { int w, h; GetSize(& w, & h); *width = w; *height = h; } - inline void GetSizeMM(float *width, float *height) const { long w, h; GetSizeMM(& w, & h); *width = (float) w; *height = (float) h; } +class WXDLLEXPORT wxDC : public wxDCBase +{ +public: + wxDC(); + ~wxDC(); + + // implement base class pure virtuals + // ---------------------------------- + + virtual void Clear(); + + virtual bool StartDoc(const wxString& message); + virtual void EndDoc(); + + virtual void StartPage(); + virtual void EndPage(); + + virtual void SetFont(const wxFont& font); + virtual void SetPen(const wxPen& pen); + virtual void SetBrush(const wxBrush& brush); + virtual void SetBackground(const wxBrush& brush); + virtual void SetBackgroundMode(int mode); +#if wxUSE_PALETTE + virtual void SetPalette(const wxPalette& palette); +#endif // wxUSE_PALETTE + + virtual void DestroyClippingRegion(); + + virtual wxCoord GetCharHeight() const; + virtual wxCoord GetCharWidth() const; + virtual void DoGetTextExtent(const wxString& string, + wxCoord *x, wxCoord *y, + wxCoord *descent = NULL, + wxCoord *externalLeading = NULL, + wxFont *theFont = NULL) const; + virtual bool DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const; + + virtual bool CanDrawBitmap() const; + virtual bool CanGetTextExtent() const; + virtual int GetDepth() const; + virtual wxSize GetPPI() const; + + virtual void SetMapMode(int mode); + virtual void SetUserScale(double x, double y); + virtual void SetSystemScale(double x, double y); + virtual void SetLogicalScale(double x, double y); + virtual void SetLogicalOrigin(wxCoord x, wxCoord y); + virtual void SetDeviceOrigin(wxCoord x, wxCoord y); + virtual void SetAxisOrientation(bool xLeftRight, bool yBottomUp); + virtual void SetLogicalFunction(int function); + + // implementation from now on + // -------------------------- + + virtual void SetRop(WXHDC cdc); + virtual void SelectOldObjects(WXHDC dc); + + wxWindow *GetWindow() const { return m_canvas; } + void SetWindow(wxWindow *win) + { + m_canvas = win; + +#if wxUSE_PALETTE + // if we have palettes use the correct one for this window + InitializePalette(); +#endif // wxUSE_PALETTE + } + + WXHDC GetHDC() const { return m_hDC; } + void SetHDC(WXHDC dc, bool bOwnsDC = false) + { + m_hDC = dc; + m_bOwnsDC = bOwnsDC; + + // we might have a pre existing clipping region, make sure that we + // return it if asked -- but avoid calling ::GetClipBox() right now as + // it could be unnecessary wasteful + m_clipping = true; + m_clipX1 = + m_clipX2 = 0; + } + + const wxBitmap& GetSelectedBitmap() const { return m_selectedBitmap; } + wxBitmap& GetSelectedBitmap() { return m_selectedBitmap; } + + // update the internal clip box variables + void UpdateClipBox(); + +#if wxUSE_DC_CACHEING + static wxDCCacheEntry* FindBitmapInCache(WXHDC hDC, int w, int h); + static wxDCCacheEntry* FindDCInCache(wxDCCacheEntry* notThis, WXHDC hDC); + + static void AddToBitmapCache(wxDCCacheEntry* entry); + static void AddToDCCache(wxDCCacheEntry* entry); + static void ClearCache(); #endif - virtual bool StartDoc(const wxString& message); - virtual void EndDoc(void); - virtual void StartPage(void); - virtual void EndPage(void); - virtual void SetMapMode(int mode); - virtual void SetUserScale(double x, double y); - virtual void SetSystemScale(double x, double y); - virtual void SetLogicalOrigin(long x, long y); - virtual void SetDeviceOrigin(long x, long y); - - // This group of functions does actual conversion - // of the input, as you'd expect. - - long DeviceToLogicalX(long x) const; - long DeviceToLogicalY(long y) const; - long DeviceToLogicalXRel(long x) const; - long DeviceToLogicalYRel(long y) const; - long LogicalToDeviceX(long x) const; - long LogicalToDeviceY(long y) const; - long LogicalToDeviceXRel(long x) const; - long LogicalToDeviceYRel(long y) const; - - // This group of functions may not do any conversion - // if m_scaleGDI is TRUE, since the HDC does the - // conversion automatically. - // m_scaleGDI NOW OBSOLETE - long ImplDeviceToLogicalX(long x) const; - long ImplDeviceToLogicalY(long y) const; - long ImplDeviceToLogicalXRel(long x) const; - long ImplDeviceToLogicalYRel(long y) const; - long ImplLogicalToDeviceX(long x) const; - long ImplLogicalToDeviceY(long y) const; - long ImplLogicalToDeviceXRel(long x) const; - long ImplLogicalToDeviceYRel(long y) const; - - virtual bool Blit(long xdest, long ydest, long width, long height, - wxDC *source, long xsrc, long ysrc, int rop = wxCOPY, bool useMask = FALSE); - - virtual bool CanDrawBitmap(void) const; - virtual bool CanGetTextExtent(void) const; - - // - // This function is intended to improves drawing, by avoiding to - // repeatly call ::SetPen/::SetBrush. If set to FALSE, these functions - // aren't called when calling ::DrawLine(),... - // Please note that this is YOUR responsability to use it, and do it - // only when you KNOWN that pen/brush isn't changed between 2 calls to - // DrawLine,... !!! - // Note also that in X, we don't test m_autoSetting on brushes, because they - // modify Foreground, as pens. So, convention is: - // - call your SetBrush(), THEN your SetPen, THEN AutoSetTools(FALSE) - // - call DrawLine,... - // [mainly coded for Windows] - inline virtual void AutoSetTools(bool auto_setting) { m_autoSetting = auto_setting ; } - inline virtual void DrawPoint(wxPoint& point) { DrawPoint(point.x, point.y); } - virtual void DrawLines(wxList *list, long xoffset = 0, long yoffset = 0); - virtual void DrawPolygon(wxList *list, long xoffset = 0, long yoffset = 0, int fillStyle=wxODDEVEN_RULE); -#if USE_SPLINES - // Splines - // 3-point spline - virtual void DrawSpline(long x1, long y1, long x2, long y2, long x3, long y3); - // Any number of control points - a list of pointers to wxPoints - virtual void DrawSpline(wxList *points); - virtual void DrawSpline(int n, wxPoint points[]); +protected: + virtual bool DoFloodFill(wxCoord x, wxCoord y, const wxColour& col, + int style = wxFLOOD_SURFACE); + + virtual bool DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const; + + virtual void DoDrawPoint(wxCoord x, wxCoord y); + virtual void DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2); + + virtual void DoDrawArc(wxCoord x1, wxCoord y1, + wxCoord x2, wxCoord y2, + wxCoord xc, wxCoord yc); + 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); + + virtual void DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + virtual void DoDrawRoundedRectangle(wxCoord x, wxCoord y, + wxCoord width, wxCoord height, + double radius); + virtual void DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height); + + virtual void DoCrossHair(wxCoord x, wxCoord y); + + virtual void DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y); + virtual void DoDrawBitmap(const wxBitmap &bmp, wxCoord x, wxCoord y, + bool useMask = false); + + virtual void DoDrawText(const wxString& text, wxCoord x, wxCoord y); + virtual void DoDrawRotatedText(const wxString& text, wxCoord x, wxCoord y, + double angle); + + 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); + + // this is gnarly - we can't even call this function DoSetClippingRegion() + // because of virtual function hiding + virtual void DoSetClippingRegionAsRegion(const wxRegion& region); + virtual void DoSetClippingRegion(wxCoord x, wxCoord y, + wxCoord width, wxCoord height); + virtual void DoGetClippingRegion(wxCoord *x, wxCoord *y, + wxCoord *width, wxCoord *height) + { + GetClippingBox(x, y, width, height); + } + virtual void DoGetClippingBox(wxCoord *x, wxCoord *y, + wxCoord *w, wxCoord *h) const; + + virtual void DoGetSize(int *width, int *height) const; + virtual void DoGetSizeMM(int* width, int* height) const; + + virtual void DoDrawLines(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset); + virtual void DoDrawPolygon(int n, wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE); + virtual void DoDrawPolyPolygon(int n, int count[], wxPoint points[], + wxCoord xoffset, wxCoord yoffset, + int fillStyle = wxODDEVEN_RULE); + + +#if wxUSE_PALETTE + // MSW specific, select a logical palette into the HDC + // (tell windows to translate pixel from other palettes to our custom one + // and vice versa) + // Realize tells it to also reset the system palette to this one. + void DoSelectPalette(bool realize = false); + + // Find out what palette our parent window has, then select it into the dc + void InitializePalette(); +#endif // wxUSE_PALETTE + + // common part of DoDrawText() and DoDrawRotatedText() + void DrawAnyText(const wxString& text, wxCoord x, wxCoord y); + + // common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion() + void SetClippingHrgn(WXHRGN hrgn); + + // MSW-specific member variables + // ----------------------------- + + // the window associated with this DC (may be NULL) + wxWindow *m_canvas; + + wxBitmap m_selectedBitmap; + + // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it + bool m_bOwnsDC:1; + + // our HDC + WXHDC m_hDC; + + // Store all old GDI objects when do a SelectObject, so we can select them + // back in (this unselecting user's objects) so we can safely delete the + // DC. + WXHBITMAP m_oldBitmap; + WXHPEN m_oldPen; + WXHBRUSH m_oldBrush; + WXHFONT m_oldFont; + +#if wxUSE_PALETTE + WXHPALETTE m_oldPalette; +#endif // wxUSE_PALETTE + +#if wxUSE_DC_CACHEING + static wxList sm_bitmapCache; + static wxList sm_dcCache; #endif - virtual void SetTextForeground(const wxColour& colour); - virtual void SetTextBackground(const wxColour& colour); - inline virtual bool Ok(void) const {return m_ok;}; - inline virtual int GetMapMode(void) const {return m_mappingMode;}; - - inline virtual wxBrush *GetBackground(void) const { return (wxBrush*) &m_backgroundBrush ;} - inline virtual wxBrush *GetBrush(void) const { return (wxBrush*) &m_brush ;} - inline virtual wxFont *GetFont(void) const { return (wxFont*) &m_font ;} - inline virtual int GetLogicalFunction(void) const { return m_logicalFunction ;} - inline virtual wxPen *GetPen(void) const { return (wxPen*) &m_pen ;} - inline virtual wxColour&GetTextBackground(void) const { return (wxColour&) m_textBackgroundColour ;} - inline virtual wxColour&GetTextForeground(void) const { return (wxColour&) m_textForegroundColour ;} - - virtual void SetLogicalScale(double x, double y); - virtual inline void GetUserScale(double* x, double *y) const { *x = m_userScaleX; *y = m_userScaleY; } - virtual void CalcBoundingBox(long x, long y); - // Get the final bounding box of the PostScript or Metafile picture. - virtual inline long MinX(void) const { return m_minX; } - virtual inline long MaxX(void) const { return m_maxX; } - virtual inline long MinY(void) const { return m_minY; } - virtual inline long MaxY(void) const { return m_maxY; } - // Sometimes we need to override optimization, e.g. - // if other software is drawing onto our surface and we - // can't be sure of who's done what. - virtual inline void SetOptimization(bool WXUNUSED(opt)) { } - virtual inline bool GetOptimization(void) { return FALSE; } - - virtual void GetClippingBox(long *x,long *y,long *w,long *h) const ; - - virtual void SetRop(WXHDC cdc); - virtual void DoClipping(WXHDC cdc); - virtual void SelectOldObjects(WXHDC dc); - - inline wxWindow *GetWindow(void) const { return m_canvas; } - inline void SetWindow(wxWindow *win) { m_canvas = win; } - inline WXHDC GetHDC(void) const { return m_hDC; } - inline void SetHDC(WXHDC dc, bool bOwnsDC = FALSE) { m_hDC = dc; m_bOwnsDC = bOwnsDC; } - inline bool GetAutoSetting(void) const { return m_autoSetting; } - -// inline bool GetScaleGDI(void) const { return m_scaleGDI; } -// inline void SetScaleGDI(bool flag) { m_scaleGDI = flag; } -protected: - bool m_colour; - bool m_ok; - bool m_clipping; - bool m_isInteractive; - - // Coordinate system variables - long m_logicalOriginX; - long m_logicalOriginY; - - long m_deviceOriginX; - long m_deviceOriginY; - - double m_logicalScaleX; - double m_logicalScaleY; - - double m_userScaleX; - double m_userScaleY; - - int m_mappingMode; - - long m_minX; // bounding box - long m_minY; - long m_maxX; - long m_maxY; - - int m_logicalFunction; - int m_backgroundMode; - - wxPen m_pen; - wxBrush m_brush; - wxBrush m_backgroundBrush; - wxColour m_textForegroundColour; - wxColour m_textBackgroundColour; - wxFont m_font; - wxPalette m_palette; - bool m_autoSetting ; - int m_clipX1; - int m_clipY1; - int m_clipX2; - int m_clipY2; -// bool m_dontDelete; - int m_windowExtX; - int m_windowExtY; - double m_systemScaleX; - double m_systemScaleY; - - wxWindow * m_canvas; - wxBitmap m_selectedBitmap; - wxString m_filename; - - // TRUE => DeleteDC() in dtor, FALSE => only ReleaseDC() it - bool m_bOwnsDC; - - WXHDC m_hDC; - int m_hDCCount; - - // Store all old GDI objects when do a SelectObject, - // so we can select them back in (this unselecting user's - // objects) so we can safely delete the DC. - WXHBITMAP m_oldBitmap; - WXHPEN m_oldPen; - WXHBRUSH m_oldBrush; - WXHFONT m_oldFont; - WXHPALETTE m_oldPalette; - - // Stores scaling, translation, rotation -// wxTransformMatrix m_transformMatrix; - - // Do we wish to scale GDI objects too, e.g. pen width? -// bool m_scaleGDI; + DECLARE_DYNAMIC_CLASS(wxDC) + DECLARE_NO_COPY_CLASS(wxDC) }; -// Logical to device -// Absolute -#define XLOG2DEV(x) ImplLogicalToDeviceX(x) - -#define YLOG2DEV(y) ImplLogicalToDeviceY(y) - -// Relative -#define XLOG2DEVREL(x) ImplLogicalToDeviceXRel(x) -#define YLOG2DEVREL(y) ImplLogicalToDeviceYRel(y) +// ---------------------------------------------------------------------------- +// wxDCTemp: a wxDC which doesn't free the given HDC (used by wxWidgets +// only/mainly) +// ---------------------------------------------------------------------------- -// Device to logical -// Absolute -#define XDEV2LOG(x) ImplDeviceToLogicalX(x) - -#define YDEV2LOG(y) ImplDeviceToLogicalY(y) - -// Relative -#define XDEV2LOGREL(x) ImplDeviceToLogicalXRel(x) -#define YDEV2LOGREL(y) ImplDeviceToLogicalYRel(y) - -/* - * Have the same macros as for XView but not for every operation: - * just for calculating window/viewport extent (a better way of scaling). - */ - -// Logical to device -// Absolute -#define MS_XLOG2DEV(x) LogicalToDevice(x) - -#define MS_YLOG2DEV(y) LogicalToDevice(y) - -// Relative -#define MS_XLOG2DEVREL(x) LogicalToDeviceXRel(x) -#define MS_YLOG2DEVREL(y) LogicalToDeviceYRel(y) - -// Device to logical -// Absolute -#define MS_XDEV2LOG(x) DeviceToLogicalX(x) - -#define MS_YDEV2LOG(y) DeviceToLogicalY(y) - -// Relative -#define MS_XDEV2LOGREL(x) DeviceToLogicalXRel(x) -#define MS_YDEV2LOGREL(y) DeviceToLogicalYRel(y) - -#define MM_POINTS 7 -#define MM_METRIC 8 - -extern int wxPageNumber; - -// Conversion -#define METRIC_CONVERSION_CONSTANT 0.0393700787 - -// Scaling factors for various unit conversions -#define mm2inches (METRIC_CONVERSION_CONSTANT) -#define inches2mm (1/METRIC_CONVERSION_CONSTANT) - -#define mm2twips (METRIC_CONVERSION_CONSTANT*1440) -#define twips2mm (1/(METRIC_CONVERSION_CONSTANT*1440)) - -#define mm2pt (METRIC_CONVERSION_CONSTANT*72) -#define pt2mm (1/(METRIC_CONVERSION_CONSTANT*72)) - -#define wx_round(a) (int)((a)+.5) +class WXDLLEXPORT wxDCTemp : public wxDC +{ +public: + wxDCTemp(WXHDC hdc) { SetHDC(hdc); } + virtual ~wxDCTemp() { SetHDC((WXHDC)NULL); } +private: + DECLARE_NO_COPY_CLASS(wxDCTemp) +}; #endif - // __DCH__ + // _WX_DC_H_