summaryrefslogtreecommitdiff
path: root/dviware/catdvi/glyphops.c
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/catdvi/glyphops.c')
-rw-r--r--dviware/catdvi/glyphops.c320
1 files changed, 320 insertions, 0 deletions
diff --git a/dviware/catdvi/glyphops.c b/dviware/catdvi/glyphops.c
new file mode 100644
index 0000000000..57ee40f368
--- /dev/null
+++ b/dviware/catdvi/glyphops.c
@@ -0,0 +1,320 @@
+/* catdvi - get text from DVI files
+ Copyright (C) 2000, 2002 Bjoern Brill <brill@fs.math.uni-frankfurt.de>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include "glyphops.h"
+#include "sparse.h"
+#include "glyphenm.h"
+
+#define EOT 0x04 /* end-of-table mark */
+
+
+/* known formatting hints */
+struct glyph_hintentry_t {
+ glyph_t glyph;
+ enum glyph_hint_t hint;
+};
+
+static struct glyph_hintentry_t hints[] = {
+ {GLYPH_asciicircum, GH_DIACRITIC},
+ {GLYPH_grave, GH_DIACRITIC},
+ {GLYPH_asciitilde, GH_DIACRITIC},
+
+ {GLYPH_dieresis, GH_DIACRITIC},
+ {GLYPH_UNI_macron, GH_DIACRITIC},
+ {GLYPH_acute, GH_DIACRITIC},
+ {GLYPH_cedilla, GH_DIACRITIC},
+
+ {GLYPH_circumflex, GH_DIACRITIC},
+ {GLYPH_caron, GH_DIACRITIC},
+ {GLYPH_UNI_macronmodifier, GH_DIACRITIC},
+ {GLYPH_UNI_acutemodifier, GH_DIACRITIC},
+ {GLYPH_UNI_gravemodifier, GH_DIACRITIC},
+ {GLYPH_breve, GH_DIACRITIC},
+ {GLYPH_dotaccent, GH_DIACRITIC},
+ {GLYPH_ring, GH_DIACRITIC},
+ {GLYPH_ogonek, GH_DIACRITIC},
+ {GLYPH_tilde, GH_DIACRITIC},
+ {GLYPH_CATDVI_polishstroke, GH_DIACRITIC},
+
+ {GLYPH_CATDVI_negationslash, GH_DIACRITIC},
+ {GLYPH_UNI_circlelarge, GH_DIACRITIC},
+ {GLYPH_CATDVI_vector, GH_DIACRITIC},
+
+ {GLYPH_gravecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_acutecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_circumflexcomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_tildecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_macroncomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_overlinecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_brevecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_dotaccentcomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_dieresiscomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_hookabovecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_ringcomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_caroncomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_cedillacomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_ogonekcomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_CATDVI_polishstrokecomb, GH_COMBINING_DIACRITIC},
+
+ {GLYPH_UNI_slashlongcomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_circlecomb, GH_COMBINING_DIACRITIC},
+ {GLYPH_UNI_vectorcomb, GH_COMBINING_DIACRITIC},
+
+ {GLYPH_ADOBE_periodsuperior, GH_DIACRITIC},
+
+ {GLYPH_CATDVI_Eurodblstroke, GH_DIACRITIC},
+ {GLYPH_CATDVI_Eurodblstrokecomb, GH_COMBINING_DIACRITIC},
+
+ {GLYPH_radical, GH_RADICAL},
+ /* Is in the math symbols font but used just like the big
+ * variants in the math extension font.
+ */
+
+ /* The TeX math extension stuff */
+ {GLYPH_CATDVI_parenleftbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_parenrightbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_bracketleftbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracketrightbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_floorleftbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_floorrightbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_ceilingleftbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_ceilingrightbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_braceleftbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracerightbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_angbracketleftbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_angbracketrightbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_vextendsingle, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_vextenddouble, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_slashbig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_backslashbig, GH_ON_AXIS},
+ {GLYPH_CATDVI_parenleftBig, GH_ON_AXIS},
+ {GLYPH_CATDVI_parenrightBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_parenleftbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_parenrightbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_bracketleftbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracketrightbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_floorleftbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_floorrightbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_ceilingleftbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_ceilingrightbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_braceleftbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracerightbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_angbracketleftbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_angbracketrightbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_slashbigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_backslashbigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_parenleftBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_parenrightBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_bracketleftBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracketrightBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_floorleftBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_floorrightBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_ceilingleftBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_ceilingrightBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_braceleftBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracerightBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_angbracketleftBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_angbracketrightBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_slashBigg, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_backslashBigg, GH_ON_AXIS},
+ {GLYPH_CATDVI_slashBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_backslashBig, GH_ON_AXIS},
+ {GLYPH_ADOBE_parenlefttp, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_parenrighttp, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_bracketlefttp, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_bracketrighttp, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_bracketleftbt, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_bracketrightbt, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_bracketleftex, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_bracketrightex, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_bracelefttp, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_bracerighttp, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_braceleftbt, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_bracerightbt, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_braceleftmid, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_bracerightmid, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_braceex, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_arrowvertex, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_parenleftbt, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_parenrightbt, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_ADOBE_parenleftex, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_ADOBE_parenrightex, GH_EXTENSIBLE_RECIPE | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_angbracketleftBig, GH_ON_AXIS},
+ {GLYPH_CATDVI_angbracketrightBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_unionsqtext, GH_ON_AXIS},
+ {GLYPH_CATDVI_unionsqdisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_contintegraltext, GH_ON_AXIS},
+ {GLYPH_CATDVI_contintegraldisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_circledottext, GH_ON_AXIS},
+ {GLYPH_CATDVI_circledotdisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_circleplustext, GH_ON_AXIS},
+ {GLYPH_CATDVI_circleplusdisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_circlemultiplytext, GH_ON_AXIS},
+ {GLYPH_CATDVI_circlemultiplydisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_summationtext, GH_ON_AXIS},
+ {GLYPH_CATDVI_producttext, GH_ON_AXIS},
+ {GLYPH_CATDVI_integraltext, GH_ON_AXIS},
+ {GLYPH_CATDVI_uniontext, GH_ON_AXIS},
+ {GLYPH_CATDVI_intersectiontext, GH_ON_AXIS},
+ {GLYPH_CATDVI_unionmultitext, GH_ON_AXIS},
+ {GLYPH_CATDVI_logicalandtext, GH_ON_AXIS},
+ {GLYPH_CATDVI_logicalortext, GH_ON_AXIS},
+ {GLYPH_CATDVI_summationdisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_productdisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_integraldisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_uniondisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_intersectiondisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_unionmultidisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_logicalanddisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_logicalordisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_coproducttext, GH_ON_AXIS},
+ {GLYPH_CATDVI_coproductdisplay, GH_ON_AXIS},
+ {GLYPH_CATDVI_hatwide, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_hatwider, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_hatwidest, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_tildewide, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_tildewider, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_tildewidest, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_bracketleftBig, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracketrightBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_floorleftBig, GH_ON_AXIS},
+ {GLYPH_CATDVI_floorrightBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_ceilingleftBig, GH_ON_AXIS},
+ {GLYPH_CATDVI_ceilingrightBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_braceleftBig, GH_ON_AXIS},
+ {GLYPH_CATDVI_bracerightBig, GH_ON_AXIS | GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_radicalbig, GH_RADICAL},
+ {GLYPH_CATDVI_radicalBig, GH_RADICAL},
+ {GLYPH_CATDVI_radicalbigg, GH_RADICAL},
+ {GLYPH_CATDVI_radicalBigg, GH_RADICAL},
+ {GLYPH_CATDVI_radicalbt, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_radicalvertex, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_radicaltp, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_arrowvertexdbl, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_arrowtp, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_arrowbt, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_bracehtipdownright, GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_bracehtipupright, GH_MOREMATH_LEFT},
+ {GLYPH_CATDVI_arrowdbltp, GH_EXTENSIBLE_RECIPE},
+ {GLYPH_CATDVI_arrowdblbt, GH_EXTENSIBLE_RECIPE},
+ /* end TeX math extension */
+
+ {GLYPH_CATDVI_tildexwide, GH_WIDE_DIACRITIC},
+ {GLYPH_CATDVI_hatxwide, GH_WIDE_DIACRITIC},
+
+ /* end of table */
+ {0, 0}
+};
+
+static struct spars32_t hint_spars32;
+
+
+/* known mappings between combining and non-combining diacritics.
+ * Incomplete. Use 0 for unavailable or unknown variants.
+ *
+ * variant3 and variant4 are for diacritics that are doubled in the
+ * unicode character set (doubled at least for our purposes and IMHO -
+ * if there is some underlying philosophy, I just can't see it) and
+ * should be mapped to something canonical.
+ *
+ * we try to keep the spacing variant in the ISO 8859-1 range if possible.
+ */
+struct diacritic_variantentry_t {
+ glyph_t spacing;
+ glyph_t combining;
+ glyph_t variant3;
+ glyph_t variant4;
+};
+
+static struct diacritic_variantentry_t diavars[] =
+{
+ {GLYPH_acute, GLYPH_acutecomb, GLYPH_UNI_acutemodifier, 0},
+ {GLYPH_grave, GLYPH_gravecomb, GLYPH_UNI_gravemodifier, 0},
+ {GLYPH_asciicircum, GLYPH_UNI_circumflexcomb, GLYPH_circumflex, 0},
+ {GLYPH_dieresis, GLYPH_UNI_dieresiscomb, 0, 0},
+ {GLYPH_tilde, GLYPH_tildecomb, GLYPH_asciitilde, 0},
+ {GLYPH_ring, GLYPH_UNI_ringcomb, 0, 0},
+
+ {GLYPH_cedilla, GLYPH_UNI_cedillacomb, 0, 0},
+
+ {GLYPH_caron, GLYPH_UNI_caroncomb, 0, 0},
+ {GLYPH_UNI_macron, GLYPH_UNI_macroncomb, GLYPH_UNI_macronmodifier, 0},
+ {GLYPH_breve, GLYPH_UNI_brevecomb, 0, 0},
+ {GLYPH_dotaccent, GLYPH_UNI_dotaccentcomb, GLYPH_ADOBE_periodsuperior, 0},
+
+ {GLYPH_ogonek, GLYPH_UNI_ogonekcomb, 0, 0},
+ {GLYPH_CATDVI_polishstroke, GLYPH_CATDVI_polishstrokecomb, 0, 0},
+
+ {GLYPH_CATDVI_negationslash, GLYPH_UNI_slashlongcomb, 0, 0},
+ {GLYPH_UNI_circlelarge, GLYPH_UNI_circlecomb, 0, 0},
+ {GLYPH_CATDVI_vector, GLYPH_UNI_vectorcomb, 0, 0},
+
+ {GLYPH_CATDVI_Eurodblstroke, GLYPH_CATDVI_Eurodblstrokecomb, 0, 0},
+
+ /* end of table */
+ {EOT, 0, 0, 0}
+};
+
+static struct sparp_t diavar_sparp;
+
+void glyphops_init()
+{
+ struct glyph_hintentry_t * ph;
+ struct diacritic_variantentry_t * pd;
+
+ /* The glyph hint sparp is indexed by the glyph and points directly to
+ * the hint.
+ */
+ spars32_init(&hint_spars32, 0);
+ for(ph = hints; ph->glyph != 0; ++ph) {
+ spars32_write(&hint_spars32, ph->glyph, ph->hint);
+ }
+
+ /* The diacritics variant sparp is indexed by any variant of the diacritic.
+ * The values point to the corresponding dicaritic_variantentry_t .
+ */
+ sparp_init(&diavar_sparp);
+ for(pd = diavars; pd->spacing != EOT; ++pd) {
+ if(pd->spacing != 0) sparp_write(&diavar_sparp, pd->spacing, pd);
+ if(pd->combining != 0) sparp_write(&diavar_sparp, pd->combining, pd);
+ if(pd->variant3 != 0) sparp_write(&diavar_sparp, pd->variant3, pd);
+ if(pd->variant4 != 0) sparp_write(&diavar_sparp, pd->variant4, pd);
+ }
+
+}
+
+enum glyph_hint_t glyph_get_hint(glyph_t glyph)
+{
+ return (enum glyph_hint_t) spars32_read(&hint_spars32, glyph);
+}
+
+glyph_t diacritic_combining_variant(glyph_t diacritic)
+{
+ struct diacritic_variantentry_t * p;
+
+ p = sparp_read(&diavar_sparp, diacritic);
+ return (p != NULL) ? p->combining : 0;
+}
+
+glyph_t diacritic_spacing_variant(glyph_t diacritic)
+{
+ struct diacritic_variantentry_t * p;
+
+ p = sparp_read(&diavar_sparp, diacritic);
+ return (p != NULL) ? p->spacing : 0;
+}