]>
git.saurik.com Git - wxWidgets.git/blob - src/motif/dc.cpp
1 /////////////////////////////////////////////////////////////////////////////
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "dc.h"
17 #include "wx/dcmemory.h"
19 #if !USE_SHARED_LIBRARY
20 IMPLEMENT_ABSTRACT_CLASS(wxDC
, wxObject
)
23 //-----------------------------------------------------------------------------
25 //-----------------------------------------------------------------------------
27 #define mm2inches 0.0393700787402
28 #define inches2mm 25.4
29 #define mm2twips 56.6929133859
30 #define twips2mm 0.0176388888889
31 #define mm2pt 2.83464566929
32 #define pt2mm 0.352777777778
34 //-----------------------------------------------------------------------------
36 //-----------------------------------------------------------------------------
52 m_internalDeviceOriginX
= 0;
53 m_internalDeviceOriginY
= 0;
54 m_externalDeviceOriginX
= 0;
55 m_externalDeviceOriginY
= 0;
57 m_logicalScaleX
= 1.0;
58 m_logicalScaleY
= 1.0;
64 m_mappingMode
= wxMM_TEXT
;
65 m_needComputeScaleX
= FALSE
;
66 m_needComputeScaleY
= FALSE
;
68 m_signX
= 1; // default x-axis left to right
69 m_signY
= 1; // default y-axis top down
74 m_logicalFunction
= wxCOPY
;
75 // m_textAlignment = wxALIGN_TOP_LEFT;
76 m_backgroundMode
= wxTRANSPARENT
;
78 m_textForegroundColour
= *wxBLACK
;
79 m_textBackgroundColour
= *wxWHITE
;
81 m_font
= *wxNORMAL_FONT
;
82 m_brush
= *wxTRANSPARENT_BRUSH
;
83 m_backgroundBrush
= *wxWHITE_BRUSH
;
85 m_isInteractive
= FALSE
;
87 // m_palette = wxAPP_COLOURMAP;
94 void wxDC::DrawIcon( const wxIcon
&WXUNUSED(icon
), long WXUNUSED(x
), long WXUNUSED(y
))
98 void wxDC::DrawBitmap( const wxBitmap
& bitmap
, long x
, long y
, bool useMask
)
104 memDC
.SelectObject(bitmap
);
106 /* Not sure if we need this. The mask should leave the
107 * masked areas as per the original background of this DC.
110 // There might be transparent areas, so make these
111 // the same colour as this DC
112 memDC.SetBackground(* GetBackground());
117 Blit(x
, y
, bitmap
.GetWidth(), bitmap
.GetHeight(), & memDC
, 0, 0, wxCOPY
, useMask
);
119 memDC
.SelectObject(wxNullBitmap
);
123 void wxDC::DrawPoint( wxPoint
& point
)
125 DrawPoint( point
.x
, point
.y
);
128 void wxDC::DrawPolygon( wxList
*list
, long xoffset
, long yoffset
, int fillStyle
)
130 int n
= list
->Number();
131 wxPoint
*points
= new wxPoint
[n
];
134 for( wxNode
*node
= list
->First(); node
; node
= node
->Next() )
136 wxPoint
*point
= (wxPoint
*)node
->Data();
137 points
[i
].x
= point
->x
;
138 points
[i
++].y
= point
->y
;
140 DrawPolygon( n
, points
, xoffset
, yoffset
, fillStyle
);
144 void wxDC::DrawLines( wxList
*list
, long xoffset
, long yoffset
)
146 int n
= list
->Number();
147 wxPoint
*points
= new wxPoint
[n
];
150 for( wxNode
*node
= list
->First(); node
; node
= node
->Next() )
152 wxPoint
*point
= (wxPoint
*)node
->Data();
153 points
[i
].x
= point
->x
;
154 points
[i
++].y
= point
->y
;
156 DrawLines( n
, points
, xoffset
, yoffset
);
160 void wxDC::DrawSpline( long x1
, long y1
, long x2
, long y2
, long x3
, long y3
)
163 list
.Append( (wxObject
*)new wxPoint(x1
, y1
) );
164 list
.Append( (wxObject
*)new wxPoint(x2
, y2
) );
165 list
.Append( (wxObject
*)new wxPoint(x3
, y3
) );
167 wxNode
*node
= list
.First();
170 wxPoint
*p
= (wxPoint
*)node
->Data();
176 void wxDC::DrawSpline( int n
, wxPoint points
[] )
179 for (int i
= 0; i
< n
; i
++) list
.Append( (wxObject
*)&points
[i
] );
183 void wxDC::SetClippingRegion( long x
, long y
, long width
, long height
)
188 m_clipX2
= x
+ width
;
189 m_clipY2
= y
+ height
;
192 void wxDC::DestroyClippingRegion(void)
197 void wxDC::GetClippingBox( long *x
, long *y
, long *width
, long *height
) const
201 if (x
) *x
= m_clipX1
;
202 if (y
) *y
= m_clipY1
;
203 if (width
) *width
= (m_clipX2
- m_clipX1
);
204 if (height
) *height
= (m_clipY2
- m_clipY1
);
207 *x
= *y
= *width
= *height
= 0;
210 void wxDC::GetSize( int* width
, int* height
) const
212 *width
= m_maxX
-m_minX
;
213 *height
= m_maxY
-m_minY
;
216 void wxDC::GetSizeMM( int* width
, int* height
) const
221 *width
= int( double(w
) / (m_scaleX
*m_mm_to_pix_x
) );
222 *height
= int( double(h
) / (m_scaleY
*m_mm_to_pix_y
) );
225 // Resolution in pixels per logical inch
226 wxSize
wxDC::GetPPI(void) const
228 // TODO (should probably be pure virtual)
232 void wxDC::SetTextForeground( const wxColour
&col
)
235 m_textForegroundColour
= col
;
238 void wxDC::SetTextBackground( const wxColour
&col
)
241 m_textBackgroundColour
= col
;
244 void wxDC::SetMapMode( int mode
)
249 SetLogicalScale( twips2mm
*m_mm_to_pix_x
, twips2mm
*m_mm_to_pix_y
);
252 SetLogicalScale( pt2mm
*m_mm_to_pix_x
, pt2mm
*m_mm_to_pix_y
);
255 SetLogicalScale( m_mm_to_pix_x
, m_mm_to_pix_y
);
258 SetLogicalScale( m_mm_to_pix_x
/10.0, m_mm_to_pix_y
/10.0 );
262 SetLogicalScale( 1.0, 1.0 );
265 if (mode
!= wxMM_TEXT
)
267 m_needComputeScaleX
= TRUE
;
268 m_needComputeScaleY
= TRUE
;
272 void wxDC::SetUserScale( double x
, double y
)
274 // allow negative ? -> no
277 ComputeScaleAndOrigin();
280 void wxDC::GetUserScale( double *x
, double *y
)
282 if (x
) *x
= m_userScaleX
;
283 if (y
) *y
= m_userScaleY
;
286 void wxDC::SetLogicalScale( double x
, double y
)
291 ComputeScaleAndOrigin();
294 void wxDC::GetLogicalScale( double *x
, double *y
)
296 if (x
) *x
= m_logicalScaleX
;
297 if (y
) *y
= m_logicalScaleY
;
300 void wxDC::SetLogicalOrigin( long x
, long y
)
302 m_logicalOriginX
= x
* m_signX
; // is this still correct ?
303 m_logicalOriginY
= y
* m_signY
;
304 ComputeScaleAndOrigin();
307 void wxDC::GetLogicalOrigin( long *x
, long *y
)
309 if (x
) *x
= m_logicalOriginX
;
310 if (y
) *y
= m_logicalOriginY
;
313 void wxDC::SetDeviceOrigin( long x
, long y
)
315 m_externalDeviceOriginX
= x
;
316 m_externalDeviceOriginY
= y
;
317 ComputeScaleAndOrigin();
320 void wxDC::GetDeviceOrigin( long *x
, long *y
)
322 // if (x) *x = m_externalDeviceOriginX;
323 // if (y) *y = m_externalDeviceOriginY;
324 if (x
) *x
= m_deviceOriginX
;
325 if (y
) *y
= m_deviceOriginY
;
328 void wxDC::SetInternalDeviceOrigin( long x
, long y
)
330 m_internalDeviceOriginX
= x
;
331 m_internalDeviceOriginY
= y
;
332 ComputeScaleAndOrigin();
335 void wxDC::GetInternalDeviceOrigin( long *x
, long *y
)
337 if (x
) *x
= m_internalDeviceOriginX
;
338 if (y
) *y
= m_internalDeviceOriginY
;
341 void wxDC::SetAxisOrientation( bool xLeftRight
, bool yBottomUp
)
343 m_signX
= (xLeftRight
? 1 : -1);
344 m_signY
= (yBottomUp
? -1 : 1);
345 ComputeScaleAndOrigin();
348 long wxDC::DeviceToLogicalX(long x
) const
353 long wxDC::DeviceToLogicalY(long y
) const
358 long wxDC::DeviceToLogicalXRel(long x
) const
360 return XDEV2LOGREL(x
);
363 long wxDC::DeviceToLogicalYRel(long y
) const
365 return YDEV2LOGREL(y
);
368 long wxDC::LogicalToDeviceX(long x
) const
373 long wxDC::LogicalToDeviceY(long y
) const
378 long wxDC::LogicalToDeviceXRel(long x
) const
380 return XLOG2DEVREL(x
);
383 long wxDC::LogicalToDeviceYRel(long y
) const
385 return YLOG2DEVREL(y
);
388 void wxDC::CalcBoundingBox( long x
, long y
)
390 if (x
< m_minX
) m_minX
= x
;
391 if (y
< m_minY
) m_minY
= y
;
392 if (x
> m_maxX
) m_maxX
= x
;
393 if (y
> m_maxY
) m_maxY
= y
;
396 void wxDC::ComputeScaleAndOrigin(void)
398 // CMB: copy scale to see if it changes
399 double origScaleX
= m_scaleX
;
400 double origScaleY
= m_scaleY
;
402 m_scaleX
= m_logicalScaleX
* m_userScaleX
;
403 m_scaleY
= m_logicalScaleY
* m_userScaleY
;
405 m_deviceOriginX
= m_internalDeviceOriginX
+ m_externalDeviceOriginX
;
406 m_deviceOriginY
= m_internalDeviceOriginY
+ m_externalDeviceOriginY
;
408 // CMB: if scale has changed call SetPen to recalulate the line width
409 if (m_scaleX
!= origScaleX
|| m_scaleY
!= origScaleY
)
411 // this is a bit artificial, but we need to force wxDC to think
412 // the pen has changed
413 wxPen
* pen
= & GetPen();