summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/omegafonts/out_ofm.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/omegafonts/out_ofm.c')
-rw-r--r--Build/source/texk/web2c/omegafonts/out_ofm.c196
1 files changed, 196 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/omegafonts/out_ofm.c b/Build/source/texk/web2c/omegafonts/out_ofm.c
new file mode 100644
index 00000000000..0f8f515cd9a
--- /dev/null
+++ b/Build/source/texk/web2c/omegafonts/out_ofm.c
@@ -0,0 +1,196 @@
+/* out_ofm.c: Outputting to an OFM file.
+
+This file is part of Omega,
+which is based on the web2c distribution of TeX,
+
+Copyright (c) 1994--2001 John Plaice and Yannis Haralambous
+
+Omega 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.
+
+Omega 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 Omega; if not, write to the Free Software Foundation, Inc.,
+59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#include "cpascal.h"
+#include "list_routines.h"
+#include "header_routines.h"
+#include "manifests.h"
+#include "omfonts.h"
+#include "char_routines.h"
+#include "ligkern_routines.h"
+#include "out_ofm.h"
+#include "extra_routines.h"
+#include "param_routines.h"
+#include "dimen_routines.h"
+#include "error_routines.h"
+#include "parse_ofm.h"
+
+static void compute_ofm_subsizes(void);
+static void output_ofm_subsizes(void);
+
+void
+output_ofm_file(void)
+{
+ check_and_correct();
+ compute_ofm_extra_stuff();
+ compute_ofm_character_info();
+ compute_ofm_subsizes();
+ output_ofm_subsizes();
+ output_ofm_header();
+ output_ofm_extra_stuff();
+ output_ofm_character_info();
+ output_ofm_dimension();
+ output_ofm_ligkern();
+ output_ofm_extensible();
+ output_ofm_parameter();
+}
+
+static void
+compute_ofm_subsizes(void)
+{
+ switch(ofm_level) {
+ case OFM_TFM: {
+ lh = header_max + 1;
+ nw++; nh++; nd++; ni++;
+ compute_ligkern_offset();
+ lf = 6+lh+(ec-bc+1)+nw+nh+nd+ni+nl+lk_offset+nk+ne+np;
+ break;
+ }
+ case OFM_LEVEL0: {
+ lh = header_max + 1;
+ nw++; nh++; nd++; ni++;
+ compute_ligkern_offset();
+ lf = 14+lh+2*(ec-bc+1)+nw+nh+nd+ni+2*(nl+lk_offset)+nk+2*ne+np;
+ break;
+ }
+ case OFM_LEVEL1: {
+ lh = header_max + 1;
+ nw++; nh++; nd++; ni++;
+ compute_ligkern_offset();
+ words_per_entry = (12 + 2*npc) / 4;
+ ncw = num_char_info * words_per_entry;
+ lf = 29+lh+ncw+nw+nh+nd+ni+2*(nl+lk_offset)+nk+2*ne+np+
+ nki+nwi+nkf+nwf+nkm+nwm+nkr+nwr+nkg+nwg+nkp+nwp;
+ nco = 29+lh+nki+nwi+nkf+nwf+nkm+nwm+nkr+nwr+nkg+nwg+nkp+nwp;
+ break;
+ }
+ default: { internal_error_0("output_ofm_subfiles"); }
+ }
+}
+
+static void
+output_ofm_subsizes(void)
+{
+ switch(ofm_level) {
+ case OFM_TFM: {
+ out_ofm_2(lf); out_ofm_2(lh); out_ofm_2(bc); out_ofm_2(ec);
+ out_ofm_2(nw); out_ofm_2(nh); out_ofm_2(nd); out_ofm_2(ni);
+ out_ofm_2(nl+lk_offset); out_ofm_2(nk);
+ out_ofm_2(ne); out_ofm_2(np);
+ break;
+ }
+ case OFM_LEVEL0: {
+ out_ofm_4(0);
+ out_ofm_4(lf); out_ofm_4(lh); out_ofm_4(bc); out_ofm_4(ec);
+ out_ofm_4(nw); out_ofm_4(nh); out_ofm_4(nd); out_ofm_4(ni);
+ out_ofm_4(nl+lk_offset); out_ofm_4(nk);
+ out_ofm_4(ne); out_ofm_4(np); out_ofm_4(font_dir);
+ break;
+ }
+ case OFM_LEVEL1: {
+ out_ofm_4(1);
+ out_ofm_4(lf); out_ofm_4(lh); out_ofm_4(bc); out_ofm_4(ec);
+ out_ofm_4(nw); out_ofm_4(nh); out_ofm_4(nd); out_ofm_4(ni);
+ out_ofm_4(nl+lk_offset); out_ofm_4(nk);
+ out_ofm_4(ne); out_ofm_4(np); out_ofm_4(font_dir);
+ out_ofm_4(nco); out_ofm_4(ncw); out_ofm_4(npc);
+ out_ofm_4(nki); out_ofm_4(nwi);
+ out_ofm_4(nkf); out_ofm_4(nwf);
+ out_ofm_4(nkm); out_ofm_4(nwm);
+ out_ofm_4(nkr); out_ofm_4(nwr);
+ out_ofm_4(nkg); out_ofm_4(nwg);
+ out_ofm_4(nkp); out_ofm_4(nwp);
+ break;
+ }
+ default: { internal_error_0("output_ofm_subfiles"); }
+ }
+}
+
+unsigned file_ofm_count = 0;
+
+void
+out_ofm(unsigned i)
+{
+ fputc(i,file_ofm);
+ file_ofm_count++;
+}
+
+void
+out_ofm_2(unsigned i)
+{
+
+ fputc((i>>8)&0xff, file_ofm);
+ fputc(i&0xff, file_ofm);
+ file_ofm_count += 2;
+}
+
+void
+out_ofm_4(unsigned i)
+{
+ fputc((i>>24)&0xff, file_ofm);
+ fputc((i>>16)&0xff, file_ofm);
+ fputc((i>>8)&0xff, file_ofm);
+ fputc(i&0xff, file_ofm);
+ file_ofm_count += 4;
+}
+
+void
+out_ofm_char(unsigned i)
+{
+ if (ofm_level == OFM_NOLEVEL) {
+ internal_error_1("out_ofm_char.1 (ofm_level=%d)", ofm_level);
+ }
+ if (ofm_level == OFM_TFM) {
+ if (i>=0x100) internal_error_1("out_ofm_char.2 (i=%x)", i);
+ out_ofm(i);
+ } else {
+ if (i>=0x10000) internal_error_1("out_ofm_char.3 (i=%x)", i);
+ out_ofm_2(i);
+ }
+}
+
+#define dabs(x) ((x)>=0?(x):-(x))
+
+void
+out_ofm_scaled(fix fval)
+{
+ if (dabs((double)fval/(double)design_units) >= 16.0) {
+ warning_2("The relative dimension %d is too large.\n"
+ "Must be less than 16*designsize = %d designunits",
+ fval/0x100000, design_units/0x10000);
+ fval = 0;
+ }
+ if (design_units != UNITY) {
+ fval = zround(((double)fval/(double)design_units) * 1048576.0);
+ }
+ if (fval < 0) {
+ out_ofm(255); fval = fval + 0x1000000;
+ if (fval <= 0) fval = 1;
+ } else {
+ out_ofm(0);
+ if (fval >= 0x1000000) fval = 0xffffff;
+ }
+ out_ofm((fval >> 16) & 0xff);
+ out_ofm((fval >> 8) & 0xff);
+ out_ofm(fval & 0xff);
+}