summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/pdftexdir/epdf.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/web2c/pdftexdir/epdf.c')
-rw-r--r--Build/source/texk/web2c/pdftexdir/epdf.c82
1 files changed, 56 insertions, 26 deletions
diff --git a/Build/source/texk/web2c/pdftexdir/epdf.c b/Build/source/texk/web2c/pdftexdir/epdf.c
index 95000755b0d..1b13c2b0d8c 100644
--- a/Build/source/texk/web2c/pdftexdir/epdf.c
+++ b/Build/source/texk/web2c/pdftexdir/epdf.c
@@ -17,56 +17,86 @@ You should have received a copy of the GNU General Public License
along with pdfTeX; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-$Id: //depot/Build/source.development/TeX/texk/web2c/pdftexdir/epdf.c#10 $
+$Id: epdf.c,v 1.45 2006/08/20 10:56:04 hahe Exp hahe $
*/
#include "ptexlib.h"
#include <kpathsea/c-vararg.h>
#include <kpathsea/c-proto.h>
-
-integer pdfbufmax = pdfbufsize;
+#include <string.h>
extern void epdf_check_mem(void);
+extern void register_fd_entry(fd_entry *);
+
-int is_subsetable(fm_entry *fm)
+int is_subsetable(fm_entry * fm)
{
- return is_included(fm) && is_subsetted(fm);
+ assert(is_included(fm));
+ return is_subsetted(fm);
}
-int is_type1(fm_entry *fm)
+fd_entry *epdf_create_fontdescriptor(fm_entry * fm)
{
- return is_t1fontfile(fm);
+ fd_entry *fd;
+ if ((fd = lookup_fd_entry(fm->ff_name, fm->slant, fm->extend)) == NULL) {
+ fm->in_use = true;
+ fd = new_fd_entry();
+ fd->fm = fm;
+ register_fd_entry(fd);
+ fd->fd_objnum = pdfnewobjnum();
+ assert(fm->ps_name != NULL);
+ fd->fontname = xstrdup(fm->ps_name); /* just fallback */
+ /* preset_fontmetrics (fo->fd, f); */
+ fd->gl_tree = avl_create(comp_string_entry, NULL, &avl_xallocator);
+ assert(fd->gl_tree != NULL);
+ }
+ return fd;
}
-void mark_glyphs(fm_entry *fm, char *charset)
+integer get_fd_objnum(fd_entry * fd)
{
- char *new_charset = fm->charset;
- if (charset == NULL)
- return;
- if (new_charset == NULL)
- new_charset = xstrdup(charset);
- else {
- xretalloc(new_charset, strlen(new_charset)+strlen(charset)+1, char);
- strcat(new_charset, charset);
- }
- fm->charset = new_charset;
+ assert(fd->fd_objnum != 0);
+ return fd->fd_objnum;
}
-void embed_whole_font(fm_entry *fm)
+integer get_fn_objnum(fd_entry * fd)
{
- fm->all_glyphs = true;
+ if (fd->fn_objnum == 0)
+ fd->fn_objnum = pdfnewobjnum();
+ return fd->fn_objnum;
}
-integer get_fontfile(fm_entry *fm)
+/***********************************************************************
+ * Mark glyphs used by embedded PDF file:
+ * 1. build fontdescriptor, if not yet existing
+ * 2. mark glyphs directly there
+ *
+ * Input charset from xpdf is a string of glyph names including
+ * leading slashes, but without blanks between them, like: /a/b/c
+***********************************************************************/
+
+void epdf_mark_glyphs(fd_entry * fd, char *charset)
{
- return fm->ff_objnum;
+ char *p, *q, *s;
+ char *glyph;
+ void **aa;
+ if (charset == NULL)
+ return;
+ assert(fd != NULL);
+ for (s = charset + 1, q = charset + strlen(charset); s < q; s = p + 1) {
+ for (p = s; *p != '\0' && *p != '/'; p++);
+ *p = '\0';
+ if ((char *) avl_find(fd->gl_tree, s) == NULL) {
+ glyph = xstrdup(s);
+ aa = avl_probe(fd->gl_tree, glyph);
+ assert(aa != NULL);
+ }
+ }
}
-integer get_fontname(fm_entry *fm)
+void embed_whole_font(fd_entry * fd)
{
- if (fm->fn_objnum == 0)
- fm->fn_objnum = pdfnewobjnum();
- return fm->fn_objnum;
+ fd->all_glyphs = true;
}
void epdf_free(void)