summaryrefslogtreecommitdiffstatshomepage
path: root/src/build/png2bdc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/build/png2bdc.c')
-rw-r--r--src/build/png2bdc.c426
1 files changed, 0 insertions, 426 deletions
diff --git a/src/build/png2bdc.c b/src/build/png2bdc.c
deleted file mode 100644
index 197ded22fcc..00000000000
--- a/src/build/png2bdc.c
+++ /dev/null
@@ -1,426 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Aaron Giles
-/***************************************************************************
-
- png2bdc.c
-
- Super-simple PNG to BDC file generator
-
-****************************************************************************
-
- Format of PNG data:
-
- Multiple rows of characters. A black pixel means "on". All other colors
- mean "off". Each row looks like this:
-
- * 8888 *** *
- * 4444 * * **
- * 2222 * * *
- * 1111 * * *
- * * * *
- ** *** ***
- *
- *
-
- ****** ****
-
- The column of pixels on the left-hand side (column 0) indicates the
- character cell height. This column must be present on each row and
- the height must be consistent for each row.
-
- Protruding one pixel into column 1 is the baseline indicator. There
- should only be one row with a pixel in column 1 for each line, and
- that pixel row index should be consistent for each row.
-
- In columns 2-5 are a 4-hex-digit starting character index number. This
- is encoded as binary value. Each column is 4 pixels tall and represents
- one binary digit. The character index number is the unicode character
- number of the first character encoded in this row; subsequent
- characters in the row are at increasing character indices.
-
- Starting in column 6 and beyond are the actual character bitmaps.
- Below them, in the second row after the last row of the character,
- is a solid line that indicates the width of the character, and also
- where the character bitmap begins and ends.
-
-***************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <new>
-#include "png.h"
-
-
-//**************************************************************************
-// CONSTANTS & DEFINES
-//**************************************************************************
-
-#define CACHED_CHAR_SIZE 12
-#define CACHED_HEADER_SIZE 16
-
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-// a render_font contains information about a single character in a font
-struct render_font_char
-{
- render_font_char() : width(0), xoffs(0), yoffs(0), bmwidth(0), bmheight(0) { }
-
- INT32 width; // width from this character to the next
- INT32 xoffs, yoffs; // X and Y offset from baseline to top,left of bitmap
- INT32 bmwidth, bmheight; // width and height of bitmap
- bitmap_argb32 * bitmap; // pointer to the bitmap containing the raw data
-};
-
-
-// a render_font contains information about a font
-struct render_font
-{
- render_font() : height(0), yoffs(0) { }
-
- int height; // height of the font, from ascent to descent
- int yoffs; // y offset from baseline to descent
- render_font_char chars[65536]; // array of characters
-};
-
-
-
-//**************************************************************************
-// INLINE FUNCTIONS
-//**************************************************************************
-
-inline int pixel_is_set(bitmap_argb32 &bitmap, int y, int x)
-{
- return (bitmap.pix32(y, x) & 0xffffff) == 0;
-}
-
-
-
-//**************************************************************************
-// MAIN
-//**************************************************************************
-
-//-------------------------------------------------
-// write_data - write data to the given file and
-// throw an exception if an error occurs
-//-------------------------------------------------
-
-static void write_data(core_file &file, UINT8 *base, UINT8 *end)
-{
- UINT32 bytes_written = core_fwrite(&file, base, end - base);
- if (bytes_written != end - base)
- {
- fprintf(stderr, "Error writing to destination file\n");
- throw;
- }
-}
-
-
-//-------------------------------------------------
-// render_font_save_cached - write the cached
-// data out to the file
-//-------------------------------------------------
-
-static bool render_font_save_cached(render_font &font, const char *filename, UINT32 hash)
-{
- // attempt to open the file
- core_file *file;
- file_error filerr = core_fopen(filename, OPEN_FLAG_WRITE | OPEN_FLAG_CREATE, &file);
- if (filerr != FILERR_NONE)
- return true;
-
- try
- {
- // determine the number of characters
- int numchars = 0;
- for (int chnum = 0; chnum < 65536; chnum++)
- if (font.chars[chnum].width > 0)
- numchars++;
-
- // write the header
- dynamic_buffer tempbuffer(65536);
- UINT8 *dest = &tempbuffer[0];
- *dest++ = 'f';
- *dest++ = 'o';
- *dest++ = 'n';
- *dest++ = 't';
- *dest++ = hash >> 24;
- *dest++ = hash >> 16;
- *dest++ = hash >> 8;
- *dest++ = hash & 0xff;
- *dest++ = font.height >> 8;
- *dest++ = font.height & 0xff;
- *dest++ = font.yoffs >> 8;
- *dest++ = font.yoffs & 0xff;
- *dest++ = numchars >> 24;
- *dest++ = numchars >> 16;
- *dest++ = numchars >> 8;
- *dest++ = numchars & 0xff;
- write_data(*file, tempbuffer, dest);
-
- // write the empty table to the beginning of the file
- dynamic_buffer chartable(numchars * CACHED_CHAR_SIZE + 1, 0);
- write_data(*file, &chartable[0], &chartable[numchars * CACHED_CHAR_SIZE]);
-
- // loop over all characters
- int tableindex = 0;
- for (int chnum = 0; chnum < 65536; chnum++)
- {
- render_font_char &ch = font.chars[chnum];
- if (ch.width > 0)
- {
- // write out a bit-compressed bitmap if we have one
- if (ch.bitmap != NULL)
- {
- // write the data to the tempbuffer
- dest = tempbuffer;
- UINT8 accum = 0;
- UINT8 accbit = 7;
-
- // bit-encode the character data
- for (int y = 0; y < ch.bmheight; y++)
- {
- int desty = y + font.height + font.yoffs - ch.yoffs - ch.bmheight;
- const UINT32 *src = (desty >= 0 && desty < font.height) ? &ch.bitmap->pix32(desty) : NULL;
- for (int x = 0; x < ch.bmwidth; x++)
- {
- if (src != NULL && src[x] != 0)
- accum |= 1 << accbit;
- if (accbit-- == 0)
- {
- *dest++ = accum;
- accum = 0;
- accbit = 7;
- }
- }
- }
-
- // flush any extra
- if (accbit != 7)
- *dest++ = accum;
-
- // write the data
- write_data(*file, tempbuffer, dest);
-
- // free the bitmap and texture
- global_free(ch.bitmap);
- ch.bitmap = NULL;
- }
-
- // compute the table entry
- dest = &chartable[tableindex++ * CACHED_CHAR_SIZE];
- *dest++ = chnum >> 8;
- *dest++ = chnum & 0xff;
- *dest++ = ch.width >> 8;
- *dest++ = ch.width & 0xff;
- *dest++ = ch.xoffs >> 8;
- *dest++ = ch.xoffs & 0xff;
- *dest++ = ch.yoffs >> 8;
- *dest++ = ch.yoffs & 0xff;
- *dest++ = ch.bmwidth >> 8;
- *dest++ = ch.bmwidth & 0xff;
- *dest++ = ch.bmheight >> 8;
- *dest++ = ch.bmheight & 0xff;
- }
- }
-
- // seek back to the beginning and rewrite the table
- core_fseek(file, CACHED_HEADER_SIZE, SEEK_SET);
- write_data(*file, &chartable[0], &chartable[numchars * CACHED_CHAR_SIZE]);
-
- // all done
- core_fclose(file);
- return false;
- }
- catch (...)
- {
- core_fclose(file);
- osd_rmfile(filename);
- return true;
- }
-}
-
-
-//-------------------------------------------------
-// bitmap_to_chars - convert a bitmap to
-// characters in the given font
-//-------------------------------------------------
-
-static bool bitmap_to_chars(bitmap_argb32 &bitmap, render_font &font)
-{
- // loop over rows
- int rowstart = 0;
- while (rowstart < bitmap.height())
- {
- // find the top of the row
- for ( ; rowstart < bitmap.height(); rowstart++)
- if (pixel_is_set(bitmap, rowstart, 0))
- break;
- if (rowstart >= bitmap.height())
- break;
-
- // find the bottom of the row
- int rowend;
- for (rowend = rowstart + 1; rowend < bitmap.height(); rowend++)
- if (!pixel_is_set(bitmap, rowend, 0))
- {
- rowend--;
- break;
- }
-
- // find the baseline
- int baseline;
- for (baseline = rowstart; baseline <= rowend; baseline++)
- if (pixel_is_set(bitmap, baseline, 1))
- break;
- if (baseline > rowend)
- {
- fprintf(stderr, "No baseline found between rows %d-%d\n", rowstart, rowend);
- break;
- }
-
- // set or confirm the height
- if (font.height == 0)
- {
- font.height = rowend - rowstart + 1;
- font.yoffs = baseline - rowend;
- }
- else
- {
- if (font.height != rowend - rowstart + 1)
- {
- fprintf(stderr, "Inconsistent font height at rows %d-%d\n", rowstart, rowend);
- break;
- }
- if (font.yoffs != baseline - rowend)
- {
- fprintf(stderr, "Inconsistent baseline at rows %d-%d\n", rowstart, rowend);
- break;
- }
- }
-
- // decode the starting character
- int chstart = 0;
- for (int x = 0; x < 4; x++)
- for (int y = 0; y < 4; y++)
- chstart = (chstart << 1) | pixel_is_set(bitmap, rowstart + y, 2 + x);
-
- // print info
-// printf("Row %d-%d, baseline %d, character start %X\n", rowstart, rowend, baseline, chstart);
-
- // scan the column to find characters
- int colstart = 0;
- while (colstart < bitmap.width())
- {
- render_font_char &ch = font.chars[chstart];
-
- // find the start of the character
- for ( ; colstart < bitmap.width(); colstart++)
- if (pixel_is_set(bitmap, rowend + 2, colstart))
- break;
- if (colstart >= bitmap.width())
- break;
-
- // find the end of the character
- int colend;
- for (colend = colstart + 1; colend < bitmap.width(); colend++)
- if (!pixel_is_set(bitmap, rowend + 2, colend))
- {
- colend--;
- break;
- }
-
- // skip char which code is already registered
- if (ch.width <= 0)
- {
- // print info
-// printf(" Character %X - width = %d\n", chstart, colend - colstart + 1);
-
- // allocate a bitmap
- ch.bitmap = global_alloc(bitmap_argb32(colend - colstart + 1, font.height));
-
- // plot the character
- for (int y = rowstart; y <= rowend; y++)
- for (int x = colstart; x <= colend; x++)
- ch.bitmap->pix32(y - rowstart, x - colstart) = pixel_is_set(bitmap, y, x) ? 0xffffffff : 0x00000000;
-
- // set the character parameters
- ch.width = colend - colstart + 1;
- ch.xoffs = 0;
- ch.yoffs = font.yoffs;
- ch.bmwidth = ch.bitmap->width();
- ch.bmheight = ch.bitmap->height();
- }
-
- // next character
- chstart++;
- colstart = colend + 1;
- }
-
- // next row
- rowstart = rowend + 1;
- }
-
- // return non-zero (TRUE) if we errored
- return (rowstart < bitmap.height());
-}
-
-
-//-------------------------------------------------
-// main - main entry point
-//-------------------------------------------------
-
-int main(int argc, char *argv[])
-{
- // validate arguments
- if (argc < 3)
- {
- fprintf(stderr, "Usage:\n%s <input.png> [<input2.png> [...]] <output.bdc>\n", argv[0]);
- return 1;
- }
- const char *bdcname = argv[argc - 1];
-
- // iterate over input files
- static render_font font;
- bool error = false;
- for (int curarg = 1; curarg < argc - 1; curarg++)
- {
- // load the png file
- const char *pngname = argv[curarg];
- core_file *file;
- file_error filerr = core_fopen(pngname, OPEN_FLAG_READ, &file);
- if (filerr != FILERR_NONE)
- {
- fprintf(stderr, "Error %d attempting to open PNG file\n", filerr);
- error = true;
- break;
- }
-
- bitmap_argb32 bitmap;
- png_error pngerr = png_read_bitmap(file, bitmap);
- core_fclose(file);
- if (pngerr != PNGERR_NONE)
- {
- fprintf(stderr, "Error %d reading PNG file\n", pngerr);
- error = true;
- break;
- }
-
- // parse the PNG into characters
- error = bitmap_to_chars(bitmap, font);
- if (error)
- break;
- }
-
- // write out the resulting font
- if (!error)
- error = render_font_save_cached(font, bdcname, 0);
-
- // cleanup after ourselves
- return error ? 1 : 0;
-}