summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/pdf/pdfaction.w
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/pdf/pdfaction.w')
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfaction.w207
1 files changed, 207 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfaction.w b/Build/source/texk/web2c/luatexdir/pdf/pdfaction.w
new file mode 100644
index 00000000000..b6d06ebea9b
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfaction.w
@@ -0,0 +1,207 @@
+% pdfaction.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: pdfaction.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/pdfaction.w $";
+
+
+@ @c
+halfword new_action_node(void)
+{
+ return new_node(action_node, 0);
+}
+
+@ @c
+void delete_action_node(halfword a)
+{
+ if (pdf_action_type(a) == pdf_action_user) {
+ delete_token_ref(pdf_action_tokens(a));
+ } else {
+ if (pdf_action_file(a) != null)
+ delete_token_ref(pdf_action_file(a));
+ if (pdf_action_type(a) == pdf_action_page)
+ delete_token_ref(pdf_action_tokens(a));
+ else if (pdf_action_named_id(a) > 0)
+ delete_token_ref(pdf_action_id(a));
+ }
+ free_node(a, pdf_action_size);
+}
+
+@ read an action specification
+@c
+halfword scan_action(PDF pdf)
+{
+ int p;
+ (void) pdf;
+ p = new_action_node();
+ if (scan_keyword("user"))
+ set_pdf_action_type(p, pdf_action_user);
+ else if (scan_keyword("goto"))
+ set_pdf_action_type(p, pdf_action_goto);
+ else if (scan_keyword("thread"))
+ set_pdf_action_type(p, pdf_action_thread);
+ else
+ pdf_error("ext1", "action type missing");
+ if (pdf_action_type(p) == pdf_action_user) {
+ scan_pdf_ext_toks();
+ set_pdf_action_tokens(p, def_ref);
+ return p;
+ }
+ if (scan_keyword("file")) {
+ scan_pdf_ext_toks();
+ set_pdf_action_file(p, def_ref);
+ }
+ if (scan_keyword("page")) {
+ if (pdf_action_type(p) != pdf_action_goto)
+ pdf_error("ext1", "only GoTo action can be used with `page'");
+ set_pdf_action_type(p, pdf_action_page);
+ scan_int();
+ if (cur_val <= 0)
+ pdf_error("ext1", "page number must be positive");
+ set_pdf_action_id(p, cur_val);
+ set_pdf_action_named_id(p, 0);
+ scan_pdf_ext_toks();
+ set_pdf_action_tokens(p, def_ref);
+ } else if (scan_keyword("name")) {
+ scan_pdf_ext_toks();
+ set_pdf_action_named_id(p, 1);
+ set_pdf_action_id(p, def_ref);
+ } else if (scan_keyword("num")) {
+ if ((pdf_action_type(p) == pdf_action_goto) &&
+ (pdf_action_file(p) != null))
+ pdf_error("ext1",
+ "`goto' option cannot be used with both `file' and `num'");
+ scan_int();
+ if (cur_val <= 0)
+ pdf_error("ext1", "num identifier must be positive");
+ set_pdf_action_named_id(p, 0);
+ set_pdf_action_id(p, cur_val);
+ } else {
+ pdf_error("ext1", "identifier type missing");
+ }
+ if (scan_keyword("newwindow")) {
+ set_pdf_action_new_window(p, pdf_window_new);
+ /* Scan an optional space */
+ get_x_token();
+ if (cur_cmd != spacer_cmd)
+ back_input();
+ } else if (scan_keyword("nonewwindow")) {
+ set_pdf_action_new_window(p, pdf_window_nonew);
+ /* Scan an optional space */
+ get_x_token();
+ if (cur_cmd != spacer_cmd)
+ back_input();
+ } else {
+ set_pdf_action_new_window(p, pdf_window_notset);
+ }
+ if ((pdf_action_new_window(p) > pdf_window_notset) &&
+ (((pdf_action_type(p) != pdf_action_goto) &&
+ (pdf_action_type(p) != pdf_action_page)) ||
+ (pdf_action_file(p) == null)))
+ pdf_error("ext1",
+ "`newwindow'/`nonewwindow' must be used with `goto' and `file' option");
+ return p;
+}
+
+@ write an action specification
+@c
+void write_action(PDF pdf, halfword p)
+{
+ char *s;
+ int d = 0;
+ if (pdf_action_type(p) == pdf_action_user) {
+ pdf_print_toks_ln(pdf, pdf_action_tokens(p));
+ return;
+ }
+ pdf_printf(pdf, "<< ");
+ if (pdf_action_file(p) != null) {
+ pdf_printf(pdf, "/F ");
+ s = tokenlist_to_cstring(pdf_action_file(p), true, NULL);
+ pdf_print_str(pdf, s);
+ xfree(s);
+ pdf_printf(pdf, " ");
+ if (pdf_action_new_window(p) > pdf_window_notset) {
+ pdf_printf(pdf, "/NewWindow ");
+ if (pdf_action_new_window(p) == pdf_window_new)
+ pdf_printf(pdf, "true ");
+ else
+ pdf_printf(pdf, "false ");
+ }
+ }
+ switch (pdf_action_type(p)) {
+ case pdf_action_page:
+ if (pdf_action_file(p) == null) {
+ pdf_printf(pdf, "/S /GoTo /D [");
+ pdf_print_int(pdf,
+ get_obj(pdf, obj_type_page, pdf_action_id(p), false));
+ pdf_printf(pdf, " 0 R");
+ } else {
+ pdf_printf(pdf, "/S /GoToR /D [");
+ pdf_print_int(pdf, pdf_action_id(p) - 1);
+ }
+ {
+ char *tokstr =
+ tokenlist_to_cstring(pdf_action_tokens(p), true, NULL);
+ pdf_printf(pdf, " %s]", tokstr);
+ xfree(tokstr);
+ }
+ break;
+ case pdf_action_goto:
+ if (pdf_action_file(p) == null) {
+ pdf_printf(pdf, "/S /GoTo ");
+ d = get_obj(pdf, obj_type_dest, pdf_action_id(p),
+ pdf_action_named_id(p));
+ } else {
+ pdf_printf(pdf, "/S /GoToR ");
+ }
+ if (pdf_action_named_id(p) > 0) {
+ char *tokstr = tokenlist_to_cstring(pdf_action_id(p), true, NULL);
+ pdf_str_entry(pdf, "D", tokstr);
+ xfree(tokstr);
+ } else if (pdf_action_file(p) == null) {
+ pdf_indirect(pdf, "D", d);
+ } else {
+ pdf_error("ext4",
+ "`goto' option cannot be used with both `file' and `num'");
+ }
+ break;
+ case pdf_action_thread:
+ pdf_printf(pdf, "/S /Thread ");
+ if (pdf_action_file(p) == null) {
+ d = get_obj(pdf, obj_type_thread, pdf_action_id(p),
+ pdf_action_named_id(p));
+ if (pdf_action_named_id(p) > 0) {
+ char *tokstr =
+ tokenlist_to_cstring(pdf_action_id(p), true, NULL);
+ pdf_str_entry(pdf, "D", tokstr);
+ xfree(tokstr);
+ } else if (pdf_action_file(p) == null) {
+ pdf_indirect(pdf, "D", d);
+ } else {
+ pdf_int_entry(pdf, "D", pdf_action_id(p));
+ }
+ }
+ break;
+ }
+ pdf_printf(pdf, " >>\n");
+}