From b412d4c279a569c5d7e1f405656cff3340b4e233 Mon Sep 17 00:00:00 2001 From: Zachary Hall Date: Fri, 17 Nov 2023 12:30:24 -0800 Subject: [PATCH] Initial commit. --- .gitignore | 2 + .vscode/launch.json | 113 +++++++++++++++ .vscode/settings.json | 10 ++ .vscode/tasks.json | 15 ++ LICENSE | 10 ++ PACK.png | Bin 0 -> 294 bytes README.md | 24 +++ TEST.png | Bin 0 -> 98751 bytes bitmapx16.cpp | 330 ++++++++++++++++++++++++++++++++++++++++++ bitmapx16.h | 137 ++++++++++++++++++ main.cpp | 220 ++++++++++++++++++++++++++++ meson.build | 18 +++ palette.cpp | 35 +++++ palette.h | 17 +++ test.sh | 24 +++ 15 files changed, 955 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 LICENSE create mode 100644 PACK.png create mode 100644 README.md create mode 100644 TEST.png create mode 100644 bitmapx16.cpp create mode 100644 bitmapx16.h create mode 100644 main.cpp create mode 100644 meson.build create mode 100644 palette.cpp create mode 100644 palette.h create mode 100755 test.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8914997 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +builddir/ +testout/ diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..18b30e2 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,113 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Generate automatic bitmap", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/builddir/graphicsconverter", + "args": [ + "-in", "TEST.png", + "-out", "testout/TEST.B16" + ], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "additionalSOLibSearchPath": "/home/catmeow/.cache/debuginfod_client/", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + }, + { + "description": "Enable debuginfod", + "text": "-gdb-set debuginfod enabled on", + "ignoreFailures": true + } + ], + "preLaunchTask": "build" + }, + { + "name": "Convert file to PNG", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/builddir/graphicsconverter", + "args": [ + "-reverse", + "-in", "testout/PACK.16P.2B.B16", + "-out", "testout/PACK.16P.2B.PNG", + "-type", "t" + ], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "additionalSOLibSearchPath": "/home/catmeow/.cache/debuginfod_client/", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + }, + { + "description": "Enable debuginfod", + "text": "-gdb-set debuginfod enabled on", + "ignoreFailures": true + } + ], + "preLaunchTask": "build" + }, + { + "name": "Load invalid file", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceRoot}/builddir/graphicsconverter", + "args": [ + "-in", "/dev/null/invalid", + "-out", "/dev/null", + ], + "stopAtEntry": false, + "cwd": "${workspaceRoot}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "additionalSOLibSearchPath": "/home/catmeow/.cache/debuginfod_client/", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + }, + { + "description": "Set Disassembly Flavor to Intel", + "text": "-gdb-set disassembly-flavor intel", + "ignoreFailures": true + }, + { + "description": "Enable debuginfod", + "text": "-gdb-set debuginfod enabled on", + "ignoreFailures": true + } + ], + "preLaunchTask": "build" + } + + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7325b68 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "C_Cpp.default.compileCommands": "builddir/compile_commands.json", + "mesonbuild.configureOnOpen": true, + "files.associations": { + "cstdint": "cpp", + "iosfwd": "cpp", + "*.ipp": "cpp", + "ios": "cpp" + } +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..0f10cd8 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,15 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "meson", + "target": "graphicsconverter:executable", + "mode": "build", + "problemMatcher": [ + "$meson-gcc" + ], + "group": "build", + "label": "build" + } + ] +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8a5a266 --- /dev/null +++ b/LICENSE @@ -0,0 +1,10 @@ + + +Copyright 2023 Zachary Hall + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/PACK.png b/PACK.png new file mode 100644 index 0000000000000000000000000000000000000000..a964d57ea02af7b7b1f424b54dd3c1dbb54a2c60 GIT binary patch literal 294 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 m(I_VOVB literal 0 HcmV?d00001 diff --git a/bitmapx16.cpp b/bitmapx16.cpp new file mode 100644 index 0000000..f571f72 --- /dev/null +++ b/bitmapx16.cpp @@ -0,0 +1,330 @@ +#include "bitmapx16.h" +#include +#include +#include +#define X16_IMG_START (512+32) +BitmapX16DebugFlags BitmapX16::debug = DebugNone; +float closeness_to_color(PaletteEntry a, PaletteEntry b) { + float closeness = ((float)((((float)a.r - (float)b.r) * (1 << 4)) + (((float)a.g - (float)b.g) * (1 << 8)) + ((float)a.b - (float)b.b))); + if (closeness < 0.0f) { + closeness = -closeness; + } + return closeness; +} +void BitmapX16::set_bpp(uint8_t bpp) { + this->bpp = bpp; + quantize_colors = true; + if (get_significant() >= (1 << bpp)) { + set_significant((1 << bpp) - 1); + } +} +uint8_t BitmapX16::get_bpp() { + return bpp; +} +void BitmapX16::set_significant(uint8_t value) { + if (value >= (1 << bpp)) { + value = (1 << bpp) - 1; + } + significant_count = value; + quantize_colors = true; +} +uint8_t BitmapX16::get_significant() { + return significant_count; +} +size_t BitmapX16::get_width() { + return w; +} +size_t BitmapX16::get_height() { + return h; +} +void BitmapX16::enable_dithering(bool enabled) { + dither = enabled; +} +bool BitmapX16::dithering_enabled() { + return dither; +} +void BitmapX16::resize(size_t w, size_t h) { + printf("Resizing image to: (%lu, %lu)\n", w, h); + image->resize(Geometry(w, h)); +} +void BitmapX16::queue_resize(size_t w, size_t h) { + tw = w; + th = h; +} +void BitmapX16::apply() { + if (tw != 0 && th != 0) { + resize(tw, th); + tw = 0; + th = 0; + } + if (bpp == 0) { + bpp = 8; + quantize_colors = true; + } + if (significant_count == 0) { + significant_count = (1 << bpp) - 1; + quantize_colors = true; + } + if (quantize_colors) { + image->quantizeColors(significant_count); + image->quantizeDither(dither); + if (dither) { + image->quantizeDitherMethod(Magick::FloydSteinbergDitherMethod); + } + image->quantize(); + generate_palette(); + } +} +uint8_t BitmapX16::extra_to_real_palette(uint8_t idx) { + return image_palette_count + idx; +} +void BitmapX16::write_x16(const char *filename) { + vector buf; + size_t bufsize; + uint8_t pixels_per_byte; + vector pixels; + size_t pixelCount; + pixels_per_byte = (8/bpp); + apply(); + w = image->columns(); + h = image->rows(); + printf("Image size: (%lu, %lu)\n", w, h); + pixelCount = w * h * 3; + pixels.resize(pixelCount); + bufsize = 512+32+((w*h)/pixels_per_byte); + buf.resize(bufsize); + memset(buf.data(), 0, bufsize); + buf[0] = 0x42; + buf[1] = 0x4D; + buf[2] = 0x58; + buf[3] = 1; // Version + buf[4] = bpp; + + switch (bpp) { + case 1: + buf[5] = 0; + break; + case 2: + buf[5] = 1; + break; + case 4: + buf[5] = 2; + break; + case 8: + buf[5] = 3; + break; + default: + printf("Error: Invalid bit depth.\n"); + throw std::exception(); + break; + } + buf[6] = w; + buf[7] = w >> 8; + buf[8] = h; + buf[9] = h >> 8; + buf[10] = extra_to_real_palette(border); + buf[11] = significant_count; + buf[12] = significant_start; + for (size_t i = 13; i < 32; i++) { + buf[i] = 0; // Reserved bytes. + } + for (size_t i = 0; i < 256; i++) { + palette[i].write(buf.data() + (32+(i*2))); + } + for (size_t i = 0, x = 0, y = 0; i < (w * h); i++, x++) { + if (x >= w) { + x -= w; + y += 1; + } + ColorRGB px = image->pixelColor(x, y); + size_t imagestart = (32+512); + size_t pixelIdx = get_pixel_idx(x, y); + size_t imagebyteidx = get_byte_idx(pixelIdx); + uint8_t pixelinbyte = get_inner_idx(pixelIdx); + buf[imagestart + imagebyteidx] |= (color_to_palette_entry(px) & get_bitmask()) << (bpp * pixelinbyte); + } + printf("Writing output file %s...\n", filename); + std::ofstream outfile(filename,std::ofstream::binary); + outfile.write((const char*)buf.data(), bufsize); + outfile.close(); + loaded = true; +} +void BitmapX16::load_x16(const char *filename) { + vector buf; + size_t bufsize = 0; + size_t bufpos = 0; + uint8_t pixels_per_byte; + vector pixels; + bufsize = 3; + buf.resize(bufsize); + std::ifstream infile(filename, std::ifstream::binary); + infile.read((char*)buf.data() + bufpos, bufsize - bufpos); + bufpos += bufsize - bufpos; + uint8_t magic[3] = {0x42, 0x4D, 0x58}; + for (uint8_t i = 0; i < 3; i++) { + if (buf[i] != magic[i]) { + printf("Error: Invalid magic bytes.\n"); + throw std::exception(); + } + } + bufsize += 10; + buf.resize(bufsize); + infile.read((char*)buf.data() + bufpos, bufsize - bufpos); + bufpos += bufsize - bufpos; + if (buf[3] > 1) { + printf("X16 bitmap version %u is unsupported!\n", buf[4]); + throw std::exception(); + } + bpp = buf[4]; + uint8_t vera_color_depth = buf[5]; // Ignore for now. + pixels_per_byte = (8 / bpp); + w = buf[6] | (buf[7] << 8); + h = buf[8] | (buf[9] << 8); + printf("Image size: (%lu, %lu)\n", w, h); + border = buf[10]; + significant_count = buf[11]; + significant_start = buf[12]; + bufsize += 19; + bufsize += 512; + bufsize += (w * h)/pixels_per_byte; + buf.resize(bufsize); + infile.read((char*)buf.data() + bufpos, bufsize - bufpos); + bufpos += bufsize - bufpos; + + for (size_t i = 0; i < 256; i++) { + palette[i] = PaletteEntry(buf.data() + (32+(i*2))); + } + // Border is always an extra palette entry. + extra_palette_entries.push_back(palette[border]); + border = extra_palette_entries.size() - 1; + // Get pixel vector for later use as image data. + pixels.resize(w * h * 3); + size_t outpixelidx = 0; + for (size_t i = 0, x = 0, y = 0; i < (w * h); i++, x++) { + // Make sure Y is incremented when necessary. + if (x >= w) { + x -= w; + y += 1; + } + // Get the required data. + size_t imagestart = (32+512); + size_t pixelIdx = get_pixel_idx(x, y); + size_t imagebyteidx = get_byte_idx(pixelIdx); + uint8_t pixelinbyte = get_inner_idx(pixelIdx); + uint8_t paletteidx = (buf[imagestart + imagebyteidx] >> (pixelinbyte * bpp)) & (get_bitmask()); + PaletteEntry entry = palette[paletteidx]; + uint8_t r = entry.r << 4, g = entry.g << 4, b = entry.b << 4; + // Add the pixel data to the pixels array. + pixels[outpixelidx++] = r; + pixels[outpixelidx++] = g; + pixels[outpixelidx++] = b; + } + // Create the Magick++ image + image = new Image(w, h, "RGB", CharPixel, pixels.data()); + // Clean up and set the loaded flag. + infile.close(); + loaded = true; +} +void BitmapX16::write_pc(const char *filename) { + if (!loaded) { + printf("Error: Attempt to write unloaded file!\n"); + throw std::exception(); + } + image->write(filename); +} +void BitmapX16::load_pc(const char *filename) { + image = new Image(filename); + w = image->columns(); + h = image->rows(); + if (bpp == 0) set_bpp(8); + if (significant_count == 0) set_significant(1 << bpp); + apply(); + loaded = true; +} +size_t BitmapX16::get_pixel_idx(size_t x, size_t y) { + return (y * w) + x; +} +size_t BitmapX16::get_byte_idx(size_t pixelidx) { + return pixelidx / (8/bpp); +} +uint8_t BitmapX16::get_inner_idx(size_t pixelidx) { + return pixelidx % (8/bpp); +} +uint8_t BitmapX16::get_bitmask() { + if (bitmask_bpp != bpp) { + bitmask = (1 << bpp) - 1; + } + return bitmask; +} +uint8_t BitmapX16::get_orable_pixel(uint8_t pixelinbyte, uint8_t color) { + return (color & get_bitmask()) << (bpp * ((8/bpp) - pixelinbyte - 1)); +} + +BitmapX16::BitmapX16() { + extra_palette_entries = vector(); +} +void BitmapX16::generate_palette() { + uint16_t max = (uint16_t)image->colorMapSize(); + uint8_t color[3]; + if (max > 256) max = 256; + if (bpp == 0) { + if (max <= 4) { + bpp = 2; + } else if (max <= 16) { + bpp = 4; + } else { + bpp = 8; + } + } + if (significant_count == 0) { + significant_count = max; + } + bitmask = (1 << bpp) - 1; + for (uint16_t i = 0; i < max; i++) { + ColorRGB map_color = image->colorMap(i); + palette[i] = PaletteEntry(map_color); + } + image_palette_count = max; + for (uint16_t i = max; i < 256; i++) { + if ((uint16_t)extra_palette_entries.size() > i - max) { + palette[i] = extra_palette_entries[i - max]; + } else { + palette[i] = PaletteEntry(); + } + } + return; + for (uint16_t i = 0; i < max; i++) { + printf("pallete[%u] = #%02x%02x%02x\n", i, palette[i].r, palette[i].g, palette[i].b); + } +} +uint8_t BitmapX16::add_palette_entry(PaletteEntry entry) { + extra_palette_entries.push_back(entry); + return (uint8_t)(extra_palette_entries.size() - 1); +} +uint8_t BitmapX16::color_to_palette_entry(const ColorRGB &rgb) { + PaletteEntry color(rgb); + float closeness = 100000.0f; + uint8_t output; + for (size_t i = 0; i < significant_count; i++) { + float possibility_closeness = closeness_to_color(palette[i], color); + //printf("Closeness: %f", possibility_closeness); + if (possibility_closeness < closeness) { + output = i; + closeness = possibility_closeness; + } + } + //PaletteEntry entry = palette[output]; + //printf("Color: #%0x%0x%0x -> Palette entry#%0x%0x%0x, closeness: %f\n", color.r, color.g, color.b , entry.r, entry.g, entry.b, closeness); + return output; +} +BitmapX16::~BitmapX16() { + if (image != nullptr) { + delete image; + } +} +uint8_t BitmapX16::get_border_color() { + return border; +} +void BitmapX16::set_border_color(uint8_t idx) { + border = idx; +} \ No newline at end of file diff --git a/bitmapx16.h b/bitmapx16.h new file mode 100644 index 0000000..14a5de1 --- /dev/null +++ b/bitmapx16.h @@ -0,0 +1,137 @@ +#pragma once +#include +#include +#include "palette.h" +using namespace Magick; +using std::vector; +enum BitmapX16DebugFlags { + DebugNone = 0, + DebugShowPalette = (1 << 0), +}; +class BitmapX16 { + /// \brief Bits per pixel of the image + uint8_t bpp = 0; + /// \brief The palette entries used within this image + PaletteEntry palette[256]; + /// \brief Any extra palette entries to add. + vector extra_palette_entries; + /// \brief The amount of colors used within the palette + uint8_t significant_count = 0; + /// \brief The beginning of the colors used. + uint8_t significant_start = 0; + /// \brief Imagemagick image to apply modifications to and read/write to an X16 bitmap + Image *image = nullptr; + /// \brief Set to true to queue color quantization. Set automatically when needed. + bool quantize_colors = false; + /// \brief Current width + size_t w = 0; + /// \brief Current height + size_t h = 0; + /// \brief Target width + size_t tw = 0; + /// \brief Target height + size_t th = 0; + /// \brief Whether or not to dither + bool dither = false; + /// \brief Whether or not the image has been loaded properly + bool loaded = false; + /// \brief The cache of the bitmask to use for pixels + uint8_t bitmask = 0; + /// \brief The bits per pixel the bitmap was created with. + uint8_t bitmask_bpp = 0; + /// \brief The palette entry corrosponding to the border color + uint8_t border = 0; + /// \brief The amount of palette entries the image itself is supposed to have. + uint8_t image_palette_count = 0; + /// \brief Generates a palette from the current image + void generate_palette(); + /// \brief Actually resizes the image. User code should call queue_resize then apply + /// \param w The width to resize to + /// \param h The height to resize to + void resize(size_t w, size_t h); + /// \brief Gets the pixel index within this image based on X and Y values, as well as the width of the image + /// \param x The X value of the pixel + /// \param y The Y value of the pixel + /// \returns The pixel index within this image + size_t get_pixel_idx(size_t x, size_t y); + /// \brief Returns the index within a byte buffer containing raw VERA image data a pixel is located in based on the pixel index and bpp + /// \param pixelidx The index of the pixel + /// \returns The byte index + size_t get_byte_idx(size_t pixelidx); + /// \brief Returns the index of a pixel within a byte based on the index of the pixel. + /// \param pixelidx The index of the pixel + /// \returns The pixel index within a byte + uint8_t get_inner_idx(size_t pixelidx); + /// \brief Returns the correct bitmask for a pixel. May be calculated if the cache is invalid. + /// \returns A bitmask for any first pixel in a byte in the image. Can be shifted to get different pixels within a byte. + uint8_t get_bitmask(); + /// \brief Gets a value that can be OR'ed to a byte in a buffer based on the pixel index, the BPP of the image, and the value to set. + /// \param inner_idx The index of the pixel within the byte + /// \param pixel The value of the pixel + /// \returns A value that can be OR'ed with a byte in a buffer that doesn't have a pixel at the specified index. + uint8_t get_orable_pixel(uint8_t inner_idx, uint8_t pixel); + /// \brief Converts a color to the nearest palette entry + /// \param rgb The color to convert + /// \returns The palette entry index + uint8_t color_to_palette_entry(const ColorRGB &rgb); + uint8_t extra_to_real_palette(uint8_t idx); + public: + /// \brief Sets the border color extra palette entry. + /// \param idx The index of the palette entry, must be an index into the extra palette entry list. + void set_border_color(uint8_t idx); + /// \brief Gets the current extra palette entry of the border color + /// \returns The border color palette entry from the extra palette entry list + uint8_t get_border_color(); + /// \brief Adds an entry to the list of extra palette entries. Not guaranteed to continue existing after a new palette entry has been added. + /// \param entry The new entry to add + /// \returns The palette index within the extra palette entries of the new entry + uint8_t add_palette_entry(PaletteEntry entry); + /// \brief Sets the bits per pixel of the image + /// \param bpp The bits per pixel of the image, one of 1, 2, 4, or 8 + void set_bpp(uint8_t bpp); + /// \brief Returns the bits per pixel of the image + /// \returns The bits per pixel of the image, one of 1, 2, 4, or 8 + uint8_t get_bpp(); + /// \brief Sets the maximum amount of colors to be used. + /// \param value The maximum amount of colors to use. + void set_significant(uint8_t value); + /// \brief Returns the maximum amount of colors to be used + /// \returns The maximum amount of colors once written + uint8_t get_significant(); + /// \brief Queues a resize operation. Call BitmapX16::apply() to apply + /// \param w The width to resize to + /// \param h The height to resize to + void queue_resize(size_t w, size_t h); + /// \brief Gets the width of the image + /// \returns The width of the image + size_t get_width(); + /// \brief Gets the height of the image + /// \returns The height of the image + size_t get_height(); + /// \brief Enables or disables dithering + /// \param enabled Pass true to enable, false to disable + void enable_dithering(bool enabled); + /// \brief Returns the status of the dithering flag + /// \returns The value of the dithering flag + bool dithering_enabled(); + /// \brief Applies queued operations to the internal representation of the image + void apply(); + /// \brief Applies queued operations and writes the image to a PC-compatible file + /// \param filename The path to the file to write + void write_pc(const char *filename); + /// \brief Applies queued operations and wri the image to a Commander X16-compatible file + /// \param filename The path to the file to write + void write_x16(const char *filename); + /// \brief Loads a PC-compatible image file + /// \param filename The path to the file to load + void load_pc(const char *filename); + /// \brief Loads a Commander X16-compatible image file + /// \param filename The path to the file to load + void load_x16(const char *filename); + + /// \brief The debug flags to use. + static BitmapX16DebugFlags debug; + /// \brief Constructs an unloaded X16-compatible bitmap image. Call load_pc or load_x16 before using any other functions. + BitmapX16(); + ~BitmapX16(); +}; \ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..c67ad54 --- /dev/null +++ b/main.cpp @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#include "palette.h" +#include +#include +#include +#include +#include "bitmapx16.h" +using std::vector; +using std::map; +using std::stoi; +using namespace Magick; +void usage() { + printf("Usage: veraconvert: [options]\n"); + printf("Options may be:\n"); + printf("-in \n"); + printf("\tSets the input file.\n"); + printf("-out \n"); + printf("\tSets the output file"); + printf("-bpp \n"); + printf("\tSets the desired bits per pixel. May be 0 (default), 2, 4, or 8. 0: automatic.\n"); + printf("-significant \n"); + printf("\tSets the desired number of significant palette entries. Must be at least 0 and at most 256. 0 means automatic. Default: 0\n"); + printf("-resize \n"); + printf("\tResizes the image before converting.\n"); + printf("-dither\n"); + printf("\tEnables dithering of the output\n"); + printf("-border \n"); + printf("\tIf possible, adds a border color with the specified RGB values which are in the range of 0-15.\n"); + printf("-reverse\n"); + printf("\tConverts to PC formats. Incompatible with -dither, -type, and -significant - they will be ignored.\n"); + printf("-help\n"); + printf("\tDisplays this help message.\n"); + exit(1); +} +int main(int argc, char **argv) { + const char *input = NULL, *output = NULL; + size_t tw = 0, th = 0; // Target width & height; + uint8_t tbpp = 0; + uint16_t tcolorcount = 0; + bool dither = false; + bool reverse = false; + uint8_t br, bg, bb; + bool border_set = false; + InitializeMagick(*argv); + argc--; + argv++; + while (argc > 0) { + if (!strcmp(argv[0], "-in")) { + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + input = argv[0]; + argc--; + argv++; + } else if (!strcmp(argv[0], "-out")) { + + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + output = argv[0]; + argc--; + argv++; + } else if (!strcmp(argv[0], "-bpp")) { + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + tbpp = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + switch (tbpp) { + case 0: + case 2: + case 4: + case 8: + break; + default: + usage(); + } + argc--; + argv++; + } else if (!strcmp(argv[0], "-significant")) { + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + tcolorcount = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + if (tcolorcount > 256) { + usage(); + } + argc--; + argv++; + } else if (!strcmp(argv[0], "-resize")) { + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + tw = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + th = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + argc--; + argv++; + } else if (!strcmp(argv[0], "-border")) { + argc--; + argv++; + border_set = true; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + br = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + bg = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + argc--; + argv++; + if (!argc || argv[0][0] == '-') { + usage(); + } + try { + bb = stoi(argv[0]); + } catch (std::exception&) { + usage(); + } + argc--; + argv++; + if (br > 15 || bg > 15 || bb > 15) { + printf("Border RGB values must be in the range of 0-15.\n"); + usage(); + } + } else if (!strcmp(argv[0], "-dither")) { + dither = true; + argc--; + argv++; + } else if (!strcmp(argv[0], "-reverse")) { + reverse = true; + argc--; + argv++; + } else if (!strcmp(argv[0], "-help")) { + usage(); + } else { + printf("Error: Invalid command line argument.\n"); + usage(); + } + } + if (input == NULL || output == NULL) { + printf("Input and output must be specified!\n"); + usage(); + } + if (tbpp == 0) tbpp = 8; + if (tcolorcount == 0) tcolorcount = (1 << tbpp); + try { + BitmapX16 bitmap; + if (reverse) { + printf("Converting %s to a PC format...\n", input); + bitmap.load_x16(input); + } else { + printf("Using at most %u colors at %u bpp\n", tcolorcount, tbpp); + printf("Converting %s to BMX16...\n", input); + bitmap.load_pc(input); + } + if (tw != 0 && th != 0) { + bitmap.queue_resize(tw, th); + } + if (reverse) { + bitmap.write_pc(output); + } else { + bitmap.enable_dithering(dither); + bitmap.set_bpp(tbpp); + bitmap.set_significant(tcolorcount); + if (border_set) { + PaletteEntry entry(br, bg, bb); + bitmap.set_border_color(bitmap.add_palette_entry(entry)); + } + bitmap.apply(); + bitmap.write_x16(output); + } + } catch (std::exception &e) { + printf("Failed to convert image '%s'!\n", input); + } + return 0; +} diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..9edff9a --- /dev/null +++ b/meson.build @@ -0,0 +1,18 @@ +project('graphicsconverter', 'cpp', + version : '0.1', + default_options : ['warning_level=3', + 'cpp_std=c++14']) + +deps = [ + dependency('Magick++', version : '>=7.0') +] +srcs = [ + 'palette.cpp', + 'bitmapx16.cpp', + 'main.cpp' +] +exe = executable('b16converter', srcs, + install : true, + dependencies : deps) + +test('basic', exe) diff --git a/palette.cpp b/palette.cpp new file mode 100644 index 0000000..bc8533c --- /dev/null +++ b/palette.cpp @@ -0,0 +1,35 @@ +#include "palette.h" +ColorRGB PaletteEntry::toColor() { + ColorRGB color; + color.red(((double)r) / 15.0); + color.green(((double)g) / 15.0); + color.blue(((double)b) / 15.0); + return color; +} +void PaletteEntry::write(uint8_t *ptr) { + ptr[0] = ((g & 0b1111) << 4) | (b & 0b1111); + ptr[1] = r; +} +PaletteEntry::PaletteEntry(uint8_t *ptr) { + b = (ptr[0] & 0b1111); + g = ((ptr[0] >> 4) & 0b1111); + r = ptr[1] & 0b1111; +} +PaletteEntry::PaletteEntry(uint8_t r, uint8_t g, uint8_t b) { + this->r = r; + this->g = g; + this->b = b; +} +PaletteEntry::PaletteEntry(const ColorRGB &rgb) { + r = (uint8_t)((rgb.red()) * 15); + g = (uint8_t)((rgb.green()) * 15); + b = (uint8_t)((rgb.blue()) * 15); +} +uint16_t PaletteEntry::hash() { + return ((r & 0b1111) << 8) | ((g & 0b1111) << 4) | (b & 0b1111); +} +PaletteEntry::PaletteEntry() { + r = 0; + g = 0; + b = 0; +} \ No newline at end of file diff --git a/palette.h b/palette.h new file mode 100644 index 0000000..2f6dbb2 --- /dev/null +++ b/palette.h @@ -0,0 +1,17 @@ +#pragma once +#include +#include +using namespace Magick; +class PaletteEntry { + public: + uint8_t r; + uint8_t g; + uint8_t b; + uint16_t hash(); + void write(uint8_t *ptr); + ColorRGB toColor(); + PaletteEntry(); + PaletteEntry(uint8_t *ptr); + PaletteEntry(uint8_t r, uint8_t g, uint8_t b); + PaletteEntry(const ColorRGB &color); +}; \ No newline at end of file diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..2db29eb --- /dev/null +++ b/test.sh @@ -0,0 +1,24 @@ +#!/bin/bash +oldpwd="$(pwd)" +cd "$(dirname "$0")" +meson setup builddir +meson compile -C builddir || exit $? +images=("TEST.png" "PACK.png") +outdir="testout" +mkdir "$outdir" +for img in "${images[@]}"; do + for bpp in 2 4 8; do + for size in "8x8" "16x16" "32x32" "64x64" "320x240" "640x480"; do + width="$(echo -n "$size" | cut -dx -f1)" + height="$(echo -n "$size" | cut -dx -f2)" + name="$(echo -n "$img" | sed 's/\.png$//')" + name="$(printf "%s.%sP.%sB" "$name" "$width" "$bpp")" + ./builddir/graphicsconverter -in "$img" -out "$outdir/$name.B16" -bpp "$bpp" -resize "$width" "$height" -border 15 0 15 + ./builddir/graphicsconverter -in "$img" -out "$outdir/$name.D.B16" -bpp "$bpp" -resize "$width" "$height" -dither -border 15 0 15 + ./builddir/graphicsconverter -reverse -in "$outdir/$name.B16" -out "$outdir/$name.PNG" -resize "$width" "$height" + ./builddir/graphicsconverter -reverse -in "$outdir/$name.D.B16" -out "$outdir/$name.D.PNG" -resize "$width" "$height" -dither + done + done +done + +cd "$oldpwd"