Subversion Repositories spk

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
79 cycrow 1
//************************************************************************
2
//
3
// LCDGfx.cpp
4
//
5
// The CLCDGfx class abstracts GDI/bitmap details. It is used in the
6
// OnDraw event.
7
// 
8
// Logitech LCD SDK
9
//
10
// Copyright 2005 Logitech Inc.
11
//************************************************************************
12
 
13
#include "LCDGfx.h"
14
 
15
 
16
//************************************************************************
17
//
18
// CLCDGfx::CLCDGfx
19
//
20
//************************************************************************
21
 
22
CLCDGfx::CLCDGfx(void)
23
:   m_nWidth(0),
24
    m_nHeight(0),
25
    m_pLCDScreen(NULL),
26
    m_pBitmapInfo(NULL),
27
    m_hDC(NULL),
28
    m_hBitmap(NULL),
29
    m_hPrevBitmap(NULL),
30
    m_pBitmapBits(NULL)
31
{
32
}
33
 
34
 
35
//************************************************************************
36
//
37
// CLCDGfx::~CLCDGfx
38
//
39
//************************************************************************
40
 
41
CLCDGfx::~CLCDGfx(void)
42
{
43
    Shutdown();
44
}
45
 
46
 
47
//************************************************************************
48
//
49
// CLCDGfx::Initialize
50
//
51
//************************************************************************
52
 
53
HRESULT CLCDGfx::Initialize(int nWidth, int nHeight)
54
{
55
    m_nWidth = nWidth;
56
    m_nHeight = nHeight;
57
 
58
    m_hDC = CreateCompatibleDC(NULL);
59
    if(NULL == m_hDC)
60
    {
61
        LCDUITRACE(_T("CLCDGfx::Initialize(): failed to create compatible DC.\n"));
62
        Shutdown();
63
        return E_FAIL;
64
    }
65
 
66
    int nBMISize = sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD);
67
    m_pBitmapInfo = (BITMAPINFO *) new BYTE [nBMISize];
68
    if(NULL == m_pBitmapInfo)
69
    {
70
        LCDUITRACE(_T("CLCDGfx::Initialize(): failed to allocate bitmap info.\n"));
71
        Shutdown();
72
        return E_OUTOFMEMORY;
73
    }
74
 
75
    ZeroMemory(m_pBitmapInfo, nBMISize);
76
    m_pBitmapInfo->bmiHeader.biSize = sizeof(m_pBitmapInfo->bmiHeader);
77
    m_pBitmapInfo->bmiHeader.biWidth = m_nWidth;
78
    m_pBitmapInfo->bmiHeader.biHeight = -m_nHeight;
79
    m_pBitmapInfo->bmiHeader.biPlanes = 1;
80
    m_pBitmapInfo->bmiHeader.biBitCount = 8;
81
    m_pBitmapInfo->bmiHeader.biCompression = BI_RGB;
82
    m_pBitmapInfo->bmiHeader.biSizeImage = 
83
        (m_pBitmapInfo->bmiHeader.biWidth * 
84
        m_pBitmapInfo->bmiHeader.biHeight * 
85
        m_pBitmapInfo->bmiHeader.biBitCount) / 8;
86
    m_pBitmapInfo->bmiHeader.biXPelsPerMeter = 3200;
87
    m_pBitmapInfo->bmiHeader.biYPelsPerMeter = 3200;
88
    m_pBitmapInfo->bmiHeader.biClrUsed = 256;
89
    m_pBitmapInfo->bmiHeader.biClrImportant = 256;
90
 
91
    for(int nColor = 0; nColor < 256; ++nColor)
92
    {
93
        m_pBitmapInfo->bmiColors[nColor].rgbRed = (BYTE)((nColor > 128) ? 255 : 0);
94
        m_pBitmapInfo->bmiColors[nColor].rgbGreen = (BYTE)((nColor > 128) ? 255 : 0);
95
        m_pBitmapInfo->bmiColors[nColor].rgbBlue = (BYTE)((nColor > 128) ? 255 : 0);
96
        m_pBitmapInfo->bmiColors[nColor].rgbReserved = 0;
97
    }
98
 
