summaryrefslogtreecommitdiff
path: root/gs/base/gsfont.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/base/gsfont.c')
-rw-r--r--gs/base/gsfont.c707
1 files changed, 353 insertions, 354 deletions
diff --git a/gs/base/gsfont.c b/gs/base/gsfont.c
index 437d6ca57..d4c7acba7 100644
--- a/gs/base/gsfont.c
+++ b/gs/base/gsfont.c
@@ -1,6 +1,6 @@
/* Copyright (C) 2001-2006 Artifex Software, Inc.
All Rights Reserved.
-
+
This software is provided AS-IS with no warranty, either express or
implied.
@@ -85,7 +85,7 @@ public_st_gs_font_ptr_element();
* relocation phase of the GC. */
/* Font directory GC procedures */
-static
+static
ENUM_PTRS_WITH(font_dir_enum_ptrs, gs_font_dir *dir)
{
/* Enumerate pointers from cached characters to f/m pairs, */
@@ -96,22 +96,22 @@ ENUM_PTRS_WITH(font_dir_enum_ptrs, gs_font_dir *dir)
uint tmask = dir->ccache.table_mask;
if (cci == 0)
- offset = 0, count = 1;
+ offset = 0, count = 1;
else if (cci == dir->enum_index + 1)
- offset = dir->enum_offset + 1, count = 1;
+ offset = dir->enum_offset + 1, count = 1;
else
- offset = 0, count = cci;
+ offset = 0, count = cci;
for (; offset <= tmask; ++offset) {
- cached_char *cc = dir->ccache.table[offset];
-
- if (cc != 0 && !--count) {
- (*dir->ccache.mark_glyph)
- (mem, cc->code, dir->ccache.mark_glyph_data);
- /****** HACK: break const. We'll fix this someday. ******/
- ((gs_font_dir *)dir)->enum_index = cci;
- ((gs_font_dir *)dir)->enum_offset = offset;
- ENUM_RETURN(cc_pair(cc) - cc->pair_index);
- }
+ cached_char *cc = dir->ccache.table[offset];
+
+ if (cc != 0 && !--count) {
+ (*dir->ccache.mark_glyph)
+ (mem, cc->code, dir->ccache.mark_glyph_data);
+ /****** HACK: break const. We'll fix this someday. ******/
+ ((gs_font_dir *)dir)->enum_index = cci;
+ ((gs_font_dir *)dir)->enum_offset = offset;
+ ENUM_RETURN(cc_pair(cc) - cc->pair_index);
+ }
}
}
return 0;
@@ -126,13 +126,13 @@ static RELOC_PTRS_WITH(font_dir_reloc_ptrs, gs_font_dir *dir);
int chi;
for (chi = dir->ccache.table_mask; chi >= 0; --chi) {
- cached_char *cc = dir->ccache.table[chi];
+ cached_char *cc = dir->ccache.table[chi];
- if (cc != 0)
- cc_set_pair_only(cc,
- (cached_fm_pair *)
- RELOC_OBJ(cc_pair(cc) - cc->pair_index) +
- cc->pair_index);
+ if (cc != 0)
+ cc_set_pair_only(cc,
+ (cached_fm_pair *)
+ RELOC_OBJ(cc_pair(cc) - cc->pair_index) +
+ cc->pair_index);
}
}
/* We have to relocate the cached characters before we */
@@ -158,48 +158,48 @@ gs_font_finalize(void *vptr)
gs_font *prev = pfont->prev;
if_debug4('u', "[u]unlinking font 0x%lx, base=0x%lx, prev=0x%lx, next=0x%lx\n",
- (ulong) pfont, (ulong) pfont->base, (ulong) prev, (ulong) next);
+ (ulong) pfont, (ulong) pfont->base, (ulong) prev, (ulong) next);
/* Notify clients that the font is being freed. */
gs_notify_all(&pfont->notify_list, NULL);
gs_purge_font_from_char_caches(pfont);
if (pfont->dir == 0)
- ppfirst = 0;
+ ppfirst = 0;
else if (pfont->base == pfont)
- ppfirst = &pfont->dir->orig_fonts;
+ ppfirst = &pfont->dir->orig_fonts;
else {
- /*
- * Track the number of cached scaled fonts. Only decrement the
- * count if we didn't do this already in gs_makefont.
- */
- if (next || prev || pfont->dir->scaled_fonts == pfont)
- pfont->dir->ssize--;
- ppfirst = &pfont->dir->scaled_fonts;
+ /*
+ * Track the number of cached scaled fonts. Only decrement the
+ * count if we didn't do this already in gs_makefont.
+ */
+ if (next || prev || pfont->dir->scaled_fonts == pfont)
+ pfont->dir->ssize--;
+ ppfirst = &pfont->dir->scaled_fonts;
}
/*
* gs_purge_font may have unlinked this font already:
* don't unlink it twice.
*/
if (next != 0 && next->prev == pfont)
- next->prev = prev;
+ next->prev = prev;
if (prev != 0) {
- if (prev->next == pfont)
- prev->next = next;
+ if (prev->next == pfont)
+ prev->next = next;
} else if (ppfirst != 0 && *ppfirst == pfont)
- *ppfirst = next;
+ *ppfirst = next;
gs_notify_release(&pfont->notify_list);
}
-static
+static
ENUM_PTRS_WITH(font_enum_ptrs, gs_font *pfont) return ENUM_USING(st_gs_notify_list, &pfont->notify_list, sizeof(gs_notify_list_t), index - 5);
- /* We don't enumerate next or prev of base fonts. */
- /* See above for details. */
+ /* We don't enumerate next or prev of base fonts. */
+ /* See above for details. */
case 0: ENUM_RETURN((pfont->base == pfont ? 0 : pfont->next));
case 1: ENUM_RETURN((pfont->base == pfont ? 0 : pfont->prev));
ENUM_PTR3(2, gs_font, dir, base, client_data);
ENUM_PTRS_END
static RELOC_PTRS_WITH(font_reloc_ptrs, gs_font *pfont);
RELOC_USING(st_gs_notify_list, &pfont->notify_list, sizeof(gs_notify_list_t));
- /* We *do* always relocate next and prev. */
- /* Again, see above for details. */
+ /* We *do* always relocate next and prev. */
+ /* Again, see above for details. */
RELOC_PTR(gs_font, next);
RELOC_PTR(gs_font, prev);
RELOC_PTR3(gs_font, dir, base, client_data);
@@ -221,38 +221,38 @@ gs_font_dir_alloc2(gs_memory_t * struct_mem, gs_memory_t * bits_mem)
if (!gs_debug_c('.'))
# endif
{ /* Try allocating a very large cache. */
- /* If this fails, allocate a small one. */
- pdir = gs_font_dir_alloc2_limits(struct_mem, bits_mem,
- smax_LARGE, bmax_LARGE, mmax_LARGE,
- cmax_LARGE, blimit_LARGE);
+ /* If this fails, allocate a small one. */
+ pdir = gs_font_dir_alloc2_limits(struct_mem, bits_mem,
+ smax_LARGE, bmax_LARGE, mmax_LARGE,
+ cmax_LARGE, blimit_LARGE);
}
if (pdir == 0)
#endif
- pdir = gs_font_dir_alloc2_limits(struct_mem, bits_mem,
- smax_SMALL, bmax_SMALL, mmax_SMALL,
- cmax_SMALL, blimit_SMALL);
+ pdir = gs_font_dir_alloc2_limits(struct_mem, bits_mem,
+ smax_SMALL, bmax_SMALL, mmax_SMALL,
+ cmax_SMALL, blimit_SMALL);
if (pdir == 0)
- return 0;
+ return 0;
pdir->ccache.mark_glyph = cc_no_mark_glyph;
pdir->ccache.mark_glyph_data = 0;
return pdir;
}
gs_font_dir *
gs_font_dir_alloc2_limits(gs_memory_t * struct_mem, gs_memory_t * bits_mem,
- uint smax, uint bmax, uint mmax, uint cmax, uint upper)
+ uint smax, uint bmax, uint mmax, uint cmax, uint upper)
{
gs_font_dir *pdir =
- gs_alloc_struct(struct_mem, gs_font_dir, &st_font_dir,
- "font_dir_alloc(dir)");
+ gs_alloc_struct(struct_mem, gs_font_dir, &st_font_dir,
+ "font_dir_alloc(dir)");
int code;
if (pdir == 0)
- return 0;
+ return 0;
code = gx_char_cache_alloc(struct_mem, bits_mem, pdir,
- bmax, mmax, cmax, upper);
+ bmax, mmax, cmax, upper);
if (code < 0) {
- gs_free_object(struct_mem, pdir, "font_dir_alloc(dir)");
- return 0;
+ gs_free_object(struct_mem, pdir, "font_dir_alloc(dir)");
+ return 0;
}
pdir->orig_fonts = 0;
pdir->scaled_fonts = 0;
@@ -274,14 +274,14 @@ gs_font_dir_alloc2_limits(gs_memory_t * struct_mem, gs_memory_t * bits_mem,
/* Allocate and minimally initialize a font. */
gs_font *
gs_font_alloc(gs_memory_t *mem, gs_memory_type_ptr_t pstype,
- const gs_font_procs *procs, gs_font_dir *dir,
- client_name_t cname)
+ const gs_font_procs *procs, gs_font_dir *dir,
+ client_name_t cname)
{
gs_font *pfont = gs_alloc_struct(mem, gs_font, pstype, cname);
if (pfont == 0)
- return 0;
-#if 1 /* Clear entire structure to avoid unitialized pointers
+ return 0;
+#if 1 /* Clear entire structure to avoid unitialized pointers
when the initialization exits prematurely by error. */
memset(pfont, 0, pstype->ssize);
pfont->memory = mem;
@@ -290,7 +290,7 @@ gs_font_alloc(gs_memory_t *mem, gs_memory_type_ptr_t pstype,
pfont->id = gs_next_ids(mem, 1);
pfont->base = pfont;
pfont->ExactSize = pfont->InBetweenSize = pfont->TransformedChar =
- fbit_use_outlines;
+ fbit_use_outlines;
pfont->procs = *procs;
#else
/* For clarity we leave old initializations here
@@ -306,7 +306,7 @@ gs_font_alloc(gs_memory_t *mem, gs_memory_type_ptr_t pstype,
/* not FontMatrix, FontType */
pfont->BitmapWidths = false;
pfont->ExactSize = pfont->InBetweenSize = pfont->TransformedChar =
- fbit_use_outlines;
+ fbit_use_outlines;
pfont->WMode = 0;
pfont->PaintType = 0;
pfont->StrokeWidth = 0;
@@ -320,16 +320,16 @@ gs_font_alloc(gs_memory_t *mem, gs_memory_type_ptr_t pstype,
/* Allocate and minimally initialize a base font. */
gs_font_base *
gs_font_base_alloc(gs_memory_t *mem, gs_memory_type_ptr_t pstype,
- const gs_font_procs *procs, gs_font_dir *dir,
- client_name_t cname)
+ const gs_font_procs *procs, gs_font_dir *dir,
+ client_name_t cname)
{
gs_font_base *pfont =
- (gs_font_base *)gs_font_alloc(mem, pstype, procs, dir, cname);
+ (gs_font_base *)gs_font_alloc(mem, pstype, procs, dir, cname);
if (pfont == 0)
- return 0;
+ return 0;
pfont->FontBBox.p.x = pfont->FontBBox.p.y =
- pfont->FontBBox.q.x = pfont->FontBBox.q.y = 0;
+ pfont->FontBBox.q.x = pfont->FontBBox.q.y = 0;
uid_set_invalid(&pfont->UID);
pfont->encoding_index = pfont->nearest_encoding_index = -1;
return pfont;
@@ -358,7 +358,6 @@ gs_font_notify_init(gs_font *font)
gs_notify_init(&font->notify_list, gs_memory_stable(font->memory));
}
-
/*
* Register/unregister a client for notification by a font. Currently
* the clients are only notified when a font is freed. Note that any
@@ -382,7 +381,7 @@ font_link_first(gs_font **pfirst, gs_font *elt)
gs_font *first = elt->next = *pfirst;
if (first)
- first->prev = elt;
+ first->prev = elt;
elt->prev = 0;
*pfirst = elt;
}
@@ -399,31 +398,31 @@ gs_definefont(gs_font_dir * pdir, gs_font * pfont)
pfont->base = pfont;
code = (*pfont->procs.define_font) (pdir, pfont);
if (code < 0) { /* Make sure we don't try to finalize this font. */
- pfont->base = 0;
- return code;
+ pfont->base = 0;
+ return code;
}
font_link_first(&pdir->orig_fonts, pfont);
if_debug2('m', "[m]defining font 0x%lx, next=0x%lx\n",
- (ulong) pfont, (ulong) pfont->next);
+ (ulong) pfont, (ulong) pfont->next);
return 0;
}
/* Find a sililar registered font of same type. */
int
-gs_font_find_similar(const gs_font_dir * pdir, const gs_font **ppfont,
- int (*similar)(const gs_font *, const gs_font *))
+gs_font_find_similar(const gs_font_dir * pdir, const gs_font **ppfont,
+ int (*similar)(const gs_font *, const gs_font *))
{
const gs_font *pfont0 = *ppfont;
const gs_font *pfont1 = pdir->orig_fonts;
for (; pfont1 != NULL; pfont1 = pfont1->next) {
- if (pfont1 != pfont0 && pfont1->FontType == pfont0->FontType) {
- int code = similar(pfont0, pfont1);
- if (code != 0) {
- *ppfont = pfont1;
- return code;
- }
- }
+ if (pfont1 != pfont0 && pfont1->FontType == pfont0->FontType) {
+ int code = similar(pfont0, pfont1);
+ if (code != 0) {
+ *ppfont = pfont1;
+ return code;
+ }
+ }
}
return 0;
}
@@ -431,7 +430,7 @@ gs_font_find_similar(const gs_font_dir * pdir, const gs_font **ppfont,
/* scalefont */
int
gs_scalefont(gs_font_dir * pdir, const gs_font * pfont, floatp scale,
- gs_font ** ppfont)
+ gs_font ** ppfont)
{
gs_matrix mat;
@@ -442,7 +441,7 @@ gs_scalefont(gs_font_dir * pdir, const gs_font * pfont, floatp scale,
/* makefont */
int
gs_makefont(gs_font_dir * pdir, const gs_font * pfont,
- const gs_matrix * pmat, gs_font ** ppfont)
+ const gs_matrix * pmat, gs_font ** ppfont)
{
int code;
gs_font *prev = 0;
@@ -452,7 +451,7 @@ gs_makefont(gs_font_dir * pdir, const gs_font * pfont,
bool can_cache;
if ((code = gs_matrix_multiply(&pfont->FontMatrix, pmat, &newmat)) < 0)
- return code;
+ return code;
/*
* Check for the font already being in the scaled font cache.
* Until version 5.97, we only cached scaled fonts if the base
@@ -461,20 +460,20 @@ gs_makefont(gs_font_dir * pdir, const gs_font * pfont,
*/
#ifdef DEBUG
if (gs_debug_c('m')) {
- const gs_font_base *const pbfont = (const gs_font_base *)pfont;
-
- if (pfont->FontType == ft_composite)
- dlprintf("[m]composite");
- else if (uid_is_UniqueID(&pbfont->UID))
- dlprintf1("[m]UniqueID=%ld", pbfont->UID.id);
- else if (uid_is_XUID(&pbfont->UID))
- dlprintf1("[m]XUID(%u)", (uint) (-pbfont->UID.id));
- else
- dlprintf("[m]no UID");
- dprintf8(", FontType=%d, base=0x%lx,\n[m] new FontMatrix=[%g %g %g %g %g %g]\n",
- pfont->FontType, (ulong)pfont->base,
- pmat->xx, pmat->xy, pmat->yx, pmat->yy,
- pmat->tx, pmat->ty);
+ const gs_font_base *const pbfont = (const gs_font_base *)pfont;
+
+ if (pfont->FontType == ft_composite)
+ dlprintf("[m]composite");
+ else if (uid_is_UniqueID(&pbfont->UID))
+ dlprintf1("[m]UniqueID=%ld", pbfont->UID.id);
+ else if (uid_is_XUID(&pbfont->UID))
+ dlprintf1("[m]XUID(%u)", (uint) (-pbfont->UID.id));
+ else
+ dlprintf("[m]no UID");
+ dprintf8(", FontType=%d, base=0x%lx,\n[m] new FontMatrix=[%g %g %g %g %g %g]\n",
+ pfont->FontType, (ulong)pfont->base,
+ pmat->xx, pmat->xy, pmat->yx, pmat->yy,
+ pmat->tx, pmat->ty);
}
#endif
/*
@@ -482,27 +481,27 @@ gs_makefont(gs_font_dir * pdir, const gs_font * pfont,
* effects on FDepVector and descendant fonts that occur in makefont.
*/
if (pfont->FontType != ft_composite) {
- for (; pf_out != 0; prev = pf_out, pf_out = pf_out->next)
- if (pf_out->FontType == pfont->FontType &&
- pf_out->base == pfont->base &&
- pf_out->FontMatrix.xx == newmat.xx &&
- pf_out->FontMatrix.xy == newmat.xy &&
- pf_out->FontMatrix.yx == newmat.yx &&
- pf_out->FontMatrix.yy == newmat.yy &&
- pf_out->FontMatrix.tx == newmat.tx &&
- pf_out->FontMatrix.ty == newmat.ty
- ) {
- *ppfont = pf_out;
- if_debug1('m', "[m]found font=0x%lx\n", (ulong) pf_out);
- return 0;
- }
- can_cache = true;
+ for (; pf_out != 0; prev = pf_out, pf_out = pf_out->next)
+ if (pf_out->FontType == pfont->FontType &&
+ pf_out->base == pfont->base &&
+ pf_out->FontMatrix.xx == newmat.xx &&
+ pf_out->FontMatrix.xy == newmat.xy &&
+ pf_out->FontMatrix.yx == newmat.yx &&
+ pf_out->FontMatrix.yy == newmat.yy &&
+ pf_out->FontMatrix.tx == newmat.tx &&
+ pf_out->FontMatrix.ty == newmat.ty
+ ) {
+ *ppfont = pf_out;
+ if_debug1('m', "[m]found font=0x%lx\n", (ulong) pf_out);
+ return 0;
+ }
+ can_cache = true;
} else
- can_cache = false;
+ can_cache = false;
pf_out = gs_alloc_struct(mem, gs_font, gs_object_type(mem, pfont),
- "gs_makefont");
+ "gs_makefont");
if (!pf_out)
- return_error(gs_error_VMerror);
+ return_error(gs_error_VMerror);
memcpy(pf_out, pfont, gs_object_size(mem, pfont));
gs_font_notify_init(pf_out);
pf_out->FontMatrix = newmat;
@@ -512,75 +511,75 @@ gs_makefont(gs_font_dir * pdir, const gs_font * pfont,
*ppfont = pf_out;
code = (*pf_out->procs.make_font) (pdir, pfont, pmat, ppfont);
if (code < 0)
- return code;
+ return code;
if (can_cache) {
- if (pdir->ssize >= pdir->smax && prev != 0) {
- /*
- * We must discard a cached scaled font.
- * prev points to the last (oldest) font.
- * (We can't free it, because there might be
- * other references to it.)
- */
- if_debug1('m', "[m]discarding font 0x%lx\n",
- (ulong) prev);
- if (prev->prev != 0)
- prev->prev->next = 0;
- else
- pdir->scaled_fonts = 0;
- pdir->ssize--;
- prev->prev = 0;
- /* This comment is a relatively new reconstruction of old assumptions,
- which were done 5+ years ago (see gsfont.c revision 1.1).
- Here the font is only removed from the pdir->scaled_fonts list
- to prevent the latter to grow huge. Thus the list is used only to
- merge scaled font duplicates by the 'for' loop in the beginning
- of this function. We do not discard related character rasters
- from character cache due to 3 reasons :
- 1. At this point a cached_char instance may be referred
- by one or more gs_show_enum instances, which may exist on the
- PS estack while execution of a Type 3 BuildChar or BuildGlyph.
- Such event really happens while rendering a re-distilled tpc2.ps .
- We must not remove those isntances, but currently there is no
- mechanizm for distinguishing them from othgers.
- 2. If the font has an UID, another scaled font may use same fm_pair
- instance due to different CTMs. Therefore same character rasters
- may be useful for another scaled font.
- 3. We don't know whether the font will be used again in nearest
- future. Maybe it will be used again in the next 'show' operation.
- Therefore we delay the decision about discarding character
- rasters untill we need to release memory from them.
- 4. Also note that the last created font, rather than the last used one,
- is being discarded. An useful improvement would be
- to move a font t the beginning of the list whenever it
- appears in a show-like operation.
- */
+ if (pdir->ssize >= pdir->smax && prev != 0) {
+ /*
+ * We must discard a cached scaled font.
+ * prev points to the last (oldest) font.
+ * (We can't free it, because there might be
+ * other references to it.)
+ */
+ if_debug1('m', "[m]discarding font 0x%lx\n",
+ (ulong) prev);
+ if (prev->prev != 0)
+ prev->prev->next = 0;
+ else
+ pdir->scaled_fonts = 0;
+ pdir->ssize--;
+ prev->prev = 0;
+ /* This comment is a relatively new reconstruction of old assumptions,
+ which were done 5+ years ago (see gsfont.c revision 1.1).
+ Here the font is only removed from the pdir->scaled_fonts list
+ to prevent the latter to grow huge. Thus the list is used only to
+ merge scaled font duplicates by the 'for' loop in the beginning
+ of this function. We do not discard related character rasters
+ from character cache due to 3 reasons :
+ 1. At this point a cached_char instance may be referred
+ by one or more gs_show_enum instances, which may exist on the
+ PS estack while execution of a Type 3 BuildChar or BuildGlyph.
+ Such event really happens while rendering a re-distilled tpc2.ps .
+ We must not remove those isntances, but currently there is no
+ mechanizm for distinguishing them from othgers.
+ 2. If the font has an UID, another scaled font may use same fm_pair
+ instance due to different CTMs. Therefore same character rasters
+ may be useful for another scaled font.
+ 3. We don't know whether the font will be used again in nearest
+ future. Maybe it will be used again in the next 'show' operation.
+ Therefore we delay the decision about discarding character
+ rasters untill we need to release memory from them.
+ 4. Also note that the last created font, rather than the last used one,
+ is being discarded. An useful improvement would be
+ to move a font t the beginning of the list whenever it
+ appears in a show-like operation.
+ */
#if 0 /* We disabled this code portion due to Bug 688392.
- The problem was dangling pointers, which appear in fm_pair instances
- after uid_free is applied to a font's UID,
- because they share same xvalues array. We're unable to guess
- for which reason uid_free was applied to the font's UID here
- 5+ years ago (see gsfont.c revision 1.1).
- We do not remove this code portion until we get
- a complete understanding.
- */
- if (prev->FontType != ft_composite) {
- if_debug1('m', "[m]discarding UID 0x%lx\n",
- (ulong) ((gs_font_base *) prev)->
- UID.xvalues);
- uid_free(&((gs_font_base *) prev)->UID,
- prev->memory,
- "gs_makefont(discarding)");
- uid_set_invalid(&((gs_font_base *) prev)->UID);
- }
+ The problem was dangling pointers, which appear in fm_pair instances
+ after uid_free is applied to a font's UID,
+ because they share same xvalues array. We're unable to guess
+ for which reason uid_free was applied to the font's UID here
+ 5+ years ago (see gsfont.c revision 1.1).
+ We do not remove this code portion until we get
+ a complete understanding.
+ */
+ if (prev->FontType != ft_composite) {
+ if_debug1('m', "[m]discarding UID 0x%lx\n",
+ (ulong) ((gs_font_base *) prev)->
+ UID.xvalues);
+ uid_free(&((gs_font_base *) prev)->UID,
+ prev->memory,
+ "gs_makefont(discarding)");
+ uid_set_invalid(&((gs_font_base *) prev)->UID);
+ }
#endif
- }
- pdir->ssize++;
- font_link_first(&pdir->scaled_fonts, pf_out);
+ }
+ pdir->ssize++;
+ font_link_first(&pdir->scaled_fonts, pf_out);
} else { /* Prevent garbage pointers. */
- pf_out->next = pf_out->prev = 0;
+ pf_out->next = pf_out->prev = 0;
}
if_debug2('m', "[m]new font=0x%lx can_cache=%s\n",
- (ulong) * ppfont, (can_cache ? "true" : "false"));
+ (ulong) * ppfont, (can_cache ? "true" : "false"));
return 1;
}
@@ -652,7 +651,7 @@ gs_setcachelower(gs_font_dir * pdir, uint size)
}
int
gs_setcacheupper(gs_font_dir * pdir, uint size)
-{
+{
pdir->ccache.upper = ((int)size < 0) ? 0 : size; /* ?: for CET 27-06 */
return 0;
}
@@ -709,27 +708,27 @@ gs_purge_font(gs_font * pfont)
gs_font *next = pfont->next;
if (next != 0)
- next->prev = prev, pfont->next = 0;
+ next->prev = prev, pfont->next = 0;
if (prev != 0)
- prev->next = next, pfont->prev = 0;
+ prev->next = next, pfont->prev = 0;
else if (pdir->orig_fonts == pfont)
- pdir->orig_fonts = next;
+ pdir->orig_fonts = next;
else if (pdir->scaled_fonts == pfont)
- pdir->scaled_fonts = next;
+ pdir->scaled_fonts = next;
else { /* Shouldn't happen! */
- lprintf1("purged font 0x%lx not found\n", (ulong) pfont);
+ lprintf1("purged font 0x%lx not found\n", (ulong) pfont);
}
/* Purge the font from the scaled font cache. */
for (pf = pdir->scaled_fonts; pf != 0;) {
- if (pf->base == pfont) {
- int code = gs_purge_font(pf);
-
- if (code < 0)
- return code;
- pf = pdir->scaled_fonts; /* start over */
- } else
- pf = pf->next;
+ if (pf->base == pfont) {
+ int code = gs_purge_font(pf);
+
+ if (code < 0)
+ return code;
+ pf = pdir->scaled_fonts; /* start over */
+ } else
+ pf = pf->next;
}
/* Purge the font from the font/matrix pair cache, */
@@ -744,9 +743,9 @@ gs_find_font_by_id(gs_font_dir *pdir, gs_id id, gs_matrix *FontMatrix)
gs_font *pfont = pdir->orig_fonts;
for(; pfont != NULL; pfont = pfont->next)
- if(pfont->id == id &&
- !memcmp(&pfont->FontMatrix, FontMatrix, sizeof(pfont->FontMatrix)))
- return pfont;
+ if(pfont->id == id &&
+ !memcmp(&pfont->FontMatrix, FontMatrix, sizeof(pfont->FontMatrix)))
+ return pfont;
return NULL;
}
@@ -764,23 +763,23 @@ gs_no_define_font(gs_font_dir * pdir, gs_font * pfont)
/* Default (vacuous) makefont handler. */
int
gs_no_make_font(gs_font_dir * pdir, const gs_font * pfont,
- const gs_matrix * pmat, gs_font ** ppfont)
+ const gs_matrix * pmat, gs_font ** ppfont)
{
return 0;
}
/* Makefont handler for base fonts, which must copy the XUID. */
int
gs_base_make_font(gs_font_dir * pdir, const gs_font * pfont,
- const gs_matrix * pmat, gs_font ** ppfont)
+ const gs_matrix * pmat, gs_font ** ppfont)
{
return uid_copy(&((gs_font_base *)*ppfont)->UID, (*ppfont)->memory,
- "gs_base_make_font(XUID)");
+ "gs_base_make_font(XUID)");
}
/* Default font info procedure */
int
gs_default_font_info(gs_font *font, const gs_point *pscale, int members,
- gs_font_info_t *info)
+ gs_font_info_t *info)
{
int wmode = font->WMode;
gs_font_base *bfont = (gs_font_base *)font;
@@ -789,102 +788,102 @@ gs_default_font_info(gs_font *font, const gs_point *pscale, int members,
const gs_matrix *pmat;
if (pscale == 0) {
- scale.x = scale.y = 0;
- pmat = 0;
+ scale.x = scale.y = 0;
+ pmat = 0;
} else {
- scale = *pscale;
- gs_make_scaling(scale.x, scale.y, &smat);
- pmat = &smat;
+ scale = *pscale;
+ gs_make_scaling(scale.x, scale.y, &smat);
+ pmat = &smat;
}
info->members = 0;
if (members & FONT_INFO_FLAGS)
- info->Flags_returned = 0;
+ info->Flags_returned = 0;
if (font->FontType == ft_composite)
- return 0; /* nothing available */
+ return 0; /* nothing available */
if (members & FONT_INFO_BBOX) {
- info->BBox.p.x = (int)bfont->FontBBox.p.x;
- info->BBox.p.y = (int)bfont->FontBBox.p.y;
- info->BBox.q.x = (int)bfont->FontBBox.q.x;
- info->BBox.q.y = (int)bfont->FontBBox.q.y;
- info->Flags_returned |= FONT_INFO_BBOX;
+ info->BBox.p.x = (int)bfont->FontBBox.p.x;
+ info->BBox.p.y = (int)bfont->FontBBox.p.y;
+ info->BBox.q.x = (int)bfont->FontBBox.q.x;
+ info->BBox.q.y = (int)bfont->FontBBox.q.y;
+ info->Flags_returned |= FONT_INFO_BBOX;
}
if ((members & FONT_INFO_FLAGS) &&
- (info->Flags_requested & FONT_IS_FIXED_WIDTH)
- ) {
- /*
- * Scan the glyph space to compute the fixed width if any.
- */
- gs_glyph notdef = gs_no_glyph;
- gs_glyph glyph;
- int fixed_width = 0;
- int index;
- int code = 0; /* Quiet compiler. */
- int ecode = 0;
- bool has_glyphs = false;
-
- for (index = 0;
- fixed_width >= 0 &&
- (code = font->procs.enumerate_glyph(font, &index, GLYPH_SPACE_NAME, &glyph)) >= 0 &&
- index != 0;
- ) {
- gs_glyph_info_t glyph_info;
-
- code = font->procs.glyph_info(font, glyph, pmat,
- (GLYPH_INFO_WIDTH0 << wmode),
- &glyph_info);
- if (code < 0) {
- ecode = code;
- continue;
- }
- if (notdef == gs_no_glyph && gs_font_glyph_is_notdef(bfont, glyph)) {
- notdef = glyph;
- info->MissingWidth = (int)glyph_info.width[wmode].x;
- info->members |= FONT_INFO_MISSING_WIDTH;
- }
- if (glyph_info.width[wmode].y != 0)
- fixed_width = min_int;
- else if (fixed_width == 0)
- fixed_width = (int)glyph_info.width[wmode].x;
- else if (glyph_info.width[wmode].x != fixed_width)
- fixed_width = min_int;
- has_glyphs = true;
- }
- if (ecode < 0 && !has_glyphs)
- return ecode;
- if (fixed_width > 0) {
- info->Flags |= FONT_IS_FIXED_WIDTH;
- info->members |= FONT_INFO_AVG_WIDTH | FONT_INFO_MAX_WIDTH |
- FONT_INFO_MISSING_WIDTH;
- info->AvgWidth = info->MaxWidth = info->MissingWidth = fixed_width;
- }
- info->Flags_returned |= FONT_IS_FIXED_WIDTH;
+ (info->Flags_requested & FONT_IS_FIXED_WIDTH)
+ ) {
+ /*
+ * Scan the glyph space to compute the fixed width if any.
+ */
+ gs_glyph notdef = gs_no_glyph;
+ gs_glyph glyph;
+ int fixed_width = 0;
+ int index;
+ int code = 0; /* Quiet compiler. */
+ int ecode = 0;
+ bool has_glyphs = false;
+
+ for (index = 0;
+ fixed_width >= 0 &&
+ (code = font->procs.enumerate_glyph(font, &index, GLYPH_SPACE_NAME, &glyph)) >= 0 &&
+ index != 0;
+ ) {
+ gs_glyph_info_t glyph_info;
+
+ code = font->procs.glyph_info(font, glyph, pmat,
+ (GLYPH_INFO_WIDTH0 << wmode),
+ &glyph_info);
+ if (code < 0) {
+ ecode = code;
+ continue;
+ }
+ if (notdef == gs_no_glyph && gs_font_glyph_is_notdef(bfont, glyph)) {
+ notdef = glyph;
+ info->MissingWidth = (int)glyph_info.width[wmode].x;
+ info->members |= FONT_INFO_MISSING_WIDTH;
+ }
+ if (glyph_info.width[wmode].y != 0)
+ fixed_width = min_int;
+ else if (fixed_width == 0)
+ fixed_width = (int)glyph_info.width[wmode].x;
+ else if (glyph_info.width[wmode].x != fixed_width)
+ fixed_width = min_int;
+ has_glyphs = true;
+ }
+ if (ecode < 0 && !has_glyphs)
+ return ecode;
+ if (fixed_width > 0) {
+ info->Flags |= FONT_IS_FIXED_WIDTH;
+ info->members |= FONT_INFO_AVG_WIDTH | FONT_INFO_MAX_WIDTH |
+ FONT_INFO_MISSING_WIDTH;
+ info->AvgWidth = info->MaxWidth = info->MissingWidth = fixed_width;
+ }
+ info->Flags_returned |= FONT_IS_FIXED_WIDTH;
} else if (members & FONT_INFO_MISSING_WIDTH) {
- gs_glyph glyph;
- int index;
-
- for (index = 0;
- font->procs.enumerate_glyph(font, &index, GLYPH_SPACE_NAME, &glyph) >= 0 &&
- index != 0;
- ) {
- /*
- * If this is a CIDFont or TrueType font that uses integers as
- * glyph names, check for glyph 0; otherwise, check for .notdef.
- */
- if (!gs_font_glyph_is_notdef(bfont, glyph))
- continue;
- {
- gs_glyph_info_t glyph_info;
- int code = font->procs.glyph_info(font, glyph, pmat,
- (GLYPH_INFO_WIDTH0 << wmode),
- &glyph_info);
-
- if (code < 0)
- return code;
- info->MissingWidth = (int)glyph_info.width[wmode].x;
- info->members |= FONT_INFO_MISSING_WIDTH;
- break;
- }
- }
+ gs_glyph glyph;
+ int index;
+
+ for (index = 0;
+ font->procs.enumerate_glyph(font, &index, GLYPH_SPACE_NAME, &glyph) >= 0 &&
+ index != 0;
+ ) {
+ /*
+ * If this is a CIDFont or TrueType font that uses integers as
+ * glyph names, check for glyph 0; otherwise, check for .notdef.
+ */
+ if (!gs_font_glyph_is_notdef(bfont, glyph))
+ continue;
+ {
+ gs_glyph_info_t glyph_info;
+ int code = font->procs.glyph_info(font, glyph, pmat,
+ (GLYPH_INFO_WIDTH0 << wmode),
+ &glyph_info);
+
+ if (code < 0)
+ return code;
+ info->MissingWidth = (int)glyph_info.width[wmode].x;
+ info->members |= FONT_INFO_MISSING_WIDTH;
+ break;
+ }
+ }
}
return 0;
}
@@ -894,11 +893,11 @@ int
gs_default_same_font(const gs_font *font, const gs_font *ofont, int mask)
{
while (font->base != font)
- font = font->base;
+ font = font->base;
while (ofont->base != ofont)
- ofont = ofont->base;
+ ofont = ofont->base;
if (ofont == font)
- return mask;
+ return mask;
/* In general, we can't determine similarity. */
return 0;
}
@@ -908,17 +907,17 @@ gs_base_same_font(const gs_font *font, const gs_font *ofont, int mask)
int same = gs_default_same_font(font, ofont, mask);
if (!same) {
- const gs_font_base *const bfont = (const gs_font_base *)font;
- const gs_font_base *const obfont = (const gs_font_base *)ofont;
-
- if (mask & FONT_SAME_ENCODING) {
- if (bfont->encoding_index != ENCODING_INDEX_UNKNOWN ||
- obfont->encoding_index != ENCODING_INDEX_UNKNOWN
- ) {
- if (bfont->encoding_index == obfont->encoding_index)
- same |= FONT_SAME_ENCODING;
- }
- }
+ const gs_font_base *const bfont = (const gs_font_base *)font;
+ const gs_font_base *const obfont = (const gs_font_base *)ofont;
+
+ if (mask & FONT_SAME_ENCODING) {
+ if (bfont->encoding_index != ENCODING_INDEX_UNKNOWN ||
+ obfont->encoding_index != ENCODING_INDEX_UNKNOWN
+ ) {
+ if (bfont->encoding_index == obfont->encoding_index)
+ same |= FONT_SAME_ENCODING;
+ }
+ }
}
return same;
}
@@ -935,11 +934,11 @@ gs_font_glyph_is_notdef(gs_font_base *bfont, gs_glyph glyph)
gs_const_string gnstr;
if (glyph == gs_no_glyph)
- return false;
+ return false;
if (glyph >= gs_min_cid_glyph)
- return (glyph == gs_min_cid_glyph);
+ return (glyph == gs_min_cid_glyph);
return (bfont->procs.glyph_name((gs_font *)bfont, glyph, &gnstr) >= 0 &&
- gnstr.size == 7 && !memcmp(gnstr.data, ".notdef", 7));
+ gnstr.size == 7 && !memcmp(gnstr.data, ".notdef", 7));
}
/* Dummy character encoding procedure */
@@ -959,7 +958,7 @@ gs_no_decode_glyph(gs_font *pfont, gs_glyph glyph, int ch)
/* Dummy glyph enumeration procedure */
int
gs_no_enumerate_glyph(gs_font *font, int *pindex, gs_glyph_space_t glyph_space,
- gs_glyph *pglyph)
+ gs_glyph *pglyph)
{
return_error(gs_error_undefined);
}
@@ -967,7 +966,7 @@ gs_no_enumerate_glyph(gs_font *font, int *pindex, gs_glyph_space_t glyph_space,
/* Default glyph info procedure */
int
gs_default_glyph_info(gs_font *font, gs_glyph glyph, const gs_matrix *pmat,
- int members, gs_glyph_info_t *info)
+ int members, gs_glyph_info_t *info)
{ /* WMode may be inherited from an upper font. */
gx_path path;
int returned = 0;
@@ -975,69 +974,69 @@ gs_default_glyph_info(gs_font *font, gs_glyph glyph, const gs_matrix *pmat,
int wmode = ((members & GLYPH_INFO_WIDTH1) != 0);
double sbw[4] = {0, 0, 0, 0};
/* Currently glyph_outline retrieves sbw only with type 1,2,9 fonts. */
- bool charstrings_font = (font->FontType == ft_encrypted ||
- font->FontType == ft_encrypted2 ||
- font->FontType == ft_CID_encrypted);
+ bool charstrings_font = (font->FontType == ft_encrypted ||
+ font->FontType == ft_encrypted2 ||
+ font->FontType == ft_CID_encrypted);
gx_path_init_bbox_accumulator(&path);
code = gx_path_add_point(&path, fixed_0, fixed_0);
if (code < 0)
- goto out;
+ goto out;
code = font->procs.glyph_outline(font, wmode, glyph, pmat, &path, sbw);
if (code < 0)
- goto out;
+ goto out;
if (members & GLYPH_INFO_WIDTHS) {
- int wmode = font->WMode;
- int wmask = GLYPH_INFO_WIDTH0 << wmode;
-
- if (members & wmask) {
- gs_fixed_point pt;
-
- code = gx_path_current_point(&path, &pt);
- if (code < 0)
- goto out;
- info->width[wmode].x = fixed2float(pt.x);
- info->width[wmode].y = fixed2float(pt.y);
- returned |= wmask;
- }
+ int wmode = font->WMode;
+ int wmask = GLYPH_INFO_WIDTH0 << wmode;
+
+ if (members & wmask) {
+ gs_fixed_point pt;
+
+ code = gx_path_current_point(&path, &pt);
+ if (code < 0)
+ goto out;
+ info->width[wmode].x = fixed2float(pt.x);
+ info->width[wmode].y = fixed2float(pt.y);
+ returned |= wmask;
+ }
}
if (members & GLYPH_INFO_BBOX) {
- gs_fixed_rect bbox;
-
- code = gx_path_bbox(&path, &bbox);
- if (code < 0)
- goto out;
- info->bbox.p.x = fixed2float(bbox.p.x);
- info->bbox.p.y = fixed2float(bbox.p.y);
- info->bbox.q.x = fixed2float(bbox.q.x);
- info->bbox.q.y = fixed2float(bbox.q.y);
- returned |= GLYPH_INFO_BBOX;
+ gs_fixed_rect bbox;
+
+ code = gx_path_bbox(&path, &bbox);
+ if (code < 0)
+ goto out;
+ info->bbox.p.x = fixed2float(bbox.p.x);
+ info->bbox.p.y = fixed2float(bbox.p.y);
+ info->bbox.q.x = fixed2float(bbox.q.x);
+ info->bbox.q.y = fixed2float(bbox.q.y);
+ returned |= GLYPH_INFO_BBOX;
}
if (members & (GLYPH_INFO_WIDTH0 << wmode) && charstrings_font) {
- if (pmat == 0) {
- info->width[wmode].x = sbw[2];
- info->width[wmode].y = sbw[3];
- } else {
- code = gs_distance_transform(sbw[2], sbw[3], pmat, &info->width[wmode]);
- if (code < 0)
- return code;
- }
- returned |= GLYPH_INFO_WIDTH0 << wmode;
+ if (pmat == 0) {
+ info->width[wmode].x = sbw[2];
+ info->width[wmode].y = sbw[3];
+ } else {
+ code = gs_distance_transform(sbw[2], sbw[3], pmat, &info->width[wmode]);
+ if (code < 0)
+ return code;
+ }
+ returned |= GLYPH_INFO_WIDTH0 << wmode;
}
if (members & (GLYPH_INFO_VVECTOR0 << wmode) && charstrings_font) {
- if (pmat == 0) {
- info->v.x = sbw[0];
- info->v.y = sbw[1];
- } else {
- code = gs_distance_transform(sbw[0], sbw[1], pmat, &info->v);
- if (code < 0)
- return code;
- }
- returned |= GLYPH_INFO_VVECTOR0 << wmode;
+ if (pmat == 0) {
+ info->v.x = sbw[0];
+ info->v.y = sbw[1];
+ } else {
+ code = gs_distance_transform(sbw[0], sbw[1], pmat, &info->v);
+ if (code < 0)
+ return code;
+ }
+ returned |= GLYPH_INFO_VVECTOR0 << wmode;
}
if (members & GLYPH_INFO_NUM_PIECES) {
- info->num_pieces = 0;
- returned |= GLYPH_INFO_NUM_PIECES;
+ info->num_pieces = 0;
+ returned |= GLYPH_INFO_NUM_PIECES;
}
returned |= members & GLYPH_INFO_PIECES; /* no pieces stored */
out:
@@ -1048,7 +1047,7 @@ gs_default_glyph_info(gs_font *font, gs_glyph glyph, const gs_matrix *pmat,
/* Dummy glyph outline procedure */
int
gs_no_glyph_outline(gs_font *font, int WMode, gs_glyph glyph, const gs_matrix *pmat,
- gx_path *ppath, double sbw[4])
+ gx_path *ppath, double sbw[4])
{
return_error(gs_error_undefined);
}