From f227bdbc4e8dc38fc26b1ee92adcda17dc8bd1cf Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Mon, 15 Oct 2018 14:36:22 -0700 Subject: [PATCH] Make 8Bpp mode output the correct colors --- bugs/unimplementedHardware.txt | 2 +- tools/desktop/MakePalmIcon/MakePalmIcon.pro | 4 + tools/desktop/MakePalmIcon/main.cpp | 105 ++++++++++++++++++-- 3 files changed, 103 insertions(+), 8 deletions(-) diff --git a/bugs/unimplementedHardware.txt b/bugs/unimplementedHardware.txt index 4118a88..68d64ff 100644 --- a/bugs/unimplementedHardware.txt +++ b/bugs/unimplementedHardware.txt @@ -32,7 +32,6 @@ Debug tools: ADS7846 channels can't be read in single reference mode in hwTestSuite MakePalmBitmap: -8bpp bitmaps have corrupt palettes Memory: SD card can't be read or written to by Palm OS @@ -51,6 +50,7 @@ in the edge case that SPICLK2 is disabled while using ADS7846 and a 1 was the la Fixed: +MakePalmIcon 8bpp bitmaps have corrupt palettes missing home screen icons EMUCS memory range is unemulated(used for emu registers if enabled, invalid access otherwise) port g data bit 2 may need to be 0 to access ADS7846(it is) diff --git a/tools/desktop/MakePalmIcon/MakePalmIcon.pro b/tools/desktop/MakePalmIcon/MakePalmIcon.pro index 41327cb..6b3c72d 100644 --- a/tools/desktop/MakePalmIcon/MakePalmIcon.pro +++ b/tools/desktop/MakePalmIcon/MakePalmIcon.pro @@ -15,6 +15,10 @@ DEFINES += QT_DEPRECATED_WARNINGS # You can also select to disable deprecated APIs only up to a certain version of Qt. DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 +macx { + CONFIG += sdk_no_version_check # using 10.14 SDK which Qt only unofficialy supports +} + SOURCES += \ main.cpp diff --git a/tools/desktop/MakePalmIcon/main.cpp b/tools/desktop/MakePalmIcon/main.cpp index ba45b71..b1ed57a 100644 --- a/tools/desktop/MakePalmIcon/main.cpp +++ b/tools/desktop/MakePalmIcon/main.cpp @@ -17,6 +17,94 @@ #define MAX_PALM_BITMAP_SIZE (0xFFFF * 4) +static const uint8_t palmPalette8Bpp[256][3] = { + { 255, 255, 255 }, { 255, 204, 255 }, { 255, 153, 255 }, { 255, 102, 255 }, + { 255, 51, 255 }, { 255, 0, 255 }, { 255, 255, 204 }, { 255, 204, 204 }, + { 255, 153, 204 }, { 255, 102, 204 }, { 255, 51, 204 }, { 255, 0, 204 }, + { 255, 255, 153 }, { 255, 204, 153 }, { 255, 153, 153 }, { 255, 102, 153 }, + { 255, 51, 153 }, { 255, 0, 153 }, { 204, 255, 255 }, { 204, 204, 255 }, + { 204, 153, 255 }, { 204, 102, 255 }, { 204, 51, 255 }, { 204, 0, 255 }, + { 204, 255, 204 }, { 204, 204, 204 }, { 204, 153, 204 }, { 204, 102, 204 }, + { 204, 51, 204 }, { 204, 0, 204 }, { 204, 255, 153 }, { 204, 204, 153 }, + { 204, 153, 153 }, { 204, 102, 153 }, { 204, 51, 153 }, { 204, 0, 153 }, + { 153, 255, 255 }, { 153, 204, 255 }, { 153, 153, 255 }, { 153, 102, 255 }, + { 153, 51, 255 }, { 153, 0, 255 }, { 153, 255, 204 }, { 153, 204, 204 }, + { 153, 153, 204 }, { 153, 102, 204 }, { 153, 51, 204 }, { 153, 0, 204 }, + { 153, 255, 153 }, { 153, 204, 153 }, { 153, 153, 153 }, { 153, 102, 153 }, + { 153, 51, 153 }, { 153, 0, 153 }, { 102, 255, 255 }, { 102, 204, 255 }, + { 102, 153, 255 }, { 102, 102, 255 }, { 102, 51, 255 }, { 102, 0, 255 }, + { 102, 255, 204 }, { 102, 204, 204 }, { 102, 153, 204 }, { 102, 102, 204 }, + { 102, 51, 204 }, { 102, 0, 204 }, { 102, 255, 153 }, { 102, 204, 153 }, + { 102, 153, 153 }, { 102, 102, 153 }, { 102, 51, 153 }, { 102, 0, 153 }, + { 51, 255, 255 }, { 51, 204, 255 }, { 51, 153, 255 }, { 51, 102, 255 }, + { 51, 51, 255 }, { 51, 0, 255 }, { 51, 255, 204 }, { 51, 204, 204 }, + { 51, 153, 204 }, { 51, 102, 204 }, { 51, 51, 204 }, { 51, 0, 204 }, + { 51, 255, 153 }, { 51, 204, 153 }, { 51, 153, 153 }, { 51, 102, 153 }, + { 51, 51, 153 }, { 51, 0, 153 }, { 0, 255, 255 }, { 0, 204, 255 }, + { 0, 153, 255 }, { 0, 102, 255 }, { 0, 51, 255 }, { 0, 0, 255 }, + { 0, 255, 204 }, { 0, 204, 204 }, { 0, 153, 204 }, { 0, 102, 204 }, + { 0, 51, 204 }, { 0, 0, 204 }, { 0, 255, 153 }, { 0, 204, 153 }, + { 0, 153, 153 }, { 0, 102, 153 }, { 0, 51, 153 }, { 0, 0, 153 }, + { 255, 255, 102 }, { 255, 204, 102 }, { 255, 153, 102 }, { 255, 102, 102 }, + { 255, 51, 102 }, { 255, 0, 102 }, { 255, 255, 51 }, { 255, 204, 51 }, + { 255, 153, 51 }, { 255, 102, 51 }, { 255, 51, 51 }, { 255, 0, 51 }, + { 255, 255, 0 }, { 255, 204, 0 }, { 255, 153, 0 }, { 255, 102, 0 }, + { 255, 51, 0 }, { 255, 0, 0 }, { 204, 255, 102 }, { 204, 204, 102 }, + { 204, 153, 102 }, { 204, 102, 102 }, { 204, 51, 102 }, { 204, 0, 102 }, + { 204, 255, 51 }, { 204, 204, 51 }, { 204, 153, 51 }, { 204, 102, 51 }, + { 204, 51, 51 }, { 204, 0, 51 }, { 204, 255, 0 }, { 204, 204, 0 }, + { 204, 153, 0 }, { 204, 102, 0 }, { 204, 51, 0 }, { 204, 0, 0 }, + { 153, 255, 102 }, { 153, 204, 102 }, { 153, 153, 102 }, { 153, 102, 102 }, + { 153, 51, 102 }, { 153, 0, 102 }, { 153, 255, 51 }, { 153, 204, 51 }, + { 153, 153, 51 }, { 153, 102, 51 }, { 153, 51, 51 }, { 153, 0, 51 }, + { 153, 255, 0 }, { 153, 204, 0 }, { 153, 153, 0 }, { 153, 102, 0 }, + { 153, 51, 0 }, { 153, 0, 0 }, { 102, 255, 102 }, { 102, 204, 102 }, + { 102, 153, 102 }, { 102, 102, 102 }, { 102, 51, 102 }, { 102, 0, 102 }, + { 102, 255, 51 }, { 102, 204, 51 }, { 102, 153, 51 }, { 102, 102, 51 }, + { 102, 51, 51 }, { 102, 0, 51 }, { 102, 255, 0 }, { 102, 204, 0 }, + { 102, 153, 0 }, { 102, 102, 0 }, { 102, 51, 0 }, { 102, 0, 0 }, + { 51, 255, 102 }, { 51, 204, 102 }, { 51, 153, 102 }, { 51, 102, 102 }, + { 51, 51, 102 }, { 51, 0, 102 }, { 51, 255, 51 }, { 51, 204, 51 }, + { 51, 153, 51 }, { 51, 102, 51 }, { 51, 51, 51 }, { 51, 0, 51 }, + { 51, 255, 0 }, { 51, 204, 0 }, { 51, 153, 0 }, { 51, 102, 0 }, + { 51, 51, 0 }, { 51, 0, 0 }, { 0, 255, 102 }, { 0, 204, 102 }, + { 0, 153, 102 }, { 0, 102, 102 }, { 0, 51, 102 }, { 0, 0, 102 }, + { 0, 255, 51 }, { 0, 204, 51 }, { 0, 153, 51 }, { 0, 102, 51 }, + { 0, 51, 51 }, { 0, 0, 51 }, { 0, 255, 0 }, { 0, 204, 0 }, + { 0, 153, 0 }, { 0, 102, 0 }, { 0, 51, 0 }, { 17, 17, 17 }, + { 34, 34, 34 }, { 68, 68, 68 }, { 85, 85, 85 }, { 119, 119, 119 }, + { 136, 136, 136 }, { 170, 170, 170 }, { 187, 187, 187 }, { 221, 221, 221 }, + { 238, 238, 238 }, { 192, 192, 192 }, { 128, 0, 0 }, { 128, 0, 128 }, + { 0, 128, 0 }, { 0, 128, 128 }, { 0, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, + { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } +}; + + +static inline uint16_t getRgbDiff(uint8_t r1, uint8_t g1, uint8_t b1, uint8_t r2, uint8_t g2, uint8_t b2){ + return qMax(r1, r2) - qMin(r1, r2) + qMax(g1, g2) - qMin(g1, g2) + qMax(b1, b2) - qMin(b1, b2); +} + +static inline uint8_t getBest8BppIndex(uint8_t r, uint8_t g, uint8_t b){ + uint16_t closeness = 0xFFFF; + uint8_t bestIndex; + + for(uint16_t count = 0; count < 256; count++){ + uint16_t thisDiff = getRgbDiff(r, g, b, palmPalette8Bpp[count][0], palmPalette8Bpp[count][1], palmPalette8Bpp[count][2]); + + if(thisDiff < closeness){ + closeness = thisDiff; + bestIndex = count; + } + } + + return bestIndex; +} + static inline void writeBe16(uint8_t* data, uint16_t value){ #if Q_BYTE_ORDER != Q_BIG_ENDIAN value = value >> 8 | value << 8; @@ -44,7 +132,9 @@ static inline uint16_t getNextDepthOffset(int16_t width, int16_t height, uint8_t nextDepthOffset += BITMAP_HEADER_SIZE; if(bitsPerPixel == 16) nextDepthOffset += BITMAP_DIRECT_INFO_TYPE_SIZE; - //nextDepthOffset += 0xFF;//custom palette is not supported + //custom palette is not supported right now + //if(bitsPerPixel == 8) + // nextDepthOffset += 0xFF; nextDepthOffset += getRowBytes(width, bitsPerPixel) * height; return nextDepthOffset / 4; @@ -101,8 +191,10 @@ void renderTo8Bits(uint8_t* data, const QImage& image){ for(int16_t x = 0; x < image.width(); x++){ QColor pixel = QColor(image.pixel(x, y)); - //may need to dump the LUT from a Palm ROM - data[y * rowBytes + x] = (pixel.red() >> 5 & 0x07) << 5 | (pixel.green() >> 5 & 0x07) << 2 | (pixel.blue() >> 6 & 0x03); + if(pixel.red() == 0xFF && pixel.green() == 0xFF && pixel.blue() == 0xFF) + data[y * rowBytes + x] = 0xFF;//transparentIndex + else + data[y * rowBytes + x] = getBest8BppIndex(pixel.red(), pixel.green(), pixel.blue()); } } } @@ -122,14 +214,13 @@ void renderTo16Bits(uint8_t* data, const QImage& image){ } uint32_t renderPalmIcon(const QString& svg, uint8_t* output, int16_t width, int16_t height, uint8_t bitsPerPixel, bool lastBitmap){ - QImage canvas(width, height, QImage::Format_RGB16); + QImage canvas(width, height, QImage::Format_RGB32); QPainter painter(&canvas); QSvgRenderer svgRenderer(svg); uint32_t offset = 0; //clear buffer to white and render - for(int16_t count = 0; count < height; count++) - memset(canvas.scanLine(count), 0xFF, width * sizeof(uint16_t)); + canvas.fill(QColor(0xFF, 0xFF, 0xFF).rgb()); svgRenderer.render(&painter); //write a Palm bitmap struct @@ -152,7 +243,7 @@ uint32_t renderPalmIcon(const QString& svg, uint8_t* output, int16_t width, int1 if(bitmapVersion > 1){ output[offset] = 0xFF;//transparentIndex, white is transparent, not doing this causes issues on Palm OS5+ offset += sizeof(uint8_t); - output[offset] = 0xFF;//compressionType + output[offset] = 0xFF;//compressionType, none offset += sizeof(uint8_t); } else{