99
    m_hBitmap = CreateDIBSection(m_hDC, m_pBitmapInfo, DIB_RGB_COLORS, (PVOID *) &m_pBitmapBits, NULL, 0);
100
    if(NULL == m_hBitmap)
101
    {
102
        LCDUITRACE(_T("CLCDGfx::Initialize(): failed to create bitmap.\n"));
103
        Shutdown();
104
        return E_FAIL;
105
    }
106
 
107
    m_pLCDScreen = new lgLcdBitmap160x43x1;
108
    if(NULL == m_pLCDScreen)
109
    {
110
        LCDUITRACE(_T("CLCDGfx::Initialize(): failed to allocate the lcd screen structure.\n"));
111
        Shutdown();
112
        return E_OUTOFMEMORY;
113
    }
114
 
115
    return S_OK;
116
}
117
 
118
 
119
//************************************************************************
120
//
121
// CLCDGfx::Shutdown
122
//
123
//************************************************************************
124
 
125
void CLCDGfx::Shutdown(void)
126
{
127
    if(NULL != m_pLCDScreen)
128
    {
129
        delete m_pLCDScreen;
130
        m_pLCDScreen = NULL;
131
    }
132
 
133
    if(NULL != m_hBitmap)
134
    {
135
        DeleteObject(m_hBitmap);
136
        m_hBitmap = NULL;
137
        m_pBitmapBits = NULL;
138
    }
139
 
140
    LCDUIASSERT(NULL == m_hPrevBitmap);
141
    m_hPrevBitmap = NULL;
142
 
143
    if(NULL != m_pBitmapInfo)
144
    {
145
        delete [] m_pBitmapInfo;
146
        m_pBitmapInfo = NULL;
147
    }
148
 
149
    if(NULL != m_hDC)
150
    {
151
        DeleteDC(m_hDC);
152
        m_hDC = NULL;
153
    }
154
 
155
    m_nWidth = 0;
156
    m_nHeight = 0;
157
}
158
 
159
 
160
//************************************************************************
161
//
162
// CLCDGfx::BeginDraw
163
//
164
//************************************************************************
165
 
166
void CLCDGfx::BeginDraw(void)
167
{
168
    LCDUIASSERT(NULL != m_hBitmap);
169
    LCDUIASSERT(NULL == m_hPrevBitmap);
170
    if(NULL == m_hPrevBitmap)
171
    {
172
        m_hPrevBitmap = (HBITMAP) SelectObject(m_hDC, m_hBitmap);
173
        SetTextColor(m_hDC, RGB(255, 255, 255));
174
        SetBkColor(m_hDC, RGB(0, 0, 0));
175
    }
176
}
177
 
178
 
179
//************************************************************************
180
//
181
// CLCDGfx::ClearScreen
182
//
183
//************************************************************************
184
 
185
void CLCDGfx::ClearScreen(void)
186
{
187
    // this means, we're inside BeginDraw()/EndDraw()
188
    LCDUIASSERT(NULL != m_hPrevBitmap);
189
    RECT rc = { 0, 0, m_nWidth, m_nHeight };
190
    FillRect(m_hDC, &rc, (HBRUSH) GetStockObject(BLACK_BRUSH));
191
}
192
 
193
 
194
//************************************************************************
195
//
196
// CLCDGfx::SetPixel
197
//
198
//************************************************************************
199
 
200
void CLCDGfx::SetPixel(int nX, int nY, BYTE bValue)
201
{
202
    // this means, we're inside BeginDraw()/EndDraw()
203
    LCDUIASSERT(NULL != m_hPrevBitmap);
204
    ::SetPixel(m_hDC, nX, nY, bValue ? RGB(255, 255, 255) : RGB(0, 0, 0));
205
}
206
 
207
 
208
//************************************************************************
209
//
210
// CLCDGfx::DrawLine
211
//
212
//************************************************************************
213
 
214
void CLCDGfx::DrawLine(int nX1, int nY1, int nX2, int nY2)
215
{
216
    // this means, we're inside BeginDraw()/EndDraw()
217
    LCDUIASSERT(NULL != m_hPrevBitmap);
218
 
219
    HPEN hPrevPen = (HPEN) SelectObject(m_hDC, GetStockObject(WHITE_PEN));
220
    ::MoveToEx(m_hDC, nX1, nY1, NULL);
221
    ::LineTo(m_hDC, nX2, nY2);
222
    SelectObject(m_hDC, hPrevPen);
223
}
224
 
225
 
226
//************************************************************************
227
//
228
// CLCDGfx::DrawFilledRect
229
//
230
//************************************************************************
231
 
232
void CLCDGfx::DrawFilledRect(int nX, int nY, int nWidth, int nHeight)
233
{
234
    // this means, we're inside BeginDraw()/EndDraw()
235
    LCDUIASSERT(NULL != m_hPrevBitmap);
236
 
237
    HBRUSH hPrevBrush = (HBRUSH) SelectObject(m_hDC, GetStockObject(WHITE_BRUSH));
238
    RECT r = { nX, nY, nX + nWidth, nY + nHeight };
239
    ::FillRect(m_hDC, &r, hPrevBrush);
240
    SelectObject(m_hDC, hPrevBrush);
241
}
242
 
243
 
244
//************************************************************************
245
//
246
// CLCDGfx::DrawText
247
//
248
//************************************************************************
249
 
250
void CLCDGfx::DrawText(int nX, int nY, LPCTSTR sText)
251
{
252
    // map mode text, with transparency
253
    int nOldMapMode = SetMapMode(m_hDC, MM_TEXT);
254
    int nOldBkMode = SetBkMode(m_hDC, TRANSPARENT); 
255
 
256
    ::TextOut(m_hDC, nX, nY, sText, (int)_tcslen(sText));
257
 
258
    // restores
259
    SetMapMode(m_hDC, nOldMapMode);
260
    SetBkMode(m_hDC, nOldBkMode);
261
 
262
}
263
 
264
 
265
//************************************************************************
266
//
267
// CLCDGfx::EndDraw
268
//
269
//************************************************************************
270
 
271
void CLCDGfx::EndDraw(void)
272
{
273
    LCDUIASSERT(NULL != m_hPrevBitmap);
274
    if(NULL != m_hPrevBitmap)
275
    {
276
        GdiFlush();
277
        m_hPrevBitmap = (HBITMAP) SelectObject(m_hDC, m_hPrevBitmap);
278
        LCDUIASSERT(m_hPrevBitmap == m_hBitmap);
279
        m_hPrevBitmap = NULL;
280
    }
281
}
282
 
283
 
284
//************************************************************************
285
//
286
// CLCDGfx::GetHDC
287
//
288
//************************************************************************
289
 
290
HDC CLCDGfx::GetHDC(void)
291
{
292
    LCDUIASSERT(NULL != m_hDC);
293
    return m_hDC;
294
}
295
 
296
 
297
//************************************************************************
298
//
299
// CLCDGfx::GetLCDScreen
300
//
301
//************************************************************************
302
 
303
lgLcdBitmap160x43x1 *CLCDGfx::GetLCDScreen(void)
304
{
305
    LCDUIASSERT(NULL != m_pLCDScreen);
306
    if(NULL != m_pLCDScreen)
307
    {
308
        m_pLCDScreen->hdr.Format = LGLCD_BMP_FORMAT_160x43x1;
309
        memcpy(m_pLCDScreen->pixels, m_pBitmapBits, m_nWidth * m_nHeight);
310
    }
311
 
312
    return m_pLCDScreen;
313
}
314
 
315
 
316
//************************************************************************
317
//
318
// CLCDGfx::GetBitmapInfo
319
//
320
//************************************************************************
321
 
322
BITMAPINFO *CLCDGfx::GetBitmapInfo(void)
323
{
324
    LCDUIASSERT(NULL != m_pBitmapInfo);
325
    return m_pBitmapInfo;
326
}
327
 
328
 
329
//************************************************************************
330
//
331
// CLCDGfx::GetHBITMAP
332
//
333
//************************************************************************
334
 
335
HBITMAP CLCDGfx::GetHBITMAP(void)
336
{
337
    LCDUIASSERT(NULL != m_hBitmap);
338
    return m_hBitmap;
339
}
340
 
341
 
342
//** end of LCDGfx.cpp ***************************************************