]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/palmos/dc.cpp
first stab at supporting custom renderers
[wxWidgets.git] / src / palmos / dc.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: src/palmos/dc.cpp
3// Purpose: wxDC class
4// Author: William Osborne - minimal working wxPalmOS port
5// Modified by:
6// Created: 10/13/04
7// RCS-ID: $Id$
8// Copyright: (c) William Osborne
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ===========================================================================
13// declarations
14// ===========================================================================
15
16// ---------------------------------------------------------------------------
17// headers
18// ---------------------------------------------------------------------------
19
20#include <string.h>
21
22// For compilers that support precompilation, includes "wx.h".
23#include "wx/wxprec.h"
24
25#ifdef __BORLANDC__
26 #pragma hdrstop
27#endif
28
29#ifndef WX_PRECOMP
30 #include "wx/image.h"
31 #include "wx/window.h"
32 #include "wx/dc.h"
33 #include "wx/utils.h"
34 #include "wx/dialog.h"
35 #include "wx/app.h"
36 #include "wx/bitmap.h"
37 #include "wx/dcmemory.h"
38 #include "wx/log.h"
39 #include "wx/icon.h"
40 #include "wx/dcprint.h"
41 #include "wx/module.h"
42#endif
43
44#include "wx/sysopt.h"
45#include "wx/dynlib.h"
46
47#include "wx/palmos/dc.h"
48
49#ifndef AC_SRC_ALPHA
50 #define AC_SRC_ALPHA 1
51#endif
52
53#ifndef LAYOUT_RTL
54 #define LAYOUT_RTL 1
55#endif
56
57/* Quaternary raster codes */
58#ifndef MAKEROP4
59#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))
60#endif
61
62// apparently with MicroWindows it is possible that HDC is 0 so we have to
63// check for this ourselves
64#ifdef __WXMICROWIN__
65 #define WXMICROWIN_CHECK_HDC if ( !GetHDC() ) return;
66 #define WXMICROWIN_CHECK_HDC_RET(x) if ( !GetHDC() ) return x;
67#else
68 #define WXMICROWIN_CHECK_HDC
69 #define WXMICROWIN_CHECK_HDC_RET(x)
70#endif
71
72IMPLEMENT_ABSTRACT_CLASS(wxPalmDCImpl, wxDCImpl)
73
74// ---------------------------------------------------------------------------
75// constants
76// ---------------------------------------------------------------------------
77
78// ROPs which don't have standard names (see "Ternary Raster Operations" in the
79// MSDN docs for how this and other numbers in wxDC::Blit() are obtained)
80#define DSTCOPY 0x00AA0029 // a.k.a. NOP operation
81
82// ----------------------------------------------------------------------------
83// macros for logical <-> device coords conversion
84// ----------------------------------------------------------------------------
85
86/*
87 We currently let Windows do all the translations itself so these macros are
88 not really needed (any more) but keep them to enhance readability of the
89 code by allowing to see where are the logical and where are the device
90 coordinates used.
91 */
92
93#ifdef __WXWINCE__
94 #define XLOG2DEV(x) ((x-m_logicalOriginX)*m_signX)
95 #define YLOG2DEV(y) ((y-m_logicalOriginY)*m_signY)
96 #define XDEV2LOG(x) ((x)*m_signX+m_logicalOriginX)
97 #define YDEV2LOG(y) ((y)*m_signY+m_logicalOriginY)
98#else
99 #define XLOG2DEV(x) (x)
100 #define YLOG2DEV(y) (y)
101 #define XDEV2LOG(x) (x)
102 #define YDEV2LOG(y) (y)
103#endif
104
105// ---------------------------------------------------------------------------
106// private functions
107// ---------------------------------------------------------------------------
108
109// ----------------------------------------------------------------------------
110// private classes
111// ----------------------------------------------------------------------------
112
113#if wxUSE_DYNLIB_CLASS
114
115// helper class to cache dynamically loaded libraries and not attempt reloading
116// them if it fails
117class wxOnceOnlyDLLLoader
118{
119public:
120 // ctor argument must be a literal string as we don't make a copy of it!
121 wxOnceOnlyDLLLoader(const wxChar *dllName)
122 : m_dllName(dllName)
123 {
124 }
125
126
127 // return the symbol with the given name or NULL if the DLL not loaded
128 // or symbol not present
129 void *GetSymbol(const wxChar *name)
130 {
131 // we're prepared to handle errors here
132 wxLogNull noLog;
133
134 if ( m_dllName )
135 {
136 m_dll.Load(m_dllName);
137
138 // reset the name whether we succeeded or failed so that we don't
139 // try again the next time
140 m_dllName = NULL;
141 }
142
143 return m_dll.IsLoaded() ? m_dll.GetSymbol(name) : NULL;
144 }
145
146 void Unload()
147 {
148 if ( m_dll.IsLoaded() )
149 {
150 m_dll.Unload();
151 }
152 }
153
154private:
155 wxDynamicLibrary m_dll;
156 const wxChar *m_dllName;
157};
158
159#endif // wxUSE_DYNLIB_CLASS
160
161// ===========================================================================
162// implementation
163// ===========================================================================
164
165// ---------------------------------------------------------------------------
166// wxPalmDCImpl
167// ---------------------------------------------------------------------------
168
169wxPalmDCImpl::wxPalmDCImpl( wxDC *owner, WXHDC hDC ) :
170 wxDCImpl( owner )
171{
172 Init();
173 m_hDC = hDC;
174}
175
176wxPalmDCImpl::~wxPalmDCImpl()
177{
178}
179
180// This will select current objects out of the DC,
181// which is what you have to do before deleting the
182// DC.
183void wxPalmDCImpl::SelectOldObjects(WXHDC dc)
184{
185}
186
187// ---------------------------------------------------------------------------
188// clipping
189// ---------------------------------------------------------------------------
190
191void wxPalmDCImpl::UpdateClipBox()
192{
193}
194
195void
196wxPalmDCImpl::DoGetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) const
197{
198}
199
200void wxPalmDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h)
201{
202}
203
204void wxPalmDCImpl::DoSetDeviceClippingRegion(const wxRegion& region)
205{
206}
207
208void wxPalmDCImpl::DestroyClippingRegion()
209{
210}
211
212// ---------------------------------------------------------------------------
213// query capabilities
214// ---------------------------------------------------------------------------
215
216bool wxPalmDCImpl::CanDrawBitmap() const
217{
218 return false;
219}
220
221bool wxPalmDCImpl::CanGetTextExtent() const
222{
223 return false;
224}
225
226int wxPalmDCImpl::GetDepth() const
227{
228 return 0;
229}
230
231// ---------------------------------------------------------------------------
232// drawing
233// ---------------------------------------------------------------------------
234
235void wxPalmDCImpl::Clear()
236{
237}
238
239bool wxPalmDCImpl::DoFloodFill(wxCoord WXUNUSED_IN_WINCE(x),
240 wxCoord WXUNUSED_IN_WINCE(y),
241 const wxColour& WXUNUSED_IN_WINCE(col),
242 wxFloodFillStyle WXUNUSED_IN_WINCE(style))
243{
244 return false;
245}
246
247bool wxPalmDCImpl::DoGetPixel(wxCoord x, wxCoord y, wxColour *col) const
248{
249 return false;
250}
251
252void wxPalmDCImpl::DoCrossHair(wxCoord x, wxCoord y)
253{
254}
255
256void wxPalmDCImpl::DoDrawLine(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
257{
258}
259
260// Draws an arc of a circle, centred on (xc, yc), with starting point (x1, y1)
261// and ending at (x2, y2)
262void wxPalmDCImpl::DoDrawArc(wxCoord x1, wxCoord y1,
263 wxCoord x2, wxCoord y2,
264 wxCoord xc, wxCoord yc)
265{
266}
267
268void wxPalmDCImpl::DoDrawCheckMark(wxCoord x1, wxCoord y1,
269 wxCoord width, wxCoord height)
270{
271}
272
273void wxPalmDCImpl::DoDrawPoint(wxCoord x, wxCoord y)
274{
275}
276
277void wxPalmDCImpl::DoDrawPolygon(int n,
278 wxPoint points[],
279 wxCoord xoffset,
280 wxCoord yoffset,
281 wxPolygonFillMode WXUNUSED_IN_WINCE(fillStyle))
282{
283}
284
285void
286wxPalmDCImpl::DoDrawPolyPolygon(int n,
287 int count[],
288 wxPoint points[],
289 wxCoord xoffset,
290 wxCoord yoffset,
291 wxPolygonFillMode fillStyle)
292{
293}
294
295void wxPalmDCImpl::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset)
296{
297}
298
299void wxPalmDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
300{
301}
302
303void wxPalmDCImpl::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius)
304{
305}
306
307void wxPalmDCImpl::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord height)
308{
309}
310
311#if wxUSE_SPLINES
312void wxPalmDCImpl::DoDrawSpline(const wxPointList *points)
313{
314}
315#endif
316
317// Chris Breeze 20/5/98: first implementation of DrawEllipticArc on Windows
318void wxPalmDCImpl::DoDrawEllipticArc(wxCoord x,wxCoord y,wxCoord w,wxCoord h,double sa,double ea)
319{
320}
321
322void wxPalmDCImpl::DoDrawIcon(const wxIcon& icon, wxCoord x, wxCoord y)
323{
324}
325
326void wxPalmDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask )
327{
328}
329
330void wxPalmDCImpl::DoDrawText(const wxString& text, wxCoord x, wxCoord y)
331{
332}
333
334void wxPalmDCImpl::DrawAnyText(const wxString& text, wxCoord x, wxCoord y)
335{
336}
337
338void wxPalmDCImpl::DoDrawRotatedText(const wxString& text,
339 wxCoord x, wxCoord y,
340 double angle)
341{
342}
343
344// ---------------------------------------------------------------------------
345// set GDI objects
346// ---------------------------------------------------------------------------
347
348#if wxUSE_PALETTE
349
350void wxPalmDCImpl::DoSelectPalette(bool realize)
351{
352}
353
354void wxPalmDCImpl::SetPalette(const wxPalette& palette)
355{
356}
357
358void wxPalmDCImpl::InitializePalette()
359{
360}
361
362#endif // wxUSE_PALETTE
363
364// SetFont/Pen/Brush() really ask to be implemented as a single template
365// function... but doing it is not worth breaking OpenWatcom build <sigh>
366
367void wxPalmDCImpl::SetFont(const wxFont& font)
368{
369}
370
371void wxPalmDCImpl::SetPen(const wxPen& pen)
372{
373}
374
375void wxPalmDCImpl::SetBrush(const wxBrush& brush)
376{
377}
378
379void wxPalmDCImpl::SetBackground(const wxBrush& brush)
380{
381}
382
383void wxPalmDCImpl::SetBackgroundMode(int mode)
384{
385}
386
387void wxPalmDCImpl::SetLogicalFunction(wxRasterOperationMode function)
388{
389}
390
391void wxPalmDCImpl::SetRop(WXHDC dc)
392{
393}
394
395bool wxPalmDCImpl::StartDoc(const wxString& WXUNUSED(message))
396{
397 // We might be previewing, so return true to let it continue.
398 return true;
399}
400
401void wxPalmDCImpl::EndDoc()
402{
403}
404
405void wxPalmDCImpl::StartPage()
406{
407}
408
409void wxPalmDCImpl::EndPage()
410{
411}
412
413// ---------------------------------------------------------------------------
414// text metrics
415// ---------------------------------------------------------------------------
416
417wxCoord wxPalmDCImpl::GetCharHeight() const
418{
419 return 0;
420}
421
422wxCoord wxPalmDCImpl::GetCharWidth() const
423{
424 return 0;
425}
426
427void wxPalmDCImpl::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y,
428 wxCoord *descent, wxCoord *externalLeading,
429 const wxFont *font) const
430{
431}
432
433
434// Each element of the array will be the width of the string up to and
435// including the coresoponding character in text.
436
437bool wxPalmDCImpl::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths) const
438{
439 return false;
440}
441
442void wxPalmDCImpl::RealizeScaleAndOrigin()
443{
444}
445
446void wxPalmDCImpl::SetMapMode(wxMappingMode mode)
447{
448}
449
450void wxPalmDCImpl::SetUserScale(double x, double y)
451{
452}
453
454void wxPalmDCImpl::SetAxisOrientation(bool xLeftRight,
455 bool yBottomUp)
456{
457}
458
459void wxPalmDCImpl::SetLogicalOrigin(wxCoord x, wxCoord y)
460{
461}
462
463void wxPalmDCImpl::SetDeviceOrigin(wxCoord x, wxCoord y)
464{
465}
466
467// ---------------------------------------------------------------------------
468// bit blit
469// ---------------------------------------------------------------------------
470
471bool wxPalmDCImpl::DoBlit(wxCoord dstX, wxCoord dstY,
472 wxCoord dstWidth, wxCoord dstHeight,
473 wxDC *source,
474 wxCoord srcX, wxCoord srcY,
475 wxRasterOperationMode rop, bool useMask,
476 wxCoord srcMaskX, wxCoord srcMaskY)
477{
478 return false;
479}
480
481bool wxPalmDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest,
482 wxCoord dstWidth, wxCoord dstHeight,
483 wxDC *source,
484 wxCoord xsrc, wxCoord ysrc,
485 wxCoord srcWidth, wxCoord srcHeight,
486 wxRasterOperationMode rop, bool useMask,
487 wxCoord xsrcMask, wxCoord ysrcMask)
488{
489 return false;
490}
491
492void wxPalmDCImpl::GetDeviceSize(int *width, int *height) const
493{
494}
495
496void wxPalmDCImpl::DoGetSizeMM(int *w, int *h) const
497{
498}
499
500wxSize wxPalmDCImpl::GetPPI() const
501{
502 return wxSize(0, 0);
503}
504
505// For use by wxWidgets only, unless custom units are required.
506void wxPalmDCImpl::SetLogicalScale(double x, double y)
507{
508}
509
510// ----------------------------------------------------------------------------
511// DC caching
512// ----------------------------------------------------------------------------
513
514#if wxUSE_DC_CACHEING
515
516/*
517 * This implementation is a bit ugly and uses the old-fashioned wxList class, so I will
518 * improve it in due course, either using arrays, or simply storing pointers to one
519 * entry for the bitmap, and two for the DCs. -- JACS
520 */
521
522wxObjectList wxPalmDCImpl::sm_bitmapCache;
523wxObjectList wxPalmDCImpl::sm_dcCache;
524
525wxDCCacheEntry::wxDCCacheEntry(WXHBITMAP hBitmap, int w, int h, int depth)
526{
527 m_bitmap = hBitmap;
528 m_dc = 0;
529 m_width = w;
530 m_height = h;
531 m_depth = depth;
532}
533
534wxDCCacheEntry::wxDCCacheEntry(WXHDC hDC, int depth)
535{
536}
537
538wxDCCacheEntry::~wxDCCacheEntry()
539{
540}
541
542wxDCCacheEntry* wxPalmDCImpl::FindBitmapInCache(WXHDC dc, int w, int h)
543{
544 return NULL;
545}
546
547wxDCCacheEntry* wxPalmDCImpl::FindDCInCache(wxDCCacheEntry* notThis, WXHDC dc)
548{
549 return NULL;
550}
551
552void wxPalmDCImpl::AddToBitmapCache(wxDCCacheEntry* entry)
553{
554}
555
556void wxPalmDCImpl::AddToDCCache(wxDCCacheEntry* entry)
557{
558}
559
560void wxPalmDCImpl::ClearCache()
561{
562}
563
564// Clean up cache at app exit
565class wxDCModule : public wxModule
566{
567public:
568 virtual bool OnInit() { return true; }
569 virtual void OnExit() { wxPalmDCImpl::ClearCache(); }
570
571private:
572 DECLARE_DYNAMIC_CLASS(wxDCModule)
573};
574
575IMPLEMENT_DYNAMIC_CLASS(wxDCModule, wxModule)
576
577#endif // wxUSE_DC_CACHEING
578
579void wxPalmDCImpl::DoGradientFillLinear (const wxRect& rect,
580 const wxColour& initialColour,
581 const wxColour& destColour,
582 wxDirection nDirection)
583{
584}
585
586#if wxUSE_DYNLIB_CLASS
587
588wxLayoutDirection wxPalmDCImpl::GetLayoutDirection() const
589{
590 DWORD layout = wxGetDCLayout(GetHdc());
591
592 if ( layout == (DWORD)-1 )
593 return wxLayout_Default;
594
595 return layout & LAYOUT_RTL ? wxLayout_RightToLeft : wxLayout_LeftToRight;
596}
597
598void wxPalmDCImpl::SetLayoutDirection(wxLayoutDirection dir)
599{
600}
601
602#else // !wxUSE_DYNLIB_CLASS
603
604// we can't provide RTL support without dynamic loading, so stub it out
605wxLayoutDirection wxPalmDCImpl::GetLayoutDirection() const
606{
607 return wxLayout_Default;
608}
609
610void wxPalmDCImpl::SetLayoutDirection(wxLayoutDirection WXUNUSED(dir))
611{
612}
613
614#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS