Switch to BITMAP_FMT_PLANAR_V_LSB.
[bertos.git] / drv / lcd_gfx_qt.cpp
1 /**
2  * \file
3  * <!--
4  * Copyright 2006 Develer S.r.l. (http://www.develer.com/)
5  * This file is part of DevLib - See README.devlib for information.
6  * -->
7  *
8  * \version $Id$
9  *
10  * \author Bernardo Innocenti <bernie@develer.com>
11  *
12  * \brief Custom control for graphics LCD emulation (interface)
13  */
14
15 /*#*
16  *#* $Log$
17  *#* Revision 1.5  2006/02/15 09:13:16  bernie
18  *#* Switch to BITMAP_FMT_PLANAR_V_LSB.
19  *#*
20  *#* Revision 1.4  2006/02/10 12:33:49  bernie
21  *#* Make emulator display a bit larger.
22  *#*
23  *#* Revision 1.3  2006/01/23 23:11:07  bernie
24  *#* Use RASTER_SIZE() to compute... err... the raster size.
25  *#*
26  *#* Revision 1.2  2006/01/17 02:30:43  bernie
27  *#* Fix QImage format.
28  *#*
29  *#* Revision 1.1  2006/01/16 03:51:35  bernie
30  *#* Add LCD Qt emulator.
31  *#*
32  *#*/
33
34 #include "lcd_gfx_qt.h"
35 #include <emul/emul.h>
36 #include <cfg/debug.h>
37 #include <gfx/gfx.h> // CONFIG_BITMAP_FMT
38
39 #include <qpainter.h>
40 #include <qimage.h>
41 #include <qsizepolicy.h>
42 #include <qsize.h>
43
44 // Display colors
45 #define LCD_FG_COLOR 0x0, 0x0, 0x0
46 #define LCD_BG_COLOR 0xBB, 0xCC, 0xBB
47
48
49 EmulLCD::EmulLCD(QWidget *parent, const char *name) :
50         QFrame(parent, name, WRepaintNoErase | WResizeNoErase),
51         fg_color(LCD_FG_COLOR),
52         bg_color(LCD_BG_COLOR)
53 {
54         // initialize bitmap
55         memset(raster, 0xAA, sizeof(raster));
56
57         // set widget frame
58         setFrameStyle(QFrame::Panel | QFrame::Sunken);
59         frame_width = frameWidth();
60 }
61
62
63 EmulLCD::~EmulLCD()
64 {
65         // nop
66 }
67
68
69 QSizePolicy EmulLCD::sizePolicy() const
70 {
71         return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed, false);
72 }
73
74
75 QSize EmulLCD::sizeHint() const
76 {
77         return QSize(
78                 WIDTH + frame_width * 2,
79                 HEIGHT + frame_width * 2);
80 }
81
82
83 void EmulLCD::drawContents(QPainter *p)
84 {
85         QImage img(raster, WIDTH, HEIGHT, 1, NULL, 0, QImage::BigEndian);
86
87         p->setBackgroundMode(OpaqueMode);
88         p->setPen(fg_color);
89         p->setBackgroundColor(bg_color);
90         p->drawImage(frame_width, frame_width, img);
91 }
92
93 void EmulLCD::writeRaster(uint8_t *new_raster)
94 {
95 #if CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_H_MSB
96
97         /* Straight copy */
98         memcpy(raster, new_raster, sizeof(raster));
99
100 #elif CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_V_LSB
101
102         /* Rotation */
103         for (int y = 0; y < HEIGHT; ++y)
104         {
105                 for (int xbyte = 0; xbyte < WIDTH/8; ++xbyte)
106                 {
107                         uint8_t v = 0;
108                         for (int xbit = 0; xbit < 8; ++xbit)
109                                 v |= (new_raster[(xbyte * 8 + xbit) + (y / 8) * WIDTH] & (1 << (y%8)) )
110                                         ? (1 << (7 - xbit)) : 0;
111
112                         raster[y * ((WIDTH + 7) / 8) + xbyte] = v;
113                 }
114         }
115
116 #else
117         #error Unsupported bitmap format
118 #endif
119
120         QPainter p(this);
121         drawContents(&p);
122 }
123
124
125
126 #include <gfx/gfx.h>
127 #include <cfg/debug.h>
128
129 /*!
130  * Raster buffer to draw into.
131  *
132  * Bits in the bitmap bytes have vertical orientation,
133  * as required by the LCD driver.
134  */
135 DECLARE_WALL(wall_before_raster, WALL_SIZE)
136 static uint8_t lcd_raster[RASTER_SIZE(EmulLCD::WIDTH, EmulLCD::HEIGHT)];
137 DECLARE_WALL(wall_after_raster, WALL_SIZE)
138
139 /*! Default LCD bitmap */
140 struct Bitmap lcd_bitmap;
141
142 /*extern "C"*/ void lcd_init(void)
143 {
144         //FIXME INIT_WALL(wall_before_raster);
145         //FIXME INIT_WALL(wall_after_raster);
146         gfx_bitmapInit(&lcd_bitmap, lcd_raster, EmulLCD::WIDTH, EmulLCD::HEIGHT);
147         gfx_bitmapClear(&lcd_bitmap);
148 }
149
150 /*extern "C"*/ void lcd_blit_bitmap(Bitmap *bm)
151 {
152         //FIXME CHECK_WALL(wall_before_raster);
153         //FIXME CHECK_WALL(wall_after_raster);
154         emul->emulLCD->writeRaster(bm->raster);
155 }
156
157 #include "lcd_gfx_qt_moc.cpp"
158