#include #include "util/Bmp.h" #include "util/Gbm.h" void usage() { printf("Usage: gbmconv \n"); } int main(int argc, char** argv) { if (argc < 4) { usage(); return 1; } char *gbmPath = argv[1]; char *bmpPath = argv[2]; char *maskBmpPath = argv[3]; auto bitmap = Bmp::loadFromFile(bmpPath); if (bitmap.GetWidth() == 0 || bitmap.GetHeight() == 0) { printf("Unable to load source bitmap\n"); return 1; } auto maskBitmap = Bmp::loadFromFile(maskBmpPath); if (maskBitmap.GetWidth() == 0 || maskBitmap.GetHeight() == 0) { printf("Unable to load mask bitmap\n"); return 1; } if (maskBitmap.GetWidth() != bitmap.GetWidth() || maskBitmap.GetHeight() != bitmap.GetHeight()) { printf("Mask bitmap must be the same size as the source bitmap\n"); return 1; } // Create a combined bitmap where the most significant bit is a transparency bit auto combined = Bitmap(bitmap.GetWidth(), bitmap.GetHeight()); for (auto y = 0u; y < bitmap.GetHeight(); y++) { for (auto x = 0u; x < bitmap.GetWidth(); x++) { auto isTransparent = (maskBitmap.GetPixel(x, y) == 0); auto pv = (isTransparent ? 0x80 : 0x00) | (bitmap.GetPixel(x, y) & 0x7f); combined.SetPixel(x, y, pv); } } for (auto i = 0u; i < 256; i++) { combined.SetPaletteEntry(i, bitmap.GetPaletteEntry(i)); } Gbm::writeToFile(gbmPath, combined); printf("Wrote %s\n", gbmPath); return 0; }