/* * Author: Pawel Jablonski * E-mail: pj@xirx.net * WWW: xirx.net * GIT: git.xirx.net * * License: You can use this code however you like * but leave information about the original author. * Code is free for non-commercial and commercial use. */ #include "lcdview.h" #include "font.h" /** * Constructor for the LCD view class * * @param parent Parent object */ LCDView::LCDView(QWidget *parent) : QGraphicsView(parent) { this->scene.reset(new QGraphicsScene(QRect(0, 0, WIDTH, HEIGHT), this)); QPixmap pixmap = QPixmap(WIDTH, HEIGHT); pixmap.fill(QColor(0, 0, 0)); this->pixmapItem = this->scene->addPixmap(pixmap); this->scale(2, 2); this->setScene(this->scene.data()); this->setBackgroundBrush(QBrush(QColor(0, 0, 0), Qt::SolidPattern)); this->show(); } //! Reset the LCD view pixmap canvas void LCDView::reset() { QImage image = QImage(WIDTH, HEIGHT, QImage::Format_RGB32); image.fill(QColor(0, 0, 0)); this->pixmapItem->setPixmap(QPixmap::fromImage(image)); } /** * Process a mouse press event * * @param event Mouse press event */ void LCDView::mousePressEvent(QMouseEvent *) { if(this->parentWidget()) { this->parentWidget()->setFocus(); } } /** * Draw a LCD buffer on the LCD view canvas * * @param buffer LCD buffer */ void LCDView::drawSlot(LCD::Buffer buffer) { QImage image = QImage(WIDTH, HEIGHT, QImage::Format_RGB32); image.fill(QColor(0, 0, 0)); for(int x = 0; x < LCD::WIDTH; x++) { for(int y = 0; y < LCD::HEIGHT; y++) { unsigned char c = buffer.charData[y][x]; unsigned char colorChar = (buffer.colorData[y][x] & LCD::COLOR_MASK); unsigned char colorBackground = ((buffer.colorData[y][x] >> LCD::COLOR_SHIFT) & LCD::COLOR_MASK); unsigned char colorCharBlue = ((colorChar & (1 << 0)) ? 170 : 0) + ((colorChar & (1 << 3)) ? 85 : 0); unsigned char colorCharGreen = ((colorChar & (1 << 1)) ? 180 : 0) + ((colorChar & (1 << 3)) ? 75 : 0); unsigned char colorCharRed = ((colorChar & (1 << 2)) ? 180 : 0) + ((colorChar & (1 << 3)) ? 75 : 0); unsigned char colorBackgroundBlue = ((colorBackground & (1 << 0)) ? 170 : 0) + ((colorBackground & (1 << 3)) ? 85 : 0); unsigned char colorBackgroundGreen = ((colorBackground & (1 << 1)) ? 180 : 0) + ((colorBackground & (1 << 3)) ? 75 : 0); unsigned char colorBackgroundRed = ((colorBackground & (1 << 2)) ? 180 : 0) + ((colorBackground & (1 << 3)) ? 75 : 0); for(int j = 0; j < LCD::CHAR_HEIGHT; j++) { unsigned char b = fontTable[c][j]; for(int i = 0; i < LCD::CHAR_WIDTH; i++) { if(b & 0x01) { image.setPixelColor(((x * LCD::CHAR_WIDTH) + i), ((y * LCD::CHAR_HEIGHT) + j), QColor(colorCharRed, colorCharGreen, colorCharBlue)); } else { image.setPixelColor(((x * LCD::CHAR_WIDTH) + i), ((y * LCD::CHAR_HEIGHT) + j), QColor(colorBackgroundRed, colorBackgroundGreen, colorBackgroundBlue)); } b >>= 1; } } } } this->pixmapItem->setPixmap(QPixmap::fromImage(image)); }