]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/dc.cpp
1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Robert Roebling
6 // Copyright: (c) 1998 Robert Roebling, Markus Holzem
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
12 #pragma implementation "dc.h"
20 //-----------------------------------------------------------------------------
22 //-----------------------------------------------------------------------------
24 #define mm2inches 0.0393700787402
25 #define inches2mm 25.4
26 #define mm2twips 56.6929133859
27 #define twips2mm 0.0176388888889
28 #define mm2pt 2.83464566929
29 #define pt2mm 0.352777777778
31 //-----------------------------------------------------------------------------
33 //-----------------------------------------------------------------------------
35 IMPLEMENT_ABSTRACT_CLASS(wxDC
,wxObject
)
41 m_autoSetting
= FALSE
;
53 m_logicalScaleX
= 1.0;
54 m_logicalScaleY
= 1.0;
60 m_mappingMode
= wxMM_TEXT
;
61 m_needComputeScaleX
= FALSE
; /* not used yet */
62 m_needComputeScaleY
= FALSE
; /* not used yet */
64 m_signX
= 1; /* default x-axis left to right */
65 m_signY
= 1; /* default y-axis top down. -1 in postscript. */
72 m_logicalFunction
= wxCOPY
;
73 // m_textAlignment = wxALIGN_TOP_LEFT;
74 m_backgroundMode
= wxTRANSPARENT
;
76 m_textForegroundColour
= *wxBLACK
;
77 m_textBackgroundColour
= *wxWHITE
;
79 m_font
= *wxNORMAL_FONT
;
80 m_brush
= *wxTRANSPARENT_BRUSH
;
81 m_backgroundBrush
= *wxWHITE_BRUSH
;
83 // m_palette = wxAPP_COLOURMAP; /* I'll learn to handle palettes later in my life */
95 void wxDC::DrawArc( long WXUNUSED(x1
), long WXUNUSED(y1
), long WXUNUSED(x2
), long WXUNUSED(y2
),
96 double WXUNUSED(xc
), double WXUNUSED(yc
) )
100 void wxDC::DrawPoint( wxPoint
& point
)
102 DrawPoint( point
.x
, point
.y
);
105 void wxDC::DrawPolygon( wxList
*list
, long xoffset
, long yoffset
, int fillStyle
)
107 int n
= list
->Number();
108 wxPoint
*points
= new wxPoint
[n
];
111 for( wxNode
*node
= list
->First(); node
; node
= node
->Next() )
113 wxPoint
*point
= (wxPoint
*)node
->Data();
114 points
[i
].x
= point
->x
;
115 points
[i
++].y
= point
->y
;
118 DrawPolygon( n
, points
, xoffset
, yoffset
, fillStyle
);
122 void wxDC::DrawLines( wxList
*list
, long xoffset
, long yoffset
)
124 int n
= list
->Number();
125 wxPoint
*points
= new wxPoint
[n
];
128 for( wxNode
*node
= list
->First(); node
; node
= node
->Next() )
130 wxPoint
*point
= (wxPoint
*)node
->Data();
131 points
[i
].x
= point
->x
;
132 points
[i
++].y
= point
->y
;
135 DrawLines( n
, points
, xoffset
, yoffset
);
139 void wxDC::DrawSpline( long x1
, long y1
, long x2
, long y2
, long x3
, long y3
)
142 list
.Append( (wxObject
*)new wxPoint(x1
, y1
) );
143 list
.Append( (wxObject
*)new wxPoint(x2
, y2
) );
144 list
.Append( (wxObject
*)new wxPoint(x3
, y3
) );
146 wxNode
*node
= list
.First();
149 wxPoint
*p
= (wxPoint
*)node
->Data();
155 void wxDC::DrawSpline( int n
, wxPoint points
[] )
158 for (int i
= 0; i
< n
; i
++) list
.Append( (wxObject
*)&points
[i
] );
162 void wxDC::SetClippingRegion( long x
, long y
, long width
, long height
)
167 m_clipX2
= x
+ width
;
168 m_clipY2
= y
+ height
;
171 void wxDC::DestroyClippingRegion()
176 void wxDC::GetClippingBox( long *x
, long *y
, long *width
, long *height
) const
180 if (x
) *x
= m_clipX1
;
181 if (y
) *y
= m_clipY1
;
182 if (width
) *width
= (m_clipX2
- m_clipX1
);
183 if (height
) *height
= (m_clipY2
- m_clipY1
);
187 *x
= *y
= *width
= *height
= 0;
191 void wxDC::GetSize( int* width
, int* height
) const
193 if (width
) *width
= m_maxX
-m_minX
;
194 if (height
) *height
= m_maxY
-m_minY
;
197 void wxDC::GetSizeMM( int* width
, int* height
) const
202 if (width
) *width
= int( double(w
) / (m_scaleX
*m_mm_to_pix_x
) );
203 if (height
) *height
= int( double(h
) / (m_scaleY
*m_mm_to_pix_y
) );
206 // Resolution in pixels per logical inch
207 wxSize
wxDC::GetPPI(void) const
209 // TODO (should probably be pure virtual)
213 void wxDC::SetTextForeground( const wxColour
&col
)
215 m_textForegroundColour
= col
;
218 void wxDC::SetTextBackground( const wxColour
&col
)
220 m_textBackgroundColour
= col
;
223 void wxDC::SetMapMode( int mode
)
228 SetLogicalScale( twips2mm
*m_mm_to_pix_x
, twips2mm
*m_mm_to_pix_y
);
231 SetLogicalScale( pt2mm
*m_mm_to_pix_x
, pt2mm
*m_mm_to_pix_y
);
234 SetLogicalScale( m_mm_to_pix_x
, m_mm_to_pix_y
);
237 SetLogicalScale( m_mm_to_pix_x
/10.0, m_mm_to_pix_y
/10.0 );
241 SetLogicalScale( 1.0, 1.0 );
244 /* we don't do this mega optimisation
245 if (mode != wxMM_TEXT)
247 m_needComputeScaleX = TRUE;
248 m_needComputeScaleY = TRUE;
253 void wxDC::SetUserScale( double x
, double y
)
255 // allow negative ? -> no
258 ComputeScaleAndOrigin();
261 void wxDC::GetUserScale( double *x
, double *y
)
263 if (x
) *x
= m_userScaleX
;
264 if (y
) *y
= m_userScaleY
;
267 void wxDC::SetLogicalScale( double x
, double y
)
272 ComputeScaleAndOrigin();
275 void wxDC::GetLogicalScale( double *x
, double *y
)
277 if (x
) *x
= m_logicalScaleX
;
278 if (y
) *y
= m_logicalScaleY
;
281 void wxDC::SetLogicalOrigin( long x
, long y
)
283 m_logicalOriginX
= x
* m_signX
; // is this still correct ?
284 m_logicalOriginY
= y
* m_signY
;
285 ComputeScaleAndOrigin();
288 void wxDC::GetLogicalOrigin( long *x
, long *y
)
290 if (x
) *x
= m_logicalOriginX
;
291 if (y
) *y
= m_logicalOriginY
;
294 void wxDC::SetDeviceOrigin( long x
, long y
)
296 // only wxPostScripDC has m_signX = -1, we override SetDeviceOrigin there
299 ComputeScaleAndOrigin();
302 void wxDC::GetDeviceOrigin( long *x
, long *y
)
304 if (x
) *x
= m_deviceOriginX
;
305 if (y
) *y
= m_deviceOriginY
;
308 void wxDC::SetAxisOrientation( bool xLeftRight
, bool yBottomUp
)
310 // only wxPostScripDC has m_signX = -1, we override SetAxisOrientation there
311 m_signX
= (xLeftRight
? 1 : -1);
312 m_signY
= (yBottomUp
? -1 : 1);
313 ComputeScaleAndOrigin();
316 long wxDC::DeviceToLogicalX(long x
) const
321 long wxDC::DeviceToLogicalY(long y
) const
326 long wxDC::DeviceToLogicalXRel(long x
) const
328 return XDEV2LOGREL(x
);
331 long wxDC::DeviceToLogicalYRel(long y
) const
333 return YDEV2LOGREL(y
);
336 long wxDC::LogicalToDeviceX(long x
) const
341 long wxDC::LogicalToDeviceY(long y
) const
346 long wxDC::LogicalToDeviceXRel(long x
) const
348 return XLOG2DEVREL(x
);
351 long wxDC::LogicalToDeviceYRel(long y
) const
353 return YLOG2DEVREL(y
);
356 void wxDC::CalcBoundingBox( long x
, long y
)
358 if (x
< m_minX
) m_minX
= x
;
359 if (y
< m_minY
) m_minY
= y
;
360 if (x
> m_maxX
) m_maxX
= x
;
361 if (y
> m_maxY
) m_maxY
= y
;
364 void wxDC::ComputeScaleAndOrigin()
366 // CMB: copy scale to see if it changes
367 double origScaleX
= m_scaleX
;
368 double origScaleY
= m_scaleY
;
370 m_scaleX
= m_logicalScaleX
* m_userScaleX
;
371 m_scaleY
= m_logicalScaleY
* m_userScaleY
;
373 // CMB: if scale has changed call SetPen to recalulate the line width
374 if (m_scaleX
!= origScaleX
|| m_scaleY
!= origScaleY
)
376 // this is a bit artificial, but we need to force wxDC to think
377 // the pen has changed
378 // It gives an Assert, Robert Roebling