diff options
Diffstat (limited to 'dviware/dvi2bitmap/XBMBitmap.cc')
-rw-r--r-- | dviware/dvi2bitmap/XBMBitmap.cc | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/dviware/dvi2bitmap/XBMBitmap.cc b/dviware/dvi2bitmap/XBMBitmap.cc new file mode 100644 index 0000000000..e2b2a9c8af --- /dev/null +++ b/dviware/dvi2bitmap/XBMBitmap.cc @@ -0,0 +1,74 @@ +/* This file is part of dvi2bitmap; see README for copyrights and licence */ + +#include <config.h> + +#include "Bitmap.h" +#include "XBMBitmap.h" + +//#include <iostream> // debug code writes to cerr + +#if HAVE_CSTD_INCLUDE +# include <cstdio> +# include <cctype> +# if CCTYPE_IN_STD + using std::isalnum; +# endif +#else +# include <stdio.h> +# include <ctype.h> +#endif + + + +XBMBitmap::XBMBitmap (const int w, const int h) + : BitmapImage (w, h) +{ +} + +XBMBitmap::~XBMBitmap () +{ +} + +void XBMBitmap::write (const string filename) +{ + FILE *op; + if ((op = fopen (filename.c_str(), "w")) == NULL) + throw BitmapError ("can't open XBM file"+filename+" to write"); + + size_t dotpos = filename.find_last_of('.'); + size_t seppos = filename.find_last_of(FSPATH_SEP); + if (seppos == string::npos) seppos = 0; + if (dotpos == string::npos) dotpos = filename.length(); + string fnroot_str = ""; + for (unsigned int charno=(unsigned int)seppos; charno<dotpos; charno++) + fnroot_str += (isalnum(filename[charno]) ? filename[charno] : '_'); + const char *fnroot = fnroot_str.c_str(); + + fprintf (op, "#define %s_width %d\n", fnroot, w_); + fprintf (op, "#define %s_height %d\n", fnroot, h_); + fprintf (op, "static unsigned char %s_bits[] = {\n", fnroot); + for (int row=0; row<h_; row++) + { + Byte b = 0; + Byte bitno = 0; + const Byte *p = &bitmap_[row*w_]; + for (int col=0; col<w_; col++) + { + if (*p++) + b |= static_cast<Byte>(1<<bitno); + if (bitno == 7) + { + fprintf (op, "0x%02x, ", b); + b = 0; + bitno = 0; + } + else + bitno++; + } + if (bitno != 0) + fprintf (op, "0x%02x, ", static_cast<unsigned int>(b)); + fprintf (op, "\n"); + } + fprintf (op, "};\n"); + fclose (op); +} |