X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/09358aa7f255d1cd8d47dd152c480d4818cb24cf..93688997ac35ff239dad82a093d3313a4c46ac62:/bk_paper.c?ds=sidebyside diff --git a/bk_paper.c b/bk_paper.c index 2065151..a9f6f24 100644 --- a/bk_paper.c +++ b/bk_paper.c @@ -14,13 +14,10 @@ * * - linearised PDF, perhaps? * - * - compression of output files. For the actual text display, - * both output formats currently average about 50-60 characters - * per 5-6 character word of text, and almost all of it's the - * same. - * * In PS, we can define custom text operators to make things - * more efficient. - * * In PDF, there already are! + * - we should use PDFDocEncoding or Unicode for outline strings, + * now that I actually know how to do them. Probably easiest if + * I do this _after_ bringing in libcharset, since I can simply + * supply PDFDocEncoding in there. * * - I'm uncertain of whether I need to include a ToUnicode CMap * in each of my font definitions in PDF. Currently things (by @@ -513,7 +510,7 @@ void *paper_pre_backend(paragraph *sourceform, keywordlist *keywords, for (page = pages; page; page = page->next) { sprintf(buf, "%d", ++pagenum); - page->number = ufroma_dup(buf); + page->number = ufroma_dup(buf, CS_ASCII); } if (has_index) { @@ -527,7 +524,7 @@ void *paper_pre_backend(paragraph *sourceform, keywordlist *keywords, /* And don't forget the as-yet-uncreated index. */ sprintf(buf, "%d", ++pagenum); - first_index_page->number = ufroma_dup(buf); + first_index_page->number = ufroma_dup(buf, CS_ASCII); } } @@ -686,7 +683,7 @@ void *paper_pre_backend(paragraph *sourceform, keywordlist *keywords, for (page = ipages->next; page; page = page->next) { char buf[40]; sprintf(buf, "%d", ++pagenum); - page->number = ufroma_dup(buf); + page->number = ufroma_dup(buf, CS_ASCII); } /* @@ -1563,7 +1560,8 @@ static void add_rect_to_page(page_data *page, int x, int y, int w, int h) } static void add_string_to_page(page_data *page, int x, int y, - font_encoding *fe, int size, char *text) + font_encoding *fe, int size, char *text, + int width) { text_fragment *frag; @@ -1581,6 +1579,7 @@ static void add_string_to_page(page_data *page, int x, int y, frag->fe = fe; frag->fontsize = size; frag->text = dupstr(text); + frag->width = width; } /* @@ -1599,8 +1598,10 @@ static int render_string(page_data *page, font_data *font, int fontsize, while (*str) { glyph = font->bmp[*str]; - if (glyph == 0xFFFF) + if (glyph == 0xFFFF) { + str++; continue; /* nothing more we can do here */ + } /* * Find which subfont this character is going in. @@ -1632,7 +1633,8 @@ static int render_string(page_data *page, font_data *font, int fontsize, if (!subfont || sf != subfont) { if (subfont) { text[textpos] = '\0'; - add_string_to_page(page, x, y, subfont, fontsize, text); + add_string_to_page(page, x, y, subfont, fontsize, text, + textwid); x += textwid; } else { assert(textpos == 0); @@ -1649,7 +1651,7 @@ static int render_string(page_data *page, font_data *font, int fontsize, if (textpos > 0) { text[textpos] = '\0'; - add_string_to_page(page, x, y, subfont, fontsize, text); + add_string_to_page(page, x, y, subfont, fontsize, text, textwid); x += textwid; } @@ -1680,7 +1682,7 @@ static int render_text(page_data *page, para_data *pdata, line_data *ldata, if (text->type == word_HyperLink) { dest.type = URL; - dest.url = utoa_dup(text->text); + dest.url = utoa_dup(text->text, CS_ASCII); dest.page = NULL; } else if (text->type == word_PageXref) { dest.type = PAGE; @@ -2002,13 +2004,6 @@ static void render_para(para_data *pdata, paper_conf *conf, wid = paper_width_simple(pdata, w); sfree(w); - render_string(pdata->last->page, - pdata->fonts[FONT_NORMAL], - pdata->sizes[FONT_NORMAL], - conf->paper_width - conf->right_margin - wid, - (conf->paper_height - conf->top_margin - - pdata->last->ypos), num); - for (x = 0; x < conf->base_width; x += conf->leader_separation) if (x - conf->leader_separation > last_x - conf->left_margin && x + conf->leader_separation < conf->base_width - wid) @@ -2018,6 +2013,13 @@ static void render_para(para_data *pdata, paper_conf *conf, conf->left_margin + x, (conf->paper_height - conf->top_margin - pdata->last->ypos), L"."); + + render_string(pdata->last->page, + pdata->fonts[FONT_NORMAL], + pdata->sizes[FONT_NORMAL], + conf->paper_width - conf->right_margin - wid, + (conf->paper_height - conf->top_margin - + pdata->last->ypos), num); } /*