summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/luatexdir/pdf/pdfobj.c
diff options
context:
space:
mode:
authorLuigi Scarso <luigi.scarso@gmail.com>2018-09-05 21:57:30 +0000
committerLuigi Scarso <luigi.scarso@gmail.com>2018-09-05 21:57:30 +0000
commitecd1605a23ef54d2a4a69e1a361172d350e03b3b (patch)
tree8ea1d9745c24dbc5e755f13d801fa01e88944650 /Build/source/texk/web2c/luatexdir/pdf/pdfobj.c
parent04563248956e7059aad4fc4f6bf7da18562f7b8c (diff)
luatex: correct automake file for pplib; replaced cweb files with c files.
git-svn-id: svn://tug.org/texlive/trunk@48594 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/pdf/pdfobj.c')
-rw-r--r--Build/source/texk/web2c/luatexdir/pdf/pdfobj.c231
1 files changed, 231 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/pdf/pdfobj.c b/Build/source/texk/web2c/luatexdir/pdf/pdfobj.c
new file mode 100644
index 00000000000..71d6a943f57
--- /dev/null
+++ b/Build/source/texk/web2c/luatexdir/pdf/pdfobj.c
@@ -0,0 +1,231 @@
+/*
+
+Copyright 2009-2011 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/>.
+
+*/
+
+#include "ptexlib.h"
+#include "lua/luatex-api.h"
+
+/*tex Write a raw \PDF\ object: */
+
+void pdf_write_obj(PDF pdf, int k)
+{
+ lstring data;
+ const_lstring st;
+ /*tex The index into |data.s|: */
+ size_t li;
+ int saved_compress_level ;
+ /*tex Gives compressed objects for |\pdfvariable objcompresslevel| >= |OBJSTM_ALWAYS|: */
+ int os_threshold = OBJSTM_ALWAYS;
+ /*tex Possibly a \LUA\ registry reference: */
+ int l = 0;
+ int ll = 0;
+ data.s = NULL;
+ /*tex We can have an immediate object before we are initialized. */
+ ensure_output_state(pdf, ST_HEADER_WRITTEN);
+ saved_compress_level = pdf->compress_level;
+ /*tex End of a ugly hack. */
+ if (obj_obj_pdfcompresslevel(pdf, k) > -1) {
+ /*tex A value of |-1| means ``unset''. */
+ pdf->compress_level = obj_obj_pdfcompresslevel(pdf, k);
+ if (pdf->compress_level == 0) {
+ pdf->objcompresslevel = 0;
+ }
+ }
+ if (obj_obj_objstm_threshold(pdf, k) != OBJSTM_UNSET)
+ os_threshold = obj_obj_objstm_threshold(pdf, k);
+ if (obj_obj_is_stream(pdf, k)) {
+ pdf_begin_obj(pdf, k, OBJSTM_NEVER);
+ pdf_begin_dict(pdf);
+ l = obj_obj_stream_attr(pdf, k);
+ if (l != LUA_NOREF) {
+ lua_rawgeti(Luas, LUA_REGISTRYINDEX, l);
+ if (lua_type(Luas,-1) != LUA_TSTRING)
+ normal_error("pdf backend","invalid object");
+ st.s = lua_tolstring(Luas, -1, &li);
+ st.l = li;
+ lua_pop(Luas,1);
+ pdf_check_space(pdf);
+ pdf_out_block(pdf, st.s, st.l);
+ pdf_set_space(pdf);
+ luaL_unref(Luas, LUA_REGISTRYINDEX, l);
+ obj_obj_stream_attr(pdf, k) = LUA_NOREF;
+ }
+ pdf_dict_add_streaminfo(pdf);
+ pdf_end_dict(pdf);
+ pdf_begin_stream(pdf);
+ } else
+ pdf_begin_obj(pdf, k, os_threshold);
+ l = obj_obj_data(pdf, k);
+ lua_rawgeti(Luas, LUA_REGISTRYINDEX, l);
+ if (lua_type(Luas,-1) != LUA_TSTRING)
+ normal_error("pdf backend","invalid object");
+ st.s = lua_tolstring(Luas, -1, &li);
+ st.l = li;
+ lua_pop(Luas, 1);
+ if (obj_obj_is_file(pdf, k)) {
+ /*tex The callback status value: */
+ boolean res = false;
+ /*tex The callback found filename: */
+ const char *fnam = NULL;
+ int callback_id;
+ /*tex |st.s| is also |\0|-terminated, even as |lstring| */
+ fnam = luatex_find_file(st.s, find_data_file_callback);
+ callback_id = callback_defined(read_data_file_callback);
+ if (fnam && callback_id > 0) {
+ boolean file_opened = false;
+ res = run_callback(callback_id, "S->bSd", fnam, &file_opened, &data.s, &ll);
+ data.l = (size_t) ll;
+ if (!file_opened)
+ normal_error("pdf backend", "cannot open file for embedding");
+ } else {
+ /*tex The data file's |FILE*|: */
+ byte_file f;
+ if (!fnam)
+ fnam = st.s;
+ if (!luatex_open_input(&f, fnam, kpse_tex_format, FOPEN_RBIN_MODE, true))
+ normal_error("pdf backend", "cannot open file for embedding");
+ res = read_data_file(f, &data.s, &ll);
+ data.l = (size_t) ll;
+ close_file(f);
+ }
+ if (data.l == 0L)
+ normal_error("pdf backend", "empty file for embedding");
+ if (!res)
+ normal_error("pdf backend", "error reading file for embedding");
+ tprint("<<");
+ tprint(st.s);
+ pdf_out_block(pdf, (const char *) data.s, data.l);
+ xfree(data.s);
+ tprint(">>");
+ } else {
+ pdf_out_block(pdf, st.s, st.l);
+ }
+ if (obj_obj_is_stream(pdf, k)) {
+ pdf_end_stream(pdf);
+ pdf_end_obj(pdf);
+ } else {
+ /*tex Here we do the |\n|. */
+ pdf_end_obj(pdf);
+ }
+ luaL_unref(Luas, LUA_REGISTRYINDEX, l);
+ obj_obj_data(pdf, k) = LUA_NOREF;
+ pdf->compress_level = saved_compress_level;
+}
+
+void init_obj_obj(PDF pdf, int k)
+{
+ obj_obj_stream_attr(pdf, k) = LUA_NOREF;
+ obj_obj_data(pdf, k) = LUA_NOREF;
+ unset_obj_obj_is_stream(pdf, k);
+ unset_obj_obj_is_file(pdf, k);
+ unset_obj_obj_no_length(pdf, k);
+ obj_obj_pdfcompresslevel(pdf, k) = -1; /* unset */
+ obj_obj_objstm_threshold(pdf, k) = OBJSTM_UNSET; /* unset */
+}
+
+/*tex
+
+ The |\pdfextension obj| primitive is used to create a ``raw'' object in
+ the PDF output file. The object contents will be hold in memory and will be
+ written out only when the object is referenced by |\pdfextension refobj|.
+ When |\pdfextension obj| is used with |\immediate|, the object contents
+ will be written out immediately. Objects referenced in the current page are
+ appended into |pdf_obj_list|.
+
+*/
+
+void scan_obj(PDF pdf)
+{
+ int k;
+ lstring *st = NULL;
+ if (scan_keyword("reserveobjnum")) {
+ get_x_token();
+ if (cur_cmd != spacer_cmd)
+ back_input();
+ pdf->obj_count++;
+ k = pdf_create_obj(pdf, obj_type_obj, 0);
+ } else {
+ if (scan_keyword("useobjnum")) {
+ scan_int();
+ k = cur_val;
+ check_obj_type(pdf, obj_type_obj, k);
+ if (is_obj_scheduled(pdf, k) || obj_data_ptr(pdf, k) != 0)
+ normal_error("pdf backend", "scheduled object is already used");
+ } else {
+ pdf->obj_count++;
+ k = pdf_create_obj(pdf, obj_type_obj, 0);
+ }
+ obj_data_ptr(pdf, k) = pdf_get_mem(pdf, pdfmem_obj_size);
+ init_obj_obj(pdf, k);
+ if (scan_keyword("uncompressed")) {
+ obj_obj_pdfcompresslevel(pdf, k) = 0;
+ obj_obj_objstm_threshold(pdf, k) = OBJSTM_NEVER;
+ }
+ if (scan_keyword("stream")) {
+ set_obj_obj_is_stream(pdf, k);
+ if (scan_keyword("attr")) {
+ scan_toks(false, true);
+ st = tokenlist_to_lstring(def_ref, true);
+ flush_list(def_ref);
+ lua_pushlstring(Luas, (char *) st->s, st->l);
+ obj_obj_stream_attr(pdf, k) = luaL_ref(Luas, LUA_REGISTRYINDEX);
+ free_lstring(st);
+ st = NULL;
+ }
+ }
+ if (scan_keyword("file"))
+ set_obj_obj_is_file(pdf, k);
+ scan_toks(false, true);
+ st = tokenlist_to_lstring(def_ref, true);
+ flush_list(def_ref);
+ lua_pushlstring(Luas, (char *) st->s, st->l);
+ obj_obj_data(pdf, k) = luaL_ref(Luas, LUA_REGISTRYINDEX);
+ free_lstring(st);
+ st = NULL;
+ }
+ pdf_last_obj = k;
+}
+
+void scan_refobj(PDF pdf)
+{
+ scan_int();
+ check_obj_type(pdf, obj_type_obj, cur_val);
+ new_whatsit(pdf_refobj_node);
+ pdf_obj_objnum(tail_par) = cur_val;
+}
+
+void scan_refobj_lua(PDF pdf, int k)
+{
+ check_obj_type(pdf, obj_type_obj, k);
+ new_whatsit(pdf_refobj_node);
+ pdf_obj_objnum(tail_par) = k;
+}
+
+void pdf_ref_obj(PDF pdf, halfword p)
+{
+ if (!is_obj_scheduled(pdf, pdf_obj_objnum(p)))
+ addto_page_resources(pdf, obj_type_obj, pdf_obj_objnum(p));
+}
+
+void pdf_ref_obj_lua(PDF pdf, int k)
+{
+ if (!is_obj_scheduled(pdf, k))
+ addto_page_resources(pdf, obj_type_obj, k);
+}