1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Forty Thieves patience game
4 // Author: Chris Breeze
8 // Copyright: (c) 1993-1998 Chris Breeze
9 // Licence: wxWindows licence
10 //---------------------------------------------------------------------------
11 // Last modified: 22nd July 1998 - ported to wxWidgets 2.0
12 /////////////////////////////////////////////////////////////////////////////
13 //+-------------------------------------------------------------+
15 //| A class for drawing playing cards.
16 //| Currently assumes that the card symbols have been
17 //| loaded into hbmap_symbols and the pictures for the
18 //| Jack, Queen and King have been loaded into
20 //+-------------------------------------------------------------+
23 #pragma implementation
27 // For compilers that support precompilation, includes "wx/wx.h".
28 #include "wx/wxprec.h"
44 #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
45 #include "pictures.xpm"
46 #include "symbols.xbm"
49 wxBitmap
* Card::m_pictureBmap
= 0;
50 wxBitmap
* Card::m_symbolBmap
= 0;
52 double Card::m_scale
= 1.0;
53 int Card::m_width
= 50;
54 int Card::m_height
= 70;
56 //+-------------------------------------------------------------+
58 //+-------------------------------------------------------------+
60 //| Constructor for a playing card. |
61 //| Checks that the value is in the range 1..52 and then |
62 //| initialises the suit, colour, pipValue and wayUp. |
63 //+-------------------------------------------------------------+
64 Card::Card(int value
, WayUp way_up
) :
70 m_symbolBmap
= new wxBitmap(_T("CardSymbols"), wxBITMAP_TYPE_BMP_RESOURCE
);
72 m_symbolBmap
= new wxBitmap(Symbols_bits
, Symbols_width
, Symbols_height
);
74 if (!m_symbolBmap
->Ok())
76 ::wxMessageBox(_T("Failed to load bitmap CardSymbols"), _T("Error"));
82 m_pictureBmap
= new wxBitmap(_T("CardPictures"), wxBITMAP_TYPE_BMP_RESOURCE
);
84 m_pictureBmap
= new wxBitmap(Pictures
);
86 if (!m_pictureBmap
->Ok())
88 ::wxMessageBox(_T("Failed to load bitmap CardPictures"), _T("Error"));
92 if (value
>= 1 && value
<= PackSize
)
94 switch ((value
- 1) / 13)
113 m_pipValue
= 1 + (value
- 1) % 13;
123 //+-------------------------------------------------------------+
124 //| Card::SetScale() |
125 //+-------------------------------------------------------------+
127 //| Scales the cards |
128 //+-------------------------------------------------------------+
129 void Card::SetScale(double scale
)
132 m_width
= int(50*scale
);
133 m_height
= int(70*scale
);
136 //+-------------------------------------------------------------+
138 //+-------------------------------------------------------------+
140 //| Destructor - nothing to do at present. |
141 //+-------------------------------------------------------------+
147 //+-------------------------------------------------------------+
149 //+-------------------------------------------------------------+
151 //| Erase the card at (x, y) by drawing a rectangle in the |
152 //| background colour. |
153 //+-------------------------------------------------------------+
154 void Card::Erase(wxDC
& dc
, int x
, int y
)
156 wxPen
* pen
= wxThePenList
->FindOrCreatePen(
157 FortyApp::BackgroundColour(),
162 dc
.SetBrush(FortyApp::BackgroundBrush());
163 dc
.DrawRectangle(x
, y
, m_width
, m_height
);
167 //+-------------------------------------------------------------+
169 //+-------------------------------------------------------------+
171 //| Draw the card at (x, y). |
172 //| If the card is facedown draw the back of the card. |
173 //| If the card is faceup draw the front of the card. |
174 //| Cards are not held in bitmaps, instead they are drawn |
175 //| from their constituent parts when required. |
176 //| hbmap_symbols contains large and small suit symbols and |
177 //| pip values. These are copied to the appropriate part of |
178 //| the card. Picture cards use the pictures defined in |
179 //| hbmap_pictures. Note that only one picture is defined |
180 //| for the Jack, Queen and King, unlike a real pack where |
181 //| each suit is different. |
184 //| The locations of these symbols is 'hard-wired' into the |
185 //| code. Editing the bitmaps or the numbers below will |
186 //| result in the wrong symbols being displayed. |
187 //+-------------------------------------------------------------+
188 void Card::Draw(wxDC
& dc
, int x
, int y
)
190 wxBrush
backgroundBrush( dc
.GetBackground() );
191 dc
.SetBrush(* wxWHITE_BRUSH
);
192 dc
.SetPen(* wxBLACK_PEN
);
193 dc
.DrawRoundedRectangle(x
, y
, m_width
, m_height
, 4);
194 if (m_wayUp
== facedown
)
196 dc
.SetBackground(* wxRED_BRUSH
);
197 dc
.SetBackgroundMode(wxSOLID
);
198 wxBrush
* brush
= wxTheBrushList
->FindOrCreateBrush(
199 _T("BLACK"), wxCROSSDIAG_HATCH
201 dc
.SetBrush(* brush
);
203 dc
.DrawRoundedRectangle(
205 m_width
- 8, m_height
- 8,
213 memoryDC
.SelectObject(*m_symbolBmap
);
215 // dc.SetBackgroundMode(wxTRANSPARENT);
217 dc
.SetTextBackground(*wxWHITE
);
222 dc
.SetTextForeground(*wxBLACK
);
226 dc
.SetTextForeground(*wxRED
);
236 int pipsize
,pippos
,valueheight
,valuewidth
;
256 dc
.Blit((wxCoord
)(x
+ m_scale
*3),
257 (wxCoord
)(y
+ m_scale
*3),
261 valuewidth
* (m_pipValue
- 1),
264 dc
.Blit((wxCoord
)(x
+ m_width
- m_scale
*3 - valuewidth
),
265 (wxCoord
)(y
+ m_height
- valueheight
- m_scale
*3),
269 valuewidth
* (m_pipValue
- 1),
270 valuepos
+valueheight
,
274 dc
.Blit((wxCoord
)(x
+ m_scale
*3 + valuewidth
+2),
275 (wxCoord
)(y
+ m_scale
*3),
282 dc
.Blit((wxCoord
)(x
+ m_width
- m_scale
*3-valuewidth
-pipsize
-2),
283 (wxCoord
)(y
+ m_height
- pipsize
- m_scale
*3),
294 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
295 (wxCoord
)(y
- m_scale
*5 + m_height
/ 2),
305 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
306 (wxCoord
)(y
- symdist
+ m_height
/ 2),
314 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
315 (wxCoord
)(y
- symdist
+ m_height
/ 4),
322 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
323 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
333 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
334 (wxCoord
)(y
- symdist
+ m_height
/ 2),
342 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
343 (wxCoord
)(y
- symdist
+ m_height
/ 4),
350 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
351 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
358 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
359 (wxCoord
)(y
- symdist
+ m_height
/ 4),
366 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
367 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
377 dc
.Blit((wxCoord
)(x
- symdist
+ 5 * m_width
/ 10),
378 (wxCoord
)(y
- symdist
+ 5 * m_height
/ 8),
386 dc
.Blit((wxCoord
)(x
- symdist
+ 5 * m_width
/ 10),
387 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 8),
395 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
396 (wxCoord
)(y
- symdist
+ m_height
/ 4),
399 &memoryDC
, symsize
* m_suit
, sympos
, wxCOPY
);
400 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
401 (wxCoord
)(y
- symdist
+ m_height
/ 2),
408 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
409 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
416 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
417 (wxCoord
)(y
- symdist
+ m_height
/ 4),
424 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
425 (wxCoord
)(y
- symdist
+ m_height
/ 2),
432 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
433 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
443 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
444 (wxCoord
)(y
- symdist
+ 2 * m_height
/ 3),
452 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
453 (wxCoord
)(y
- symdist2
+ m_height
/ 4),
460 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
461 (wxCoord
)(y
- symdist2
+ 5 * m_height
/ 12),
468 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
469 (wxCoord
)(y
- symdist
+ 7 * m_height
/ 12),
476 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 4),
477 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
485 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
486 (wxCoord
)(y
- symdist2
+ m_height
/ 4),
493 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
494 (wxCoord
)(y
- symdist2
+ 5 * m_height
/ 12),
501 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
502 (wxCoord
)(y
- symdist
+ 7 * m_height
/ 12),
509 dc
.Blit((wxCoord
)(x
- symdist
+ 3 * m_width
/ 4),
510 (wxCoord
)(y
- symdist
+ 3 * m_height
/ 4),
517 dc
.Blit((wxCoord
)(x
- symdist
+ m_width
/ 2),
518 (wxCoord
)(y
- symdist
+ m_height
/ 3),
529 memoryDC
.SelectObject(*m_pictureBmap
);
530 int picwidth
= 40,picheight
= 45;
531 dc
.Blit((wxCoord
)(x
+ (m_width
-picwidth
)/2),
532 (wxCoord
)(y
- picheight
/2 + m_height
/2),
536 picwidth
* (m_pipValue
- 11),
540 memoryDC
.SelectObject(*m_symbolBmap
);
541 dc
.Blit((wxCoord
)(x
+ m_width
-(m_width
-picwidth
)/2-symsize
-3),
542 (wxCoord
)(y
- picheight
/2+m_height
/2+1),
549 dc
.Blit((wxCoord
)(x
+ (m_width
-picwidth
)/2+2),
550 (wxCoord
)(y
+ picheight
/2 + m_height
/2-symsize
),
561 dc
.SetBackground( backgroundBrush
);
565 //+-------------------------------------------------------------+
566 //| Card::DrawNullCard() |
567 //+-------------------------------------------------------------+
569 //| Draws the outline of a card at (x, y). |
570 //| Used to draw place holders for empty piles of cards. |
571 //+-------------------------------------------------------------+
572 void Card::DrawNullCard(wxDC
& dc
, int x
, int y
)
574 wxPen
* pen
= wxThePenList
->FindOrCreatePen(FortyApp::TextColour(), 1, wxSOLID
);
575 dc
.SetBrush(FortyApp::BackgroundBrush());
577 dc
.DrawRoundedRectangle(x
, y
, m_width
, m_height
, 4);
578 } // Card::DrawNullCard()