diff options
Diffstat (limited to 'base/gsfont0.c')
-rw-r--r-- | base/gsfont0.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/base/gsfont0.c b/base/gsfont0.c new file mode 100644 index 000000000..c54100931 --- /dev/null +++ b/base/gsfont0.c @@ -0,0 +1,125 @@ +/* Copyright (C) 2001-2012 Artifex Software, Inc. + All Rights Reserved. + + This software is provided AS-IS with no warranty, either express or + implied. + + This software is distributed under license and may not be copied, + modified or distributed except as expressly authorized under the terms + of the license contained in the file LICENSE in this distribution. + + Refer to licensing information at http://www.artifex.com or contact + Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, + CA 94903, U.S.A., +1(415)492-9861, for further information. +*/ + + +/* Composite font operations for Ghostscript library */ +#include "memory_.h" +#include "gx.h" +#include "gserrors.h" +#include "gsstruct.h" +#include "gxfixed.h" +#include "gsmatrix.h" +#include "gxdevice.h" +#include "gxdevmem.h" +#include "gxfcache.h" /* gs_font_dir */ +#include "gxfont.h" +#include "gxfont0.h" + +/* Structure descriptor */ +static struct_proc_enum_ptrs(font_type0_enum_ptrs); +static struct_proc_reloc_ptrs(font_type0_reloc_ptrs); + +public_st_gs_font_type0(); +static +ENUM_PTRS_WITH(font_type0_enum_ptrs, gs_font_type0 *pfont) +ENUM_PREFIX(st_gs_font, gs_type0_data_max_ptrs); +ENUM_PTR(0, gs_font_type0, data.Encoding); +ENUM_PTR(1, gs_font_type0, data.FDepVector); +case 2: +switch (pfont->data.FMapType) +{ + case fmap_SubsVector: + ENUM_RETURN_CONST_STRING_PTR(gs_font_type0, + data.SubsVector); + case fmap_CMap: + ENUM_RETURN_PTR(gs_font_type0, data.CMap); + default: + ENUM_RETURN(0); +} +ENUM_PTRS_END +static RELOC_PTRS_WITH(font_type0_reloc_ptrs, gs_font_type0 *pfont) +RELOC_PREFIX(st_gs_font); +RELOC_PTR(gs_font_type0, data.Encoding); +RELOC_PTR(gs_font_type0, data.FDepVector); +switch (pfont->data.FMapType) +{ + case fmap_SubsVector: +RELOC_CONST_STRING_PTR(gs_font_type0, data.SubsVector); +break; + case fmap_CMap: +RELOC_PTR(gs_font_type0, data.CMap); +break; + default: +; +} +RELOC_PTRS_END + +/* Adjust a composite font by concatenating a given matrix */ +/* to the FontMatrix of all descendant composite fonts. */ +static int +gs_type0_adjust_matrix(gs_font_dir * pdir, gs_font_type0 * pfont, + const gs_matrix * pmat) +{ + gs_font **pdep = pfont->data.FDepVector; + uint fdep_size = pfont->data.fdep_size; + gs_font **ptdep; + uint i; + + /* Check for any descendant composite fonts. */ + for (i = 0; i < fdep_size; i++) + if (pdep[i]->FontType == ft_composite) + break; + if (i == fdep_size) + return 0; + ptdep = gs_alloc_struct_array(pfont->memory, fdep_size, gs_font *, + &st_gs_font_ptr_element, + "gs_type0_adjust_font(FDepVector)"); + if (ptdep == 0) + return_error(gs_error_VMerror); + memcpy(ptdep, pdep, sizeof(gs_font *) * fdep_size); + for (; i < fdep_size; i++) + if (pdep[i]->FontType == ft_composite) { + int code = gs_makefont(pdir, pdep[i], pmat, &ptdep[i]); + + if (code < 0) + return code; + } + pfont->data.FDepVector = ptdep; + return 0; +} + +/* Finish defining a composite font, */ +/* by adjusting its descendants' FontMatrices. */ +int +gs_type0_define_font(gs_font_dir * pdir, gs_font * pfont) +{ + const gs_matrix *pmat = &pfont->FontMatrix; + + /* Check for the identity matrix, which is common in root fonts. */ + if (pmat->xx == 1.0 && pmat->yy == 1.0 && + pmat->xy == 0.0 && pmat->yx == 0.0 && + pmat->tx == 0.0 && pmat->ty == 0.0 + ) + return 0; + return gs_type0_adjust_matrix(pdir, (gs_font_type0 *) pfont, pmat); +} + +/* Finish scaling a composite font similarly. */ +int +gs_type0_make_font(gs_font_dir * pdir, const gs_font * pfont, + const gs_matrix * pmat, gs_font ** ppfont) +{ + return gs_type0_adjust_matrix(pdir, (gs_font_type0 *) * ppfont, pmat); +} |