X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Flcd_gfx_qt.cpp;h=b7a2e519273f1294af261d60cc055af7c4692e5d;hb=ce5ddc07440aeb1357c7133beac6959b90d21885;hp=551b48e548e8ac6be84849bdeb471b9d52e7fd3d;hpb=12d9dad31b996e2787aef90dbafb18ecd52321ad;p=bertos.git diff --git a/bertos/drv/lcd_gfx_qt.cpp b/bertos/drv/lcd_gfx_qt.cpp index 551b48e5..b7a2e519 100644 --- a/bertos/drv/lcd_gfx_qt.cpp +++ b/bertos/drv/lcd_gfx_qt.cpp @@ -26,15 +26,14 @@ * invalidate any other reasons why the executable file might be covered by * the GNU General Public License. * - * Copyright 2006 Develer S.r.l. (http://www.develer.com/) + * Copyright 2006, 2008 Develer S.r.l. (http://www.develer.com/) * * --> * * \version $Id$ - * * \author Bernie Innocenti * - * \brief Custom control for graphics LCD emulation (interface) + * \brief Custom control for graphics LCD emulation (implementation) */ #include "lcd_gfx_qt.h" @@ -52,17 +51,30 @@ #define LCD_BG_COLOR 0xBB, 0xCC, 0xBB -EmulLCD::EmulLCD(QWidget *parent, const char *name) : - QFrame(parent, name, Qt::WRepaintNoErase | Qt::WResizeNoErase), +EmulLCD::EmulLCD(QWidget *parent) : + QFrame(parent), fg_color(LCD_FG_COLOR), - bg_color(LCD_BG_COLOR) + bg_brush(QColor(LCD_BG_COLOR)) { + // Optimized rendering: we repaint everything anyway + setAttribute(Qt::WA_NoSystemBackground); + // initialize bitmap memset(raster, 0xAA, sizeof(raster)); // set widget frame setFrameStyle(QFrame::Panel | QFrame::Sunken); frame_width = frameWidth(); + + setMinimumSize(WIDTH + frame_width * 2, HEIGHT + frame_width * 2); + + #if CONFIG_EMULLCD_SCALE + QSizePolicy pol = QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred, QSizePolicy::Frame); + pol.setHeightForWidth(true); + #else + QSizePolicy pol = QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed, QSizePolicy::Frame); + #endif + setSizePolicy(pol); } @@ -71,46 +83,55 @@ EmulLCD::~EmulLCD() // nop } - -QSizePolicy EmulLCD::sizePolicy() const +#if CONFIG_EMULLCD_SCALE +int EmulLCD::heightForWidth(int w) const { - return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed, false); -} + int h; + w -= frame_width * 2; + h = (w * HEIGHT + WIDTH/2) / WIDTH; + h += frame_width * 2; -QSize EmulLCD::sizeHint() const -{ - return QSize( - WIDTH + frame_width * 2, - HEIGHT + frame_width * 2); -} - -QSize EmulLCD::minimumSizeHint() const -{ - return sizeHint(); + return h; } +#endif // CONFIG_EMULLCD_SCALE void EmulLCD::paintEvent(QPaintEvent * /*event*/) { QPainter p(this); - QImage img(raster, WIDTH, HEIGHT, 1, NULL, 0, QImage::BigEndian); + QImage img(raster, WIDTH, HEIGHT, QImage::Format_Mono); + + #if CONFIG_EMULLCD_SCALE + int w = width() - frame_width * 2; + int h = height() - frame_width * 2; + if ((w != WIDTH) || (h != HEIGHT)) + { + p.scale((qreal)w / WIDTH, (qreal)h / HEIGHT); + //p.setRenderHint(QPainter::SmoothPixmapTransform); + } + #endif // CONFIG_EMULLCD_SCALE p.setBackgroundMode(Qt::OpaqueMode); + p.setBackground(bg_brush); p.setPen(fg_color); - p.setBackgroundColor(bg_color); - p.drawImage(frame_width, frame_width, img); + + p.drawImage(QPoint(frame_width, frame_width), img); } void EmulLCD::writeRaster(uint8_t *new_raster) { #if CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_H_MSB - /* Straight copy */ - memcpy(raster, new_raster, sizeof(raster)); + // Straight copy + //memcpy(raster, new_raster, sizeof(raster)); + + // Inverting copy + for (int i = 0; i < (int)sizeof(raster); ++i) + raster[i] = ~new_raster[i]; #elif CONFIG_BITMAP_FMT == BITMAP_FMT_PLANAR_V_LSB - /* Rotation */ + // Rotation + inversion for (int y = 0; y < HEIGHT; ++y) { for (int xbyte = 0; xbyte < WIDTH/8; ++xbyte) @@ -118,12 +139,11 @@ void EmulLCD::writeRaster(uint8_t *new_raster) uint8_t v = 0; for (int xbit = 0; xbit < 8; ++xbit) v |= (new_raster[(xbyte * 8 + xbit) + (y / 8) * WIDTH] & (1 << (y%8)) ) - ? 0 : (1 << (7 - xbit)); + ? (1 << (7 - xbit)) : 0; raster[y * ((WIDTH + 7) / 8) + xbyte] = v; } } - #else #error Unsupported bitmap format #endif