X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fdrv%2Flcd_gfx_qt.cpp;h=69ff66f4c2c14715f9427c2c81e9696a82c3379d;hb=41718ab2098bd5640da265c34f1ecb79a4123d39;hp=8d04471e67df6e622e5d55cc63be3e6a14992822;hpb=27cabaafe176d72d9bd634f4bd7680d7337a3f69;p=bertos.git diff --git a/bertos/drv/lcd_gfx_qt.cpp b/bertos/drv/lcd_gfx_qt.cpp index 8d04471e..69ff66f4 100644 --- a/bertos/drv/lcd_gfx_qt.cpp +++ b/bertos/drv/lcd_gfx_qt.cpp @@ -30,7 +30,6 @@ * * --> * - * \version $Id$ * \author Bernie Innocenti * * \brief Custom control for graphics LCD emulation (implementation) @@ -65,6 +64,16 @@ EmulLCD::EmulLCD(QWidget *parent) : // 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); } @@ -73,33 +82,38 @@ EmulLCD::~EmulLCD() // nop } - -QSizePolicy EmulLCD::sizePolicy() const +#if CONFIG_EMULLCD_SCALE +int EmulLCD::heightForWidth(int w) const { - return QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed, QSizePolicy::Frame); -} + 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, 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.drawImage(QPoint(frame_width, frame_width), img); } @@ -107,12 +121,16 @@ 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) @@ -120,12 +138,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 @@ -148,18 +165,18 @@ DECLARE_WALL(wall_before_raster, WALL_SIZE) static uint8_t lcd_raster[RAST_SIZE(EmulLCD::WIDTH, EmulLCD::HEIGHT)]; DECLARE_WALL(wall_after_raster, WALL_SIZE) -/** Default LCD bitmap */ -struct Bitmap lcd_bitmap; -/*extern "C"*/ void lcd_init(void) + + +/*extern "C"*/ void lcd_gfx_qt_init(Bitmap *lcd_bitmap) { //FIXME INIT_WALL(wall_before_raster); //FIXME INIT_WALL(wall_after_raster); - gfx_bitmapInit(&lcd_bitmap, lcd_raster, EmulLCD::WIDTH, EmulLCD::HEIGHT); - gfx_bitmapClear(&lcd_bitmap); + gfx_bitmapInit(lcd_bitmap, lcd_raster, EmulLCD::WIDTH, EmulLCD::HEIGHT); + gfx_bitmapClear(lcd_bitmap); } -/*extern "C"*/ void lcd_blitBitmap(Bitmap *bm) +/*extern "C"*/ void lcd_gfx_qt_blitBitmap(const Bitmap *bm) { //FIXME CHECK_WALL(wall_before_raster); //FIXME CHECK_WALL(wall_after_raster);