summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w154
1 files changed, 154 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w b/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
new file mode 100644
index 00000000000..fbbd9b9cb37
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfliteral.w
@@ -0,0 +1,154 @@
+% pdfliteral.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
+#include "ptexlib.h"
+
+static const char _svn_version[] =
+ "$Id: pdfliteral.w 3571 2010-04-02 13:50:45Z taco $"
+ "$URL: http://foundry.supelec.fr/svn/luatex/tags/beta-0.60.0/source/texk/web2c/luatexdir/pdf/pdfliteral.w $";
+
+@ @c
+void pdf_special(PDF pdf, halfword p)
+{
+ int old_setting; /* holds print |selector| */
+ str_number s;
+ old_setting = selector;
+ selector = new_string;
+ show_token_list(token_link(write_tokens(p)), null, -1);
+ selector = old_setting;
+ s = make_string();
+ pdf_literal(pdf, s, scan_special, true);
+ flush_str(s);
+}
+
+
+@ To ship out a \TeX\ box to PDF page description we need to implement
+|hlist_out|, |vlist_out| and |ship_out|, which are equivalent to
+the \TeX' original |hlist_out|, |vlist_out| and |ship_out| resp. But first we
+need to declare some procedures needed in |hlist_out| and |vlist_out|.
+
+@c
+void pdf_out_literal(PDF pdf, halfword p)
+{
+ int old_setting; /* holds print |selector| */
+ str_number s;
+ if (pdf_literal_type(p) == normal) {
+ old_setting = selector;
+ selector = new_string;
+ show_token_list(token_link(pdf_literal_data(p)), null, -1);
+ selector = old_setting;
+ s = make_string();
+ pdf_literal(pdf, s, pdf_literal_mode(p), false);
+ flush_str(s);
+ } else {
+ assert(pdf_literal_mode(p) != scan_special);
+ switch (pdf_literal_mode(p)) {
+ case set_origin:
+ pdf_goto_pagemode(pdf);
+ pdf_set_pos(pdf, pdf->posstruct->pos);
+ break;
+ case direct_page:
+ pdf_goto_pagemode(pdf);
+ break;
+ case direct_always:
+ pdf_end_string_nl(pdf);
+ break;
+ default:
+ confusion("literal1");
+ break;
+ }
+ lua_pdf_literal(pdf, pdf_literal_data(p));
+ }
+}
+
+@ test equality of start of strings
+@c
+static boolean str_in_cstr(str_number s, const char *r, unsigned i)
+{
+ const unsigned char *k, *l;
+ if ((unsigned) str_length(s) < i + strlen(r))
+ return false;
+ k = (const unsigned char *) r;
+ l = str_string(s) + i;
+ while ((*l) && (*k)) {
+ if (*l++ != *k++)
+ return false;
+ }
+ return true;
+}
+
+@ @c
+void pdf_literal(PDF pdf, str_number s, int literal_mode, boolean warn)
+{
+ pool_pointer j = 0; /* current character code position, initialized to make the compiler happy */
+ if (s >= STRING_OFFSET) { /* needed for |out_save| */
+ j = 0;
+ if (literal_mode == scan_special) {
+ if (!(str_in_cstr(s, "PDF:", 0) || str_in_cstr(s, "pdf:", 0))) {
+ if (warn
+ &&
+ ((!(str_in_cstr(s, "SRC:", 0) || str_in_cstr(s, "src:", 0)))
+ || (str_length(s) == 0)))
+ tprint_nl("Non-PDF special ignored!");
+ return;
+ }
+ j = j + (pool_pointer) strlen("PDF:");
+ if (str_in_cstr(s, "direct:", strlen("PDF:"))) {
+ j = j + (pool_pointer) strlen("direct:");
+ literal_mode = direct_always;
+ } else if (str_in_cstr(s, "page:", strlen("PDF:"))) {
+ j = j + (pool_pointer) strlen("page:");
+ literal_mode = direct_page;
+ } else {
+ literal_mode = set_origin;
+ }
+ }
+ }
+ switch (literal_mode) {
+ case set_origin:
+ pdf_goto_pagemode(pdf);
+ pdf_set_pos(pdf, pdf->posstruct->pos);
+ break;
+ case direct_page:
+ pdf_goto_pagemode(pdf);
+ break;
+ case direct_always:
+ pdf_end_string_nl(pdf);
+ break;
+ default:
+ confusion("literal1");
+ break;
+ }
+ if (s >= STRING_OFFSET) {
+ unsigned char *ss = str_string(s);
+ size_t l = str_length(s) - (size_t) j;
+ if (l < max_single_pdf_print) {
+ pdf_out_block(pdf, (ss + j), l);
+ } else {
+
+ while (l--)
+ pdf_out(pdf, *(ss + j++));
+ }
+ } else {
+ assert(s < 256);
+ pdf_out(pdf, s);
+ }
+ pdf_print_nl(pdf);
+}