summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w
diff options
context:
space:
mode:
authorTaco Hoekwater <taco@elvenkind.com>2010-04-04 13:55:46 +0000
committerTaco Hoekwater <taco@elvenkind.com>2010-04-04 13:55:46 +0000
commitf372862c42d234710b6057449b46818e63181c90 (patch)
treea9ebec66dd31ac37aed442502ebd1b9fe76245ec /Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w
parent2dad291ab056f30816e0aea61970f38033c2f6a5 (diff)
import luatex 0.60.0 (with small local changes, see luatexdir/ChangeLog)
and do an autoreconf git-svn-id: svn://tug.org/texlive/trunk@17680 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w222
1 files changed, 222 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w b/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w
new file mode 100644
index 00000000000..ba4911a3698
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfglyph.w
@@ -0,0 +1,222 @@
+% pdfglyph.w
+
+% Copyright 2009-2010 Taco Hoekwater <taco@@luatex.org>
+
+% This file is part of LuaTeX.
+
+% LuaTeX 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.
+
+% LuaTeX 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 Lesser General Public
+% License for more details.
+
+% You should have received a copy of the GNU General Public License along
+% with LuaTeX; if not, see <http://www.gnu.org/licenses/>.
+
+@ @c
+static const char _svn_version[] =
+ "$Id: pdfglyph.w 3584 2010-04-02 17:45:55Z hhenkel $"
+ "$URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.60.0/source/texk/web2c/luatexdir/pdf/pdfglyph.w $";
+
+#include "ptexlib.h"
+
+@ @c
+#include "pdf/pdfpage.h"
+
+#define lround(a) (long) floor((a) + 0.5)
+#define pdf2double(a) ((double) (a).m / ten_pow[(a).e])
+
+@ eternal constants
+@c
+#define one_bp ((double) 65536 * (double) 72.27 / 72) /* number of sp per 1bp */
+#define e_tj 3 /* must be 3; movements in []TJ are in fontsize/$10^3$ units */
+
+@ @c
+static long pdf_char_width(pdfstructure * p, internal_font_number f, int i)
+{
+ /* use exactly this formula also for calculating the /Width array values */
+ return
+ lround((double) char_width(f, i) / font_size(f) *
+ ten_pow[e_tj + p->cw.e]);
+}
+
+@ @c
+void pdf_print_charwidth(PDF pdf, internal_font_number f, int i)
+{
+ pdffloat cw;
+ pdfstructure *p = pdf->pstruct;
+ assert(pdf_font_blink(f) == null_font); /* must use unexpanded font! */
+ cw.m = pdf_char_width(p, f, i);
+ cw.e = p->cw.e;
+ print_pdffloat(pdf, cw);
+}
+
+@ @c
+static void setup_fontparameters(PDF pdf, internal_font_number f)
+{
+ float slant, extend, expand;
+ float u = 1.0;
+ pdfstructure *p = pdf->pstruct;
+ /* fix mantis bug \# 0000200 (acroread "feature") */
+ if ((font_format(f) == opentype_format ||
+ (font_format(f) == type1_format && font_encodingbytes(f) == 2))
+ && font_units_per_em(f) > 0)
+ u = (float) (font_units_per_em(f) / 1000.0);
+ pdf->f_cur = f;
+ p->f_pdf = pdf_set_font(pdf, f);
+ p->fs.m = lround((float) font_size(f) / u / one_bp * ten_pow[p->fs.e]);
+ slant = (float) font_slant(f) / (float) 1000.0;
+ extend = (float) font_extend(f) / (float) 1000.0;
+ expand = (float) 1.0 + (float) font_expand_ratio(f) / (float) 1000.0;
+ p->tj_delta.e = p->cw.e - 1; /* "- 1" makes less corrections inside []TJ */
+ /* no need to be more precise than TeX (1sp) */
+ while (p->tj_delta.e > 0
+ && (double) font_size(f) / ten_pow[p->tj_delta.e + e_tj] < 0.5)
+ p->tj_delta.e--; /* happens for very tiny fonts */
+ assert(p->cw.e >= p->tj_delta.e); /* else we would need, e. g., |ten_pow[-1]| */
+ p->tm[0].m = lround(expand * extend * (float) ten_pow[p->tm[0].e]);
+ p->tm[2].m = lround(slant * (float) ten_pow[p->tm[2].e]);
+ p->k2 =
+ ten_pow[e_tj +
+ p->cw.e] / (ten_pow[p->pdf.h.e] * pdf2double(p->fs) *
+ pdf2double(p->tm[0]));
+}
+
+@ @c
+static void set_font(PDF pdf)
+{
+ pdfstructure *p = pdf->pstruct;
+ pdf_printf(pdf, "/F%d", (int) p->f_pdf);
+ pdf_print_resname_prefix(pdf);
+ pdf_printf(pdf, " ");
+ print_pdffloat(pdf, p->fs);
+ pdf_printf(pdf, " Tf ");
+ p->f_pdf_cur = p->f_pdf;
+ p->fs_cur.m = p->fs.m;
+}
+
+@ @c
+static void print_tm(PDF pdf, pdffloat * tm)
+{
+ print_pdf_matrix(pdf, tm);
+ pdf_printf(pdf, " Tm ");
+}
+
+@ @c
+static void set_textmatrix(PDF pdf, scaledpos pos)
+{
+ boolean move;
+ pdfstructure *p = pdf->pstruct;
+ assert(is_textmode(p));
+ move = calc_pdfpos(p, pos);
+ if (move == TRUE) {
+ print_tm(pdf, p->tm);
+ p->pdf.h.m = p->pdf_bt_pos.h.m + p->tm[4].m; /* Tm replaces */
+ p->pdf.v.m = p->pdf_bt_pos.v.m + p->tm[5].m;
+ }
+}
+
+@ @c
+static void begin_charmode(PDF pdf, internal_font_number f, pdfstructure * p)
+{
+ assert(is_chararraymode(p));
+ if (font_encodingbytes(f) == 2) {
+ p->ishex = 1;
+ pdf_printf(pdf, "<");
+ } else {
+ p->ishex = 0;
+ pdf_printf(pdf, "(");
+ }
+ p->mode = PMODE_CHAR;
+}
+
+@ @c
+void end_charmode(PDF pdf)
+{
+ pdfstructure *p = pdf->pstruct;
+ assert(is_charmode(p));
+ if (p->ishex == 1) {
+ p->ishex = 0;
+ pdf_printf(pdf, ">");
+ } else {
+ pdf_printf(pdf, ")");
+ }
+ p->mode = PMODE_CHARARRAY;
+}
+
+@ @c
+static void begin_chararray(PDF pdf)
+{
+ pdfstructure *p = pdf->pstruct;
+ assert(is_textmode(p));
+ p->pdf_tj_pos = p->pdf;
+ p->cw.m = 0;
+ pdf_printf(pdf, "[");
+ p->mode = PMODE_CHARARRAY;
+}
+
+@ @c
+void end_chararray(PDF pdf)
+{
+ pdfstructure *p = pdf->pstruct;
+ assert(is_chararraymode(p));
+ pdf_printf(pdf, "]TJ\n");
+ p->pdf = p->pdf_tj_pos;
+ p->mode = PMODE_TEXT;
+}
+
+@ @c
+void pdf_place_glyph(PDF pdf, internal_font_number f, int c)
+{
+ boolean move;
+ pdfstructure *p = pdf->pstruct;
+ scaledpos pos = pdf->posstruct->pos;
+ if (!char_exists(f, c))
+ return;
+ if (f != pdf->f_cur || is_textmode(p) || is_pagemode(p)) {
+ pdf_goto_textmode(pdf);
+ if (f != pdf->f_cur)
+ setup_fontparameters(pdf, f);
+ if (p->f_pdf != p->f_pdf_cur || p->fs.m != p->fs_cur.m)
+ set_font(pdf);
+ set_textmatrix(pdf, pos);
+ begin_chararray(pdf);
+ }
+ assert(is_charmode(p) || is_chararraymode(p));
+ move = calc_pdfpos(p, pos);
+ if (move == TRUE) {
+ if ((p->wmode == WMODE_H
+ && (p->pdf_bt_pos.v.m + p->tm[5].m) != p->pdf.v.m)
+ || (p->wmode == WMODE_V
+ && (p->pdf_bt_pos.h.m + p->tm[4].m) != p->pdf.h.m)
+ || abs(p->tj_delta.m) >= 1000000) {
+ pdf_goto_textmode(pdf);
+ set_textmatrix(pdf, pos);
+ begin_chararray(pdf);
+ move = calc_pdfpos(p, pos);
+ }
+ if (move == TRUE) {
+ assert((p->wmode == WMODE_H
+ && (p->pdf_bt_pos.v.m + p->tm[5].m) == p->pdf.v.m)
+ || (p->wmode == WMODE_V
+ && (p->pdf_bt_pos.h.m + p->tm[4].m) == p->pdf.h.m));
+ if (is_charmode(p))
+ end_charmode(pdf);
+ assert(p->tj_delta.m != 0);
+ print_pdffloat(pdf, p->tj_delta);
+ p->cw.m -= p->tj_delta.m * ten_pow[p->cw.e - p->tj_delta.e];
+ }
+ }
+ if (is_chararraymode(p))
+ begin_charmode(pdf, f, p);
+ pdf_mark_char(f, c);
+ if (font_encodingbytes(f) == 2)
+ pdf_print_wide_char(pdf, char_index(f, c));
+ else
+ pdf_print_char(pdf, c);
+ p->cw.m += pdf_char_width(p, p->f_pdf, c); /* aka |adv_char_width()| */
+}