1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/motif/dcmemory.cpp
3// Purpose:     wxMemoryDC class
4// Author:      Julian Smart
5// Modified by:
6// Created:     01/02/97
7// RCS-ID:      $Id: dcmemory.cpp 42755 2006-10-30 19:41:46Z VZ $
8// Copyright:   (c) Julian Smart
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#include "wx/dcmemory.h"
16
17#ifndef WX_PRECOMP
18    #include "wx/utils.h"
19    #include "wx/settings.h"
20#endif
21
22#ifdef __VMS__
23#pragma message disable nosimpint
24#endif
25#include <Xm/Xm.h>
26#ifdef __VMS__
27#pragma message enable nosimpint
28#endif
29
30#include "wx/motif/private.h"
31
32//-----------------------------------------------------------------------------
33// wxMemoryDC
34//-----------------------------------------------------------------------------
35
36IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxWindowDC)
37
38void wxMemoryDC::Init()
39{
40    m_ok = true;
41    m_display = wxGetDisplay();
42
43    Display* display = (Display*) m_display;
44
45    XGCValues gcvalues;
46    gcvalues.foreground = BlackPixel (display, DefaultScreen (display));
47    gcvalues.background = WhitePixel (display, DefaultScreen (display));
48    gcvalues.graphics_exposures = False;
49    gcvalues.subwindow_mode = IncludeInferiors;
50    gcvalues.line_width = 1;
51    m_gc = (WXGC) XCreateGC (display, RootWindow (display, DefaultScreen (display)),
52        GCForeground | GCBackground | GCGraphicsExposures | GCLineWidth | GCSubwindowMode,
53        &gcvalues);
54
55    m_backgroundPixel = gcvalues.background;
56
57    SetBrush (* wxWHITE_BRUSH);
58    SetPen (* wxBLACK_PEN);
59    SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
60}
61
62wxMemoryDC::wxMemoryDC( wxDC* dc )
63{
64    m_ok = true;
65    if (dc && dc->IsKindOf(CLASSINFO(wxWindowDC)))
66        m_display = ((wxWindowDC*)dc)->GetDisplay();
67    else
68        m_display = wxGetDisplay();
69
70    Display* display = (Display*) m_display;
71
72    XGCValues gcvalues;
73    gcvalues.foreground = BlackPixel (display, DefaultScreen (display));
74    gcvalues.background = WhitePixel (display, DefaultScreen (display));
75    gcvalues.graphics_exposures = False;
76    gcvalues.subwindow_mode = IncludeInferiors;
77    gcvalues.line_width = 1;
78    m_gc = (WXGC) XCreateGC (display, RootWindow (display, DefaultScreen (display)),
79        GCForeground | GCBackground | GCGraphicsExposures | GCLineWidth | GCSubwindowMode,
80        &gcvalues);
81
82    m_backgroundPixel = gcvalues.background;
83
84    SetBrush (* wxWHITE_BRUSH);
85    SetPen (* wxBLACK_PEN);
86}
87
88wxMemoryDC::~wxMemoryDC(void)
89{
90}
91
92void wxMemoryDC::DoSelect( const wxBitmap& bitmap )
93{
94    m_bitmap = bitmap;
95
96    if (m_gc)
97        XFreeGC((Display*) m_display, (GC) m_gc);
98    m_gc = (WXGC) NULL;
99
100    if (m_bitmap.Ok() && (bitmap.GetDisplay() == m_display))
101    {
102        m_pixmap = m_bitmap.GetDrawable();
103        Display* display = (Display*) m_display;
104
105        XGCValues gcvalues;
106        gcvalues.foreground = BlackPixel (display, DefaultScreen (display));
107        gcvalues.background = WhitePixel (display, DefaultScreen (display));
108        gcvalues.graphics_exposures = False;
109        gcvalues.subwindow_mode = IncludeInferiors;
110        gcvalues.line_width = 1;
111        m_gc = (WXGC) XCreateGC (display, (Drawable)m_pixmap/* RootWindow (display, DefaultScreen (display)) */,
112            GCForeground | GCBackground | GCGraphicsExposures | GCLineWidth | GCSubwindowMode,
113            &gcvalues);
114
115        m_backgroundPixel = gcvalues.background;
116        m_ok = true;
117
118        SetBrush (* wxWHITE_BRUSH);
119        SetPen (* wxBLACK_PEN);
120    }
121    else
122    {
123        m_ok = false;
124        m_pixmap = (WXPixmap) 0;
125    };
126}
127
128void wxMemoryDC::DoGetSize( int *width, int *height ) const
129{
130    if (m_bitmap.Ok())
131    {
132        if (width) (*width) = m_bitmap.GetWidth();
133        if (height) (*height) = m_bitmap.GetHeight();
134    }
135    else
136    {
137        if (width) (*width) = 0;
138        if (height) (*height) = 0;
139    };
140}
141