summaryrefslogtreecommitdiff
path: root/dviware/dvi2bitmap/dvireport.cc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/dvi2bitmap/dvireport.cc
Initial commit
Diffstat (limited to 'dviware/dvi2bitmap/dvireport.cc')
-rw-r--r--dviware/dvi2bitmap/dvireport.cc246
1 files changed, 246 insertions, 0 deletions
diff --git a/dviware/dvi2bitmap/dvireport.cc b/dviware/dvi2bitmap/dvireport.cc
new file mode 100644
index 0000000000..2a2a78a70a
--- /dev/null
+++ b/dviware/dvi2bitmap/dvireport.cc
@@ -0,0 +1,246 @@
+#include <config.h>
+
+#include <string>
+#include <iostream>
+#include <bitset>
+#include <ctype.h>
+#if HAVE_CSTD_INCLUDE
+# include <cstdlib>
+#else
+# include <stdlib.h>
+#endif
+
+using STD::cout;
+using STD::cerr;
+using STD::endl;
+using STD::exit;
+
+#include "DviFile.h"
+
+char *progname;
+void Usage();
+void show_position(DviFile *dvi, const char* unitlist);
+
+
+void show_position(DviFile *dvi, const char* unitlist)
+{
+#define CVTXY(unit) \
+ cout << " " \
+ << DviFile::convertFromScaledPoints \
+ (dvi->currH(DviFile::unit_sp), \
+ DviFile::unit_##unit) \
+ << "," \
+ << DviFile::convertFromScaledPoints \
+ (dvi->currV(DviFile::unit_sp), \
+ DviFile::unit_##unit) \
+ << #unit
+
+ for (const char *p=unitlist; *p != '\0'; p++) {
+ switch (*p) {
+ case 'x':
+ cout << " " << dvi->currH() << "," << dvi->currV()
+ << "px";
+ break;
+ case 'd':
+ cout << " "
+ << dvi->currH(DviFile::unit_dvi)
+ << ","
+ << dvi->currV(DviFile::unit_dvi)
+ << "dviu";
+ break;
+ case 'b':
+ CVTXY(bp);
+ break;
+ case 'p':
+ CVTXY(pt);
+ break;
+ case 'm':
+ CVTXY(mm);
+ break;
+ case 'c':
+ CVTXY(cm);
+ break;
+ case 'P':
+ CVTXY(pc);
+ break;
+ case 'D':
+ CVTXY(dd);
+ break;
+ case 'C':
+ CVTXY(cc);
+ break;
+ case 'i':
+ CVTXY(in);
+ break;
+ case 's':
+ cout << " " << dvi->currH(DviFile::unit_sp)
+ << "," << dvi->currV(DviFile::unit_sp) << "sp";
+ break;
+ default:
+ cout << "Unit(" << *p << ") unrecognised";
+ break;
+ }
+ }
+}
+
+int main (int argc, char **argv)
+{
+ string dviname;
+ progname = argv[0];
+ if (argc == 1)
+ Usage();
+ const char *unitlist = 0;
+ enum { feature_characters=0, feature_rules,
+ feature_fonts, feature_specials };
+ STD::bitset<8> show_features;
+ bool load_fonts = false;
+
+ for (argc--, argv++; argc>0; argc--, argv++) {
+ if (**argv == '-') {
+ switch (*++*argv) {
+ case 'F': // load fonts
+ load_fonts = true;
+ break;
+
+ case 'u': // units
+ unitlist = ++*argv;
+ break;
+
+ case 's': // what to show
+ for (++*argv; **argv; ++*argv)
+ switch (**argv) {
+ case 'c':
+ show_features.set(feature_characters);
+ break;
+ case 'f':
+ show_features.set(feature_fonts);
+ break;
+ case 'r':
+ show_features.set(feature_rules);
+ break;
+ case 's':
+ show_features.set(feature_specials);
+ break;
+ case 'A':
+ show_features.set(); // all
+ break;
+ default:
+ Usage();
+ break;
+ }
+ break;
+
+ case 'h': // help, FALL THROUGH
+ default:
+ Usage();
+ }
+ } else {
+ dviname = *argv;
+ }
+ }
+
+ if (dviname.length() == 0)
+ Usage();
+
+ if (unitlist == 0)
+ unitlist = static_cast<const char*>("d");
+ if (show_features.none())
+ show_features.set(feature_characters);
+
+ DviFile* dvi;
+ try {
+ string mode72dpi = "mactrue"; // a mode listed as 72dpi
+ PkFont::setMissingFontMode(mode72dpi);
+ dvi = new DviFile(dviname, 72);
+ } catch (DviError& e) {
+ cerr << "Can't open DVI file " << dviname
+ << ": " << e.problem() << endl;
+ exit(1);
+ }
+
+ DviFileEvent *ev;
+ bool end_of_file = false;
+ const PkFont* curr_font = NULL;
+
+ try {
+ while (!end_of_file) {
+ ev = dvi->getEvent();
+
+ if (DviFileSetChar *test = dynamic_cast<DviFileSetChar*>(ev)) {
+ if (show_features.test(feature_characters)) {
+ DviFileSetChar& sc = *test;
+ if (load_fonts) {
+ PkGlyph& glyph = *curr_font->glyph(sc.charno());
+ char c = glyph.characterChar();
+ cout << "c " << glyph.characterCode()
+ << "[" << (isprint(c) ? c : '?')
+ << "," << curr_font->name()
+ << "]";
+ } else {
+ cout << "c " << sc.charno();
+ }
+ show_position(dvi, unitlist);
+ cout << endl;
+ }
+
+ } else if (DviFileSetRule *test
+ = dynamic_cast<DviFileSetRule*>(ev)) {
+ if (show_features.test(feature_rules)) {
+ DviFileSetRule& sr = *test;
+ cout << "r "
+ << sr.h << "x" << sr.w
+ << "px @";
+ show_position(dvi, unitlist);
+ cout << endl;
+ }
+
+ } else if (DviFileFontChange *test =
+ dynamic_cast<DviFileFontChange*>(ev)) {
+ DviFileFontChange& fc = *test;
+ if (show_features.test(feature_fonts)) {
+ cout << " f " << fc.font->name()
+ << "@" << fc.font->designSize() << endl;
+ }
+ if (load_fonts) {
+ const PkFont *f = fc.font;
+ if (f->loaded())
+ curr_font = f;
+ else {
+ f = dvi->getFallbackFont(f);
+ if (f != 0)
+ curr_font = f;
+ }
+ // curr_font unchanged if font-change was unsuccessful
+ }
+
+ } else if (DviFileSpecial *special
+ = dynamic_cast<DviFileSpecial*>(ev)) {
+ if (show_features.test(feature_specials)) {
+ cout << "s \"" << special->specialString << "\"";
+ show_position(dvi, unitlist);
+ cout << endl;
+ }
+
+ } else if (dynamic_cast<DviFilePostamble*>(ev)) {
+ end_of_file = true;
+ }
+
+ ev->release();
+ }
+ } catch (DviError& e) {
+ cerr << "Error processing DVI file " << dviname
+ << ": " << e.problem() << endl;
+ }
+
+ delete dvi;
+
+ exit(0);
+}
+
+void Usage()
+{
+ cerr << "Usage: " << progname
+ << " [-F] [-s[cfrsA]] [-u[bcdimpx]] dvifile" << endl;
+ exit(1);
+}
+