diff options
Diffstat (limited to 'nx-X11/lib/font/Type1/t1funcs.c')
-rw-r--r-- | nx-X11/lib/font/Type1/t1funcs.c | 1668 |
1 files changed, 0 insertions, 1668 deletions
diff --git a/nx-X11/lib/font/Type1/t1funcs.c b/nx-X11/lib/font/Type1/t1funcs.c deleted file mode 100644 index 9de819a0d..000000000 --- a/nx-X11/lib/font/Type1/t1funcs.c +++ /dev/null @@ -1,1668 +0,0 @@ -/* $Xorg: t1funcs.c,v 1.5 2001/02/09 02:04:01 xorgcvs Exp $ */ -/* Copyright International Business Machines,Corp. 1991 - * All Rights Reserved - * - * License, subject to the license given below, to use, - * copy, modify, and distribute this software * and its - * documentation for any purpose and without fee is hereby - * granted, provided that the above copyright notice appear - * in all copies and that both that copyright notice and - * this permission notice appear in supporting documentation, - * and that the name of IBM not be used in advertising or - * publicity pertaining to distribution of the software - * without specific, written prior permission. - * - * IBM PROVIDES THIS SOFTWARE "AS IS", WITHOUT ANY WARRANTIES - * OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT - * LIMITED TO ANY IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT OF - * THIRD PARTY RIGHTS. THE ENTIRE RISK AS TO THE QUALITY AND - * PERFORMANCE OF THE SOFTWARE, INCLUDING ANY DUTY TO SUPPORT - * OR MAINTAIN, BELONGS TO THE LICENSEE. SHOULD ANY PORTION OF - * THE SOFTWARE PROVE DEFECTIVE, THE LICENSEE (NOT IBM) ASSUMES - * THE ENTIRE COST OF ALL SERVICING, REPAIR AND CORRECTION. IN - * NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING - * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF - * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS - * SOFTWARE. - * - * Author: Jeffrey B. Lotspiech, IBM Almaden Research Center - * Modeled on spfuncs.c by Dave Lemke, Network Computing Devices, Inc - * which contains the following copyright and permission notices: - * - * Copyright 1990, 1991 Network Computing Devices; - * Portions Copyright 1987 by Digital Equipment Corporation - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the names of Network Computing Devices - * or Digital not be used in advertising or publicity pertaining to - * distribution of the software without specific, written prior permission. - * Network Computing Devices or Digital make no representations about the - * suitability of this software for any purpose. It is provided "as is" - * without express or implied warranty. - * - * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES OR DIGITAL BE - * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION - * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -/* Copyright (c) 1994-1999 Silicon Graphics, Inc. All Rights Reserved. - * - * The contents of this file are subject to the CID Font Code Public Licence - * Version 1.0 (the "License"). You may not use this file except in compliance - * with the Licence. You may obtain a copy of the License at Silicon Graphics, - * Inc., attn: Legal Services, 2011 N. Shoreline Blvd., Mountain View, CA - * 94043 or at http://www.sgi.com/software/opensource/cid/license.html. - * - * Software distributed under the License is distributed on an "AS IS" basis. - * ALL WARRANTIES ARE DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED - * WARRANTIES OF MERCHANTABILITY, OF FITNESS FOR A PARTICULAR PURPOSE OR OF - * NON-INFRINGEMENT. See the License for the specific language governing - * rights and limitations under the License. - * - * The Original Software is CID font code that was developed by Silicon - * Graphics, Inc. - */ -/* $XFree86: xc/lib/font/Type1/t1funcs.c,v 3.33 2003/07/19 13:16:40 tsi Exp $ */ - -/* - -Copyright 1987, 1994, 1998 The Open Group - -Permission to use, copy, modify, distribute, and sell this software and its -documentation for any purpose is hereby granted without fee, provided that -the above copyright notice appear in all copies and that both that -copyright notice and this permission notice appear in supporting -documentation. - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. - -Except as contained in this notice, the name of The Open Group shall -not be used in advertising or otherwise to promote the sale, use or -other dealings in this Software without prior written authorization -from The Open Group. - -*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#ifdef BUILDCID -#define XFONT_CID 1 -#endif - -#ifndef FONTMODULE -#include <string.h> -#if XFONT_CID -#include <stdlib.h> -#include <sys/types.h> -#include <dirent.h> -#endif -#ifdef _XOPEN_SOURCE -#include <math.h> -#else -#define _XOPEN_SOURCE /* to get prototype for hypot on some systems */ -#include <math.h> -#undef _XOPEN_SOURCE -#endif -#include "X11/Xfuncs.h" -#ifdef USE_MMAP -#include <sys/types.h> -#include <sys/mman.h> -#endif -#else -#include "Xmd.h" -#include "Xdefs.h" -#endif - -#ifdef FONTMODULE -#include "os.h" -#include "xf86_ansic.h" -#endif - -#include <X11/fonts/fntfilst.h> -#include <X11/fonts/fontutil.h> -#include <X11/fonts/FSproto.h> -#include <X11/fonts/fontenc.h> -#include "t1unicode.h" - -#if XFONT_CID -#include "range.h" -#endif - -#include "objects.h" -#include "spaces.h" -#include "paths.h" -#include "regions.h" -#include "t1stdio.h" -#include "util.h" -#include "fontfcn.h" -#include "t1intf.h" - - -static int Type1GetGlyphs ( FontPtr pFont, unsigned long count, - unsigned char *chars, FontEncoding charEncoding, - unsigned long *glyphCount, CharInfoPtr *glyphs ); - -#if XFONT_CID -#define CMapDir "/CMap/" -#define CFMDir "/CFM/" -#define CIDFontDir "/CIDFont/" -#endif - -static int Type1GetMetrics ( FontPtr pFont, unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, - xCharInfo **glyphs ); - - -#define minchar(p) ((p).min_char_low + ((p).min_char_high << 8)) -#define maxchar(p) ((p).max_char_low + ((p).max_char_high << 8)) - -static void fillrun ( char *p, pel x0, pel x1, int bit ); - -extern psfont *FontP; -extern psobj *ISOLatin1EncArrayP; - -#if XFONT_CID -extern char CurCIDFontName[]; -extern char CurCMapName[]; - -static CharInfoPtr CIDGetGlyph ( FontPtr pFont, unsigned int charcode, - CharInfoPtr pci ); - -extern cidfont *CIDFontP; -extern cmapres *CMapP; -#endif - -static void fill ( char *dest, int h, int w, struct region *area, int byte, - int bit, int wordsize ); - -#if XFONT_CID -int -CIDOpenScalable (FontPathElementPtr fpe, - FontPtr *ppFont, - int flags, - FontEntryPtr entry, - char *fileName, - FontScalablePtr vals, - fsBitmapFormat format, - fsBitmapFormatMask fmask, - FontPtr non_cachable_font) /* We don't do licensing */ -{ - FontPtr pFont; - int bit, - byte, - glyph, - scan, - image; - long *pool; /* memory pool for ximager objects */ - int size; /* for memory size calculations */ - struct XYspace *S; /* coordinate space for character */ - register int i; - int nchars, len, rc; - cidglyphs *cid; - char *p; - double t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; - double sxmult; - char CIDFontName[CID_NAME_MAX]; - char CMapName[CID_NAME_MAX]; - char cidfontname[CID_PATH_MAX]; - char cmapname[CID_PATH_MAX]; - char *path; - char cidfontpath[CID_PATH_MAX]; - char cmappath[CID_PATH_MAX]; -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) - char cfmdir[CID_PATH_MAX]; - char cfmfilename[CID_NAME_MAX]; -#endif -#if defined(CID_ALL_CHARS) - char *cf; -#else - long sAscent, sDescent; -#endif - - /* check the font name */ - len = strlen(fileName); - if (len <= 0 || len > CID_NAME_MAX - 1) - return BadFontName; - -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) - strcpy(cfmdir, fileName); - p = strrchr(cfmdir, '/'); - if (p) *p = '\0'; -#endif - - path = fileName; - if (!(fileName = strrchr(fileName, '/'))) - return BadFontName; - - len = fileName - path; - strncpy(cidfontpath, path, len); - cidfontpath[len] = '\0'; - strcpy(cmappath, cidfontpath); - strcat(cmappath, CMapDir); -#ifdef HAVE_CFM - strcpy(cfmdir, cidfontpath); - strcat(cfmdir, CFMDir); -#endif - strcat(cidfontpath, CIDFontDir); - - fileName++; - - /* extract the CIDFontName and CMapName from the font name */ - /* check for <CIDFontName>--<CMapName> */ - if ((p = strstr(fileName, "--"))) { - if (p == fileName) - return BadFontName; - else { - strcpy(CIDFontName, fileName); - CIDFontName[p - fileName] = '\0'; - p += 2; - i = 0; - while (*p && *p != '.') - CMapName[i++] = *p++; - CMapName[i] = '\0'; - if ((len = strlen(CMapName)) <= 0) - return BadFontName; - } - } else - return BadFontName; - - /* The CMap files whose names end with -V are not yet supported */ - len = strlen(CMapName); - if ((len >= 2 && CMapName[len - 2] == '-' && CMapName[len - 1] == 'V') || - (len == 1 && CMapName[len - 1] == 'V')) - return BadFontName; - - /* Reject ridiculously small font sizes that will blow up the math */ - if (hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]) < 1.0 || - hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) < 1.0) - return BadFontName; - -#ifdef CID_ALL_CHARS - if ((cf = getenv("CFMDIR")) == NULL) - strcat(cfmdir, CFMDir); - else { - strcpy(cfmdir, cf); - strcat(cfmdir, "/"); - } -#endif - -#if defined(HAVE_CFM) || defined(CID_ALL_CHARS) - strcpy(cfmfilename, cfmdir); - strcat(cfmfilename, CIDFontName); - strcat(cfmfilename, "--"); - strcat(cfmfilename, CMapName); - strcat(cfmfilename, ".cfm"); -#endif - - /* create a full-path name for a CIDFont file */ - if (strlen(cidfontpath) + strlen(CIDFontName) + 2 > - CID_PATH_MAX) - return BadFontName; - strcpy(cidfontname, cidfontpath); - strcat(cidfontname, CIDFontName); - - /* create a full-path name for a CMap file */ - if (strlen(cmappath) + strlen(CMapName) + 2 > CID_PATH_MAX) - return BadFontName; - strcpy(cmapname, cmappath); - strcat(cmapname, CMapName); - - /* set up default values */ - FontDefaultFormat(&bit, &byte, &glyph, &scan); - /* get any changes made from above */ - rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); - if (rc != Successful) - return rc; - -#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - - if (!(pFont = CreateFontRec())) - return AllocError; - - cid = (cidglyphs *)xalloc(sizeof(cidglyphs)); - if (cid == NULL) { - DestroyFontRec(pFont); - return AllocError; - } - bzero(cid, sizeof(cidglyphs)); - - /* heuristic for "maximum" size of pool we'll need: */ - size = 200000 + 600 * - (int)hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) - * sizeof(short); - if (size < 0 || NULL == (pool = (long *) xalloc(size))) { - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - - addmemory(pool, size); - - /* load font if not already loaded */ - if (!CIDfontfcnA(cidfontname, cmapname, &rc)) { - FontP = NULL; - delmemory(); - xfree(pool); - xfree(cid); - DestroyFontRec(pFont); - return Type1ReturnCodeToXReturnCode(rc); - } - - FontP = NULL; - - S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, - t1, t2, t3, t4); - - S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, - vals->pixel_matrix[0], - -vals->pixel_matrix[1], - vals->pixel_matrix[2], - -vals->pixel_matrix[3])); - - /* multiplier for computation of raw values */ - sxmult = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - - pFont->info.firstRow = CMapP->firstRow; - pFont->info.firstCol = CMapP->firstCol; - pFont->info.lastRow = CMapP->lastRow; - pFont->info.lastCol = CMapP->lastCol; - - nchars = (pFont->info.lastRow - pFont->info.firstRow + 1) * - (pFont->info.lastCol - pFont->info.firstCol + 1); - - delmemory(); - xfree(pool); - - if (pFont->info.firstCol > pFont->info.lastCol) - { - xfree(cid); - DestroyFontRec(pFont); - return BadFontName; - } - - cid->glyphs = (CharInfoRec **)xalloc(nchars*sizeof(CharInfoRec *)); - if (cid->glyphs == NULL) { - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - bzero(cid->glyphs, nchars*sizeof(CharInfoRec *)); - - pFont->info.defaultCh = 0; - pFont->format = format; - - pFont->bit = bit; - pFont->byte = byte; - pFont->glyph = glyph; - pFont->scan = scan; - - pFont->get_metrics = CIDGetMetrics; - pFont->get_glyphs = CIDGetGlyphs; - pFont->unload_font = CIDCloseFont; - pFont->unload_glyphs = NULL; - pFont->refcnt = 0; - - len = strlen(cidfontname); - cid->CIDFontName = (char *)xalloc(len + 1); - if (cid->CIDFontName == NULL) { - xfree(cid->glyphs); - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - strcpy(cid->CIDFontName, cidfontname); - - len = strlen(cmapname); - cid->CMapName = (char *)xalloc(len + 1); - if (cid->CMapName == NULL) { - xfree(cid->CIDFontName); - xfree(cid->glyphs); - xfree(cid); - DestroyFontRec(pFont); - return AllocError; - } - strcpy(cid->CMapName, cmapname); - - cid->pixel_matrix[0] = vals->pixel_matrix[0]; - cid->pixel_matrix[1] = vals->pixel_matrix[1]; - cid->pixel_matrix[2] = vals->pixel_matrix[2]; - cid->pixel_matrix[3] = vals->pixel_matrix[3]; - - pFont->fontPrivate = (unsigned char *)cid; - - pFont->info.fontAscent = - (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer * - vals->pixel_matrix[3] + - (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer > - 0 ? 500 : -500)) / 1000; - - pFont->info.fontDescent = - -(int)((double)CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer - * vals->pixel_matrix[3] + - (CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer > - 0 ? 500 : -500)) / 1000; - - /* Adobe does not put isFixedPitch entries in CID-keyed fonts. */ - /* CID-keyed are not constant-width fonts. */ - pFont->info.constantWidth = 0; - -#ifndef CID_ALL_CHARS - sAscent = CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[3].data.integer; - sDescent = -CIDFontP->CIDfontInfoP[CIDFONTBBOX].value.data.arrayP[1].data.integer; -#endif - - if (strncmp(entry->name.name, "-bogus", 6)) { -#ifdef CID_ALL_CHARS - ComputeBoundsAllChars(pFont, cfmfilename, sxmult); -#else -#ifdef HAVE_CFM - CIDFillFontInfo(pFont, vals, cidfontname, entry->name.name, cmapname, - cfmfilename, sAscent, sDescent, sxmult); -#else - CIDFillFontInfo(pFont, vals, cidfontname, entry->name.name, cmapname, - sAscent, sDescent, sxmult); -#endif /* HAVE_CFM */ -#endif /* CID_ALL_CHARS */ - } - - *ppFont = pFont; - - return Successful; -} -#endif - -/*ARGSUSED*/ -int -Type1OpenScalable (FontPathElementPtr fpe, - FontPtr *ppFont, - int flags, - FontEntryPtr entry, - char *fileName, - FontScalablePtr vals, - fsBitmapFormat format, - fsBitmapFormatMask fmask, - FontPtr non_cachable_font) /* We don't do licensing */ -{ - FontPtr pFont; - int bit, - byte, - glyph, - scan, - image; - int pad,wordsize; /* scan & image in bits */ - long *pool; /* memory pool for ximager objects */ - int size; /* for memory size calculations */ - struct XYspace *S; /* coordinate space for character */ - struct region *area; - CharInfoRec *glyphs; - int len, rc, count = 0, i = 0; - struct type1font *type1; - char *p; - FontMapPtr mapping = NULL; - int no_mapping; - psobj *fontmatrix; - long x0, total_width = 0, total_raw_width = 0; - double x1, y1, t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; - double sxmult; - - /* Reject ridiculously small font sizes that will blow up the math */ - if (hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]) < 1.0 || - hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) < 1.0) - return BadFontName; - - /* set up default values */ - FontDefaultFormat(&bit, &byte, &glyph, &scan); - /* get any changes made from above */ - rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); - if (rc != Successful) - return rc; - - pad = glyph * 8; - wordsize = scan * 8; - -#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - - pFont = CreateFontRec(); - if (pFont == NULL) - return AllocError; - - type1 = (struct type1font *)xalloc(sizeof(struct type1font)); - if (type1 == NULL) { - DestroyFontRec(pFont); - return AllocError; - } - bzero(type1, sizeof(struct type1font)); - - /* heuristic for "maximum" size of pool we'll need: */ -#if XFONT_CID - size = 400000 + 600 * -#else - size = 200000 + 600 * -#endif - (int)hypot(vals->pixel_matrix[2], vals->pixel_matrix[3]) - * sizeof(short); - if (size < 0 || NULL == (pool = (long *) xalloc(size))) { - xfree(type1); - DestroyFontRec(pFont); - return AllocError; - } - - addmemory(pool, size); - - - glyphs = type1->glyphs; - - /* load font if not already loaded */ - if (!fontfcnA(fileName, &rc)) { - delmemory(); - xfree(type1); - DestroyFontRec(pFont); - xfree(pool); - return Type1ReturnCodeToXReturnCode(rc); - } - - fontmatrix = &FontP->fontInfoP[FONTMATRIX].value; - if (objPIsArray(fontmatrix) && fontmatrix->len == 6) - { -#define assign(n,d,f) if (objPIsInteger(fontmatrix->data.arrayP + n)) \ - d = fontmatrix->data.arrayP[n].data.integer; \ - else if (objPIsReal(fontmatrix->data.arrayP + n)) \ - d = fontmatrix->data.arrayP[n].data.real; \ - else d = f; - - assign(0, t1, .001); - assign(1, t2, 0.0); - assign(2, t3, 0.0); - assign(3, t4, .001); - } - - S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, - t1, t2, t3, t4); - - S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, - vals->pixel_matrix[0], - -vals->pixel_matrix[1], - vals->pixel_matrix[2], - -vals->pixel_matrix[3])); - - - /* multiplier for computation of raw values */ - sxmult = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - - no_mapping=0; - p = FontEncFromXLFD(entry->name.name, entry->name.length); - - if(p==0) { /* XLFD does not specify an encoding */ - mapping=0; - no_mapping=2; /* ISO 8859-1 */ - } - - if(!strcmp(p, "adobe-fontspecific")) { - mapping=0; - no_mapping=1; /* font's native encoding vector */ - } - - pFont->info.firstCol = 255; - pFont->info.lastCol = 0; - - if(!no_mapping) { - mapping = FontEncMapFind(p, - FONT_ENCODING_POSTSCRIPT, -1, -1, - fileName); - if(!mapping) - mapping = FontEncMapFind(p, - FONT_ENCODING_UNICODE, -1, -1, - fileName); - if(!mapping) - goto NoEncoding; - else - no_mapping=0; - } - - for (i=0; i < 256; i++) { - long h,w; - long paddedW; - int j; - char *codename; - - if(no_mapping == 1) { - codename = FontP->fontInfoP[ENCODING]. - value.data.arrayP[i].data.valueP; - len = FontP->fontInfoP[ENCODING]. - value.data.arrayP[i].len; - } else if(no_mapping) { - codename = unicodetoPSname(i); - len = codename ? strlen(codename) : 0; - } else { - if(mapping->type == FONT_ENCODING_UNICODE) { - codename = unicodetoPSname(FontEncRecode(i, mapping)); - } else - codename = FontEncName(i, mapping); - len=codename?strlen(codename):0; - } - - /* Avoid multiply rasterising the undefined glyph */ - if(len==7 && !strncmp(codename, ".notdef", 7)) { - len=0; - codename=0; - } - - /* But do rasterise it at least once */ - if(len==0) { - if(i==0) { - codename=".notdef"; - len=7; - } else - continue; - } - - /* See if this character is in the list of ranges specified - in the XLFD name */ - if(i!=0) { - for (j = 0; j < vals->nranges; j++) - if (i >= minchar(vals->ranges[j]) && - i <= maxchar(vals->ranges[j])) - break; - - /* If not, don't realize it. */ - if (vals->nranges && j == vals->nranges) - continue; - } - - rc = 0; - area = (struct region *)fontfcnB(S, (unsigned char *)codename, - &len, &rc); - if (rc < 0) { - rc = Type1ReturnCodeToXReturnCode(rc); - break; - } - else if (rc > 0) - continue; - - if (area == NULL) - continue; - - if (pFont->info.firstCol > i) - pFont->info.firstCol = i; - if (pFont->info.lastCol < i) - pFont->info.lastCol = i; - - h = area->ymax - area->ymin; - w = area->xmax - area->xmin; - paddedW = PAD(w, pad); - - if (h > 0 && w > 0) { - size = h * paddedW / 8; - glyphs[i].bits = (char *)xalloc(size); - if (glyphs[i].bits == NULL) { - rc = AllocError; - break; - } - } - else { - size = 0; - h = w = 0; - area->xmin = area->xmax = 0; - area->ymax = area->ymax = 0; - } - - glyphs[i].metrics.leftSideBearing = area->xmin; - x1 = (double)(x0 = area->ending.x - area->origin.x); - y1 = (double)(area->ending.y - area->origin.y); - glyphs[i].metrics.characterWidth = - (x0 + (x0 > 0 ? FPHALF : -FPHALF)) / (1 << FRACTBITS); - if (!glyphs[i].metrics.characterWidth && size == 0) - { - /* Zero size and zero extents: presumably caused by - the choice of transformation. Let's create a - small bitmap so we're not mistaken for an undefined - character. */ - h = w = 1; - size = paddedW = PAD(w, pad); - glyphs[i].bits = (char *)xalloc(size); - if (glyphs[i].bits == NULL) { - rc = AllocError; - break; - } - } - glyphs[i].metrics.attributes = - NEARESTPEL((long)(hypot(x1, y1) * sxmult)); - total_width += glyphs[i].metrics.attributes; - total_raw_width += abs((int)(INT16)glyphs[i].metrics.attributes); - count++; - glyphs[i].metrics.rightSideBearing = w + area->xmin; - glyphs[i].metrics.descent = area->ymax - NEARESTPEL(area->origin.y); - glyphs[i].metrics.ascent = h - glyphs[i].metrics.descent; - - - bzero(glyphs[i].bits, size); - if (h > 0 && w > 0) { - fill(glyphs[i].bits, h, paddedW, area, byte, bit, wordsize ); - } - - Destroy(area); - } - NoEncoding: - - delmemory(); - xfree(pool); - - if (pFont->info.firstCol > pFont->info.lastCol) - { - xfree(type1); - DestroyFontRec(pFont); - return BadFontName; - } - - if (i != 256) { - for (i--; i >= 0; i--) - if (glyphs[i].bits != NULL) - xfree(glyphs[i].bits); - xfree(type1); - DestroyFontRec(pFont); - return rc; - } - type1->pDefault = NULL; - - pFont->format = format; - - pFont->bit = bit; - pFont->byte = byte; - pFont->glyph = glyph; - pFont->scan = scan; - - pFont->info.firstRow = 0; - pFont->info.lastRow = 0; - - pFont->get_metrics = Type1GetMetrics; - pFont->get_glyphs = Type1GetGlyphs; - pFont->unload_font = Type1CloseFont; - pFont->unload_glyphs = NULL; - pFont->refcnt = 0; - - pFont->fontPrivate = (unsigned char *) type1; - - if (count) - { - total_raw_width = (total_raw_width * 10 + count / 2) / count; - if (total_width < 0) - { - /* Predominant direction is R->L */ - total_raw_width = -total_raw_width; - } - vals->width = (int)((double)total_raw_width * - vals->pixel_matrix[0] / 1000.0 + - (vals->pixel_matrix[0] > 0 ? .5 : -.5)); - } - - T1FillFontInfo(pFont, vals, fileName, entry->name.name, total_raw_width); - - *ppFont = pFont; - return Successful; -} - -#if XFONT_CID -unsigned int -getCID(FontPtr pFont, unsigned int charcode) -{ - unsigned int cidcode = 0; - Bool charvalid = FALSE; - cidglyphs *cid; - int i, j; - unsigned int char_row, char_col, rangelo_row, rangelo_col, k; - unsigned int rangehi_row, rangehi_col; - spacerange *spacerangeP; - cidrange *notdefrangeP, *cidrangeP; - - cid = (cidglyphs *)pFont->fontPrivate; - - if (cid == NULL) - return cidcode; - - char_row = (charcode >> 8) & 0xff; - char_col = charcode & 0xff; - - spacerangeP = CIDFontP->spacerangeP; - for (i = 0; i < CIDFontP->spacerangecnt; i++) { - for (j = 0; j < spacerangeP->rangecnt; j++) { - rangelo_row = - (spacerangeP->spacecode[j].srcCodeLo >> 8) & 0xff; - rangelo_col = spacerangeP->spacecode[j].srcCodeLo & 0xff; - rangehi_row = - (spacerangeP->spacecode[j].srcCodeHi >> 8) & 0xff; - rangehi_col = spacerangeP->spacecode[j].srcCodeHi & 0xff; - if (char_row >= rangelo_row && char_row <= rangehi_row && - char_col >= rangelo_col && char_col <= rangehi_col) { - charvalid = TRUE; - break; - } - } - if (charvalid) break; - spacerangeP = spacerangeP->next; - } - - if (charvalid) { - charvalid = FALSE; - cidrangeP = CIDFontP->cidrangeP; - for (i = 0; i < CIDFontP->cidrangecnt; i++) { - for (j = 0; j < cidrangeP->rangecnt; j++) { - rangelo_row = - (cidrangeP->range[j].srcCodeLo >> 8) & 0xff; - rangelo_col = cidrangeP->range[j].srcCodeLo & 0xff; - rangehi_row = - (cidrangeP->range[j].srcCodeHi >> 8) & 0xff; - rangehi_col = cidrangeP->range[j].srcCodeHi & 0xff; - if (char_row >= rangelo_row && char_row <= rangehi_row && - char_col >= rangelo_col && char_col <= rangehi_col) { - charvalid = TRUE; - for (k = cidrangeP->range[j].srcCodeLo; - k <= cidrangeP->range[j].srcCodeHi; k++) { - if (k == charcode) - cidcode = cidrangeP->range[j].dstCIDLo + k - - cidrangeP->range[j].srcCodeLo; - } - break; - } - } - if (charvalid) break; - cidrangeP = cidrangeP->next; - } - } - - if (charvalid) { - charvalid = FALSE; - notdefrangeP = CIDFontP->notdefrangeP; - for (i = 0; i < CIDFontP->notdefrangecnt; i++) { - for (j = 0; j < notdefrangeP->rangecnt; j++) { - rangelo_row = - (notdefrangeP->range[j].srcCodeLo >> 8) & 0xff; - rangelo_col = notdefrangeP->range[j].srcCodeLo & 0xff; - rangehi_row = - (notdefrangeP->range[j].srcCodeHi >> 8) & 0xff; - rangehi_col = notdefrangeP->range[j].srcCodeHi & 0xff; - if (char_row >= rangelo_row && char_row <= rangehi_row && - char_col >= rangelo_col && char_col <= rangehi_col) { - charvalid = TRUE; - for (k = notdefrangeP->range[j].srcCodeLo; - k <= notdefrangeP->range[j].srcCodeHi; k++) { - if (k == charcode) - /* the whole range is mapped to a single CID code */ - cidcode = notdefrangeP->range[j].dstCIDLo; - } - break; - } - } - if (charvalid) break; - notdefrangeP = notdefrangeP->next; - } - } - - /* If you specify a CMap that has more CIDs than a specified CIDFont, */ - /* the program could go beyond the number of entries in CIDMap. Make */ - /* sure that that does not happen. */ - if (cidcode < CIDFontP->CIDfontInfoP[CIDCOUNT].value.data.integer) - return cidcode; - else - return 0; -} - -static CharInfoPtr -CIDGetGlyph(FontPtr pFont, unsigned int charcode, CharInfoPtr pci) -{ - int rc; - CharInfoPtr cp = NULL; - unsigned int cidcode; - - /* character code -> CID */ - cidcode = getCID(pFont, charcode); - - cp = CIDGetGlyphInfo(pFont, cidcode, pci, &rc); - - if (rc != Successful && cidcode) { - cidcode = 0; - cp = CIDGetGlyphInfo(pFont, cidcode, pci, &rc); - } - - return cp; -} - -int -CIDGetGlyphs(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - CharInfoPtr *glyphs) /* RETURN */ -{ - unsigned int code, char_row, char_col; - CharInfoPtr *glyphsBase; - register unsigned int c; - CharInfoPtr pci; - CharInfoPtr pDefault; - cidglyphs *cid; - register int firstCol; - int rc = 0; - int cid_valid = 0; - - cid = (cidglyphs *)pFont->fontPrivate; - - FontP = NULL; - - firstCol = pFont->info.firstCol; - pDefault = cid->pDefault; - glyphsBase = glyphs; - - switch (charEncoding) { - -#define EXIST(pci) \ - ((pci)->metrics.attributes || \ - (pci)->metrics.ascent != -(pci)->metrics.descent || \ - (pci)->metrics.leftSideBearing != (pci)->metrics.rightSideBearing) - - case Linear8Bit: - case TwoD8Bit: - if (pFont->info.firstRow > 0) - break; - while (count--) { - c = (*chars++); - if (c >= firstCol && c <= pFont->info.lastCol) { - code = c - firstCol; - if (!(pci = (CharInfoRec *)cid->glyphs[code]) || - ((long)pci->bits == CID_BITMAP_UNDEFINED)) { - /* load font if not already loaded */ - if(!cid_valid) { - if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; - return Type1ReturnCodeToXReturnCode(rc); - } - cid_valid = 1; - } - pci = CIDGetGlyph(pFont, c, pci); - } - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - case Linear16Bit: - while (count--) { - char_row = *chars++; - char_col = *chars++; - c = char_row << 8; - c = (c | char_col); - if (pFont->info.firstRow <= char_row && char_row <= - pFont->info.lastRow && pFont->info.firstCol <= char_col && - char_col <= pFont->info.lastCol) { - code = pFont->info.lastCol - pFont->info.firstCol + 1; - char_row = char_row - pFont->info.firstRow; - char_col = char_col - pFont->info.firstCol; - code = char_row * code + char_col; - if (!(pci = (CharInfoRec *)cid->glyphs[code]) || - ((long)pci->bits == CID_BITMAP_UNDEFINED)) { - /* load font if not already loaded */ - if(!cid_valid) { - if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; - return Type1ReturnCodeToXReturnCode(rc); - } - cid_valid = 1; - } - pci = CIDGetGlyph(pFont, c, pci); - } - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - - case TwoD16Bit: - while (count--) { - char_row = (*chars++); - char_col = (*chars++); - c = char_row << 8; - c = (c | char_col); - if (pFont->info.firstRow <= char_row && char_row <= - pFont->info.lastRow && pFont->info.firstCol <= char_col && - char_col <= pFont->info.lastCol) { - code = pFont->info.lastCol - pFont->info.firstCol + 1; - char_row = char_row - pFont->info.firstRow; - char_col = char_col - pFont->info.firstCol; - code = char_row * code + char_col; - if (!(pci = (CharInfoRec *)cid->glyphs[code]) || - ((long)pci->bits == CID_BITMAP_UNDEFINED)) { - /* load font if not already loaded */ - if(!cid_valid) { - if(!CIDfontfcnA(cid->CIDFontName, cid->CMapName, &rc)) { FontP = NULL; - return Type1ReturnCodeToXReturnCode(rc); - } - cid_valid = 1; - } - pci = CIDGetGlyph(pFont, c, pci); - } - if (pci && EXIST(pci)) { - *glyphs++ = pci; - cid->glyphs[code] = pci; - } else if (pDefault) { - *glyphs++ = pDefault; - cid->glyphs[code] = pDefault; - } - } else if (pDefault) - *glyphs++ = pDefault; - } - break; - } - *glyphCount = glyphs - glyphsBase; - return Successful; - -#undef EXIST -} -#endif - -static int -Type1GetGlyphs(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - CharInfoPtr *glyphs) /* RETURN */ -{ - unsigned int firstRow; - unsigned int numRows; - CharInfoPtr *glyphsBase; - register unsigned int c; - register CharInfoPtr pci; - unsigned int r; - CharInfoPtr pDefault; - register struct type1font *type1Font; - register int firstCol; - - type1Font = (struct type1font *) pFont->fontPrivate; - firstCol = pFont->info.firstCol; - pDefault = type1Font->pDefault; - glyphsBase = glyphs; - - switch (charEncoding) { - -#define EXIST(pci) \ - ((pci)->metrics.attributes || \ - (pci)->metrics.ascent != -(pci)->metrics.descent || \ - (pci)->metrics.leftSideBearing != (pci)->metrics.rightSideBearing) - - case Linear8Bit: - case TwoD8Bit: - if (pFont->info.firstRow > 0) - break; - while (count--) { - c = (*chars++); - if (c >= firstCol && - (pci = &type1Font->glyphs[c]) && - EXIST(pci)) - *glyphs++ = pci; - else if (pDefault) - *glyphs++ = pDefault; - } - break; - case Linear16Bit: - while (count--) { - c = *chars++ << 8; - c = (c | *chars++); - if (c < 256 && c >= firstCol && - (pci = &type1Font->glyphs[c]) && - EXIST(pci)) - *glyphs++ = pci; - else if (pDefault) - *glyphs++ = pDefault; - } - break; - - case TwoD16Bit: - firstRow = pFont->info.firstRow; - numRows = pFont->info.lastRow - firstRow + 1; - while (count--) { - r = (*chars++) - firstRow; - c = (*chars++); - if (r < numRows && c < 256 && c >= firstCol && - (pci = &type1Font->glyphs[(r << 8) + c]) && - EXIST(pci)) - *glyphs++ = pci; - else if (pDefault) - *glyphs++ = pDefault; - } - break; - } - *glyphCount = glyphs - glyphsBase; - return Successful; - -#undef EXIST -} - -#if XFONT_CID -static CharInfoRec nonExistantChar; - -int -CIDGetMetrics(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - xCharInfo **glyphs) /* RETURN */ -{ - int ret; - cidglyphs *cid; - CharInfoPtr oldDefault; - char cidafmname[CID_PATH_MAX]; - char CIDFontName[CID_NAME_MAX]; - char *ptr; - - cid = (cidglyphs *)pFont->fontPrivate; - - strcpy(cidafmname, cid->CIDFontName); - if (!(ptr = strrchr(cidafmname, '/'))) - return BadFontName; - - *ptr = '\0'; - - strcpy(CIDFontName, ptr + 1); - - if (!(ptr = strrchr(cidafmname, '/'))) - return BadFontName; - - *ptr = '\0'; - - strcat(cidafmname, "/AFM/"); - strcat(cidafmname, CIDFontName); - - strcat(cidafmname, ".afm"); - - oldDefault = cid->pDefault; - cid->pDefault = &nonExistantChar; - - ret = CIDGetAFM(pFont, count, chars, charEncoding, glyphCount, (CharInfoPtr -*)glyphs, cidafmname); - if (ret != Successful) - ret = CIDGetGlyphs(pFont, count, chars, charEncoding, glyphCount, - (CharInfoPtr *)glyphs); - - *ptr = 0; - cid->pDefault = oldDefault; - return ret; -} -#endif - -static int -Type1GetMetrics(FontPtr pFont, - unsigned long count, - unsigned char *chars, - FontEncoding charEncoding, - unsigned long *glyphCount, /* RETURN */ - xCharInfo **glyphs) /* RETURN */ -{ - static CharInfoRec nonExistantChar; - - int ret; - struct type1font *type1Font; - CharInfoPtr oldDefault; - - type1Font = (struct type1font *) pFont->fontPrivate; - oldDefault = type1Font->pDefault; - type1Font->pDefault = &nonExistantChar; - ret = Type1GetGlyphs(pFont, count, chars, charEncoding, glyphCount, (CharInfoPtr *) glyphs); - type1Font->pDefault = oldDefault; - return ret; -} - -#if XFONT_CID -void -CIDCloseFont(FontPtr pFont) -{ - register int i; - cidglyphs *cid; - int nchars; - - if (pFont) { - - cid = (cidglyphs *)pFont->fontPrivate; - - if (cid) { - - if (cid->CIDFontName && !strcmp(cid->CIDFontName, CurCIDFontName) - && cid->CMapName && !strcmp(cid->CMapName, CurCMapName)){ - strcpy(CurCIDFontName, ""); /* initialize to none */ - strcpy(CurCMapName, ""); /* initialize to none */ - } - - if (cid->CIDFontName) - xfree(cid->CIDFontName); - - if (cid->CMapName) - xfree(cid->CMapName); - - nchars = (pFont->info.lastRow - pFont->info.firstRow + 1) * - (pFont->info.lastCol - pFont->info.firstCol + 1); - - for (i = 0; i < nchars; i++) { - if (cid->glyphs[i] && (cid->glyphs[i] != &nonExistantChar)) { - if (cid->glyphs[i]->bits) - xfree(cid->glyphs[i]->bits); - xfree(cid->glyphs[i]); - } - } - - if (cid->glyphs) - xfree(cid->glyphs); - - if (cid->AFMinfo) - xfree(cid->AFMinfo); -#ifdef USE_MMAP - if (cid->CIDdata) - munmap(cid->CIDdata, cid->CIDsize); -#endif - xfree(cid); - } - - if (pFont->info.props) - xfree(pFont->info.props); - - if (pFont->info.isStringProp) - xfree(pFont->info.isStringProp); - - DestroyFontRec(pFont); - } -} -#endif - -void -Type1CloseFont(FontPtr pFont) -{ - register int i; - struct type1font *type1; - - type1 = (struct type1font *) pFont->fontPrivate; - for (i=0; i < 256; i++) - if (type1->glyphs[i].bits != NULL) - xfree(type1->glyphs[i].bits); - xfree(type1); - - if (pFont->info.props) - xfree(pFont->info.props); - - if (pFont->info.isStringProp) - xfree(pFont->info.isStringProp); - - DestroyFontRec(pFont); -} - -static void -fill(char *dest, /* destination bitmap */ - int h, int w, /* dimensions of 'dest', w padded */ - struct region *area, /* region to write to 'dest' */ - int byte, int bit, /* flags; LSBFirst or MSBFirst */ - int wordsize) /* number of bits per word for LSB/MSB purposes */ -{ - register struct edgelist *edge; /* for looping through edges */ - register char *p; /* current scan line in 'dest' */ - register int y; /* for looping through scans */ - register int wbytes = w / 8; /* number of bytes in width */ - register pel *leftP,*rightP; /* pointers to X values, left and right */ - int xmin = area->xmin; /* upper left X */ - int ymin = area->ymin; /* upper left Y */ - - for (edge = area->anchor; VALIDEDGE(edge); edge = edge->link->link) { - - p = dest + (edge->ymin - ymin) * wbytes; - leftP = edge->xvalues; - rightP = edge->link->xvalues; - - for (y = edge->ymin; y < edge->ymax; y++) { - fillrun(p, *leftP++ - xmin, *rightP++ - xmin, bit); - p += wbytes; - } - } -/* -Now, as an afterthought, we'll go reorganize if odd byte order requires -it: -*/ - if (byte == LSBFirst && wordsize != 8) { - register int i; - - switch (wordsize) { - case 16: - { - register unsigned short data,*p; - - p = (unsigned short *) dest; - - for (i = h * w /16; --i >= 0;) { - data = *p; - *p++ = (data << 8) + (data >> 8); - } - break; - } - case 64: - case 32: - { - register unsigned long data,*p; - - p = (unsigned long *) dest; - - for (i = h * w / 32; --i >= 0;) { - data = *p; - *p++ = (data << 24) + (data >> 24) - + (0xFF00 & (data >> 8)) - + (0xFF0000 & (data << 8)); - } - if (wordsize == 64) { - - p = (unsigned long *) dest; - - for (i = h * w / 64; --i >= 0;) { - data = *p++; - p[-1] = p[0]; - *p++ = data; - } - } - break; - } - default: - Abort("xiFill: unknown format"); - } - } - -} - -#define ALLONES 0xFF - -static void -fillrun(char *p, /* address of this scan line */ - pel x0, pel x1, /* left and right X */ - int bit) /* format: LSBFirst or MSBFirst */ -{ - register int startmask,endmask; /* bits to set in first and last char*/ - register int middle; /* number of chars between start and end + 1 */ - - if (x1 <= x0) - return; - middle = x1/8 - x0/8; - p += x0/8; - x0 &= 7; x1 &= 7; - if (bit == LSBFirst) { - startmask = ALLONES << x0; - endmask = ~(ALLONES << x1); - } - else { - startmask = ALLONES >> x0; - endmask = ~(ALLONES >> x1); - } - if (middle == 0) - *p++ |= startmask & endmask; - else { - *p++ |= startmask; - while (--middle > 0) - *p++ = (char)ALLONES; - *p |= endmask; - } -} - -#define CAPABILITIES (CAP_MATRIX | CAP_CHARSUBSETTING) - -#if XFONT_CID -FontRendererRec CIDRendererInfo[] = { - { ".cid", 4, NULL, CIDOpenScalable, - NULL, CIDGetInfoScalable, 0, CAPABILITIES } -}; -#endif - -#if XFONT_CID -FontRendererRec Type1RendererInfo[] = { -#else -static FontRendererRec renderers[] = { -#endif - { ".pfa", 4, NULL, Type1OpenScalable, - NULL, Type1GetInfoScalable, 0, CAPABILITIES }, - { ".pfb", 4, NULL, Type1OpenScalable, - NULL, Type1GetInfoScalable, 0, CAPABILITIES } -}; - -#if XFONT_CID -void -CIDRegisterFontFileFunctions(void) -{ - int i; - - Type1InitStdProps(); - for (i=0; i < sizeof(CIDRendererInfo) / sizeof(FontRendererRec); i++) - FontFileRegisterRenderer(&CIDRendererInfo[i]); -} -#endif - -void -Type1RegisterFontFileFunctions(void) -{ - int i; - -#if XFONT_CID - Type1InitStdProps(); - for (i=0; i < sizeof(Type1RendererInfo) / sizeof(FontRendererRec); i++) - FontFilePriorityRegisterRenderer(&Type1RendererInfo[i], -10); -#else - T1InitStdProps(); - for (i=0; i < sizeof(renderers) / sizeof(FontRendererRec); i++) - FontFilePriorityRegisterRenderer(&renderers[i], -10); -#endif -} - -int -Type1ReturnCodeToXReturnCode(int rc) -{ - switch(rc) { - case SCAN_OK: - return Successful; - case SCAN_FILE_EOF: - /* fall through to BadFontFormat */ - case SCAN_ERROR: - return BadFontFormat; - case SCAN_OUT_OF_MEMORY: - return AllocError; - case SCAN_FILE_OPEN_ERROR: - return BadFontName; - case SCAN_TRUE: - case SCAN_FALSE: - case SCAN_END: - /* fall through */ - default: - /* this should not happen */ -#if XFONT_CID - ErrorF("Font return code cannot be converted to X return code: %d\n", rc); -#else - ErrorF("Type1 return code not convertable to X return code: %d\n", rc); -#endif - return rc; - } -} - -#if XFONT_CID -CharInfoPtr -CIDRenderGlyph(FontPtr pFont, psobj *charstringP, psobj *subarrayP, - struct blues_struct *bluesP, CharInfoPtr pci, int *mode) -{ - int bit, - byte, - glyph, - scan, - image; - int pad,wordsize; /* scan & image in bits */ - long *pool; /* memory pool for ximager objects */ - int size; /* for memory size calculations */ - struct XYspace *S; /* coordinate space for character */ - struct region *area; - CharInfoRec *glyphs; - int len, rc; - long x0; - double x1, y1, t1 = .001, t2 = 0.0, t3 = 0.0, t4 = .001; - double sxmult; - long h,w; - long paddedW; - cidglyphs *cid; - fsBitmapFormat format = 0; - fsBitmapFormatMask fmask = 0; - - cid = (cidglyphs *)pFont->fontPrivate; - - /* set up default values */ - FontDefaultFormat(&bit, &byte, &glyph, &scan); - /* get any changes made from above */ - rc = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image); - if (rc != Successful) { - *mode = rc; - return(NULL); - } - - pad = glyph * 8; - wordsize = scan * 8; - -#define PAD(bits, pad) (((bits)+(pad)-1)&-(pad)) - - /* heuristic for "maximum" size of pool we'll need: */ - size = 200000 + 600 * - (int)hypot(cid->pixel_matrix[2], cid->pixel_matrix[3]) - * sizeof(short); - if (size < 0 || NULL == (pool = (long *) xalloc(size))) { - *mode = AllocError; - return(NULL); - } - - addmemory(pool, size); - - if (pci && (long)pci->bits == CID_BITMAP_UNDEFINED) - glyphs = pci; - else { - if (!(glyphs = (CharInfoRec *)xalloc(sizeof(CharInfoRec)))) { - delmemory(); - xfree(pool); - *mode = AllocError; - return(NULL); - } - bzero(glyphs, sizeof(CharInfoRec)); - } - - S = (struct XYspace *) t1_Transform((struct xobject *)IDENTITY, - t1, t2, t3, t4); - - S = (struct XYspace *) Permanent(t1_Transform((struct xobject *)S, - cid->pixel_matrix[0], - -cid->pixel_matrix[1], - cid->pixel_matrix[2], - -cid->pixel_matrix[3])); - - /* multiplier for computation of raw values */ - sxmult = hypot(cid->pixel_matrix[0], cid->pixel_matrix[1]); - if (sxmult > EPS) sxmult = 1000.0 / sxmult; - - rc = 0; - area = (struct region *)CIDfontfcnC(S, charstringP, subarrayP, bluesP, - &len, &rc); - if (rc < 0 || area == NULL) { - delmemory(); - xfree(pool); - if (pci != glyphs) xfree(glyphs); - *mode = Type1ReturnCodeToXReturnCode(rc); - return(NULL); - } - - h = area->ymax - area->ymin; - w = area->xmax - area->xmin; - paddedW = PAD(w, pad); - - if (h > 0 && w > 0) { - size = h * paddedW / 8; - glyphs[0].bits = (char *)xalloc(size); - if (glyphs[0].bits == NULL) { - Destroy(area); - delmemory(); - xfree(pool); - if (pci != glyphs) xfree(glyphs); - *mode = AllocError; - return(NULL); - } - bzero(glyphs[0].bits, size); - } - else { - size = 0; - h = w = 0; - area->xmin = area->xmax = 0; - area->ymax = area->ymax = 0; - glyphs[0].bits = NULL; - } - - glyphs[0].metrics.leftSideBearing = area->xmin; - x1 = (double)(x0 = area->ending.x - area->origin.x); - y1 = (double)(area->ending.y - area->origin.y); - glyphs[0].metrics.characterWidth = - (x0 + (x0 > 0 ? FPHALF : -FPHALF)) / (1 << FRACTBITS); - if (!glyphs[0].metrics.characterWidth && size == 0) - { - /* Zero size and zero extents: presumably caused by - the choice of transformation. Let's create a - small bitmap so we're not mistaken for an undefined - character. */ - h = w = 1; - size = paddedW = PAD(w, pad); - glyphs[0].bits = (char *)xalloc(size); - if (glyphs[0].bits == NULL) { - Destroy(area); - delmemory(); - xfree(pool); - if (pci != glyphs) xfree(glyphs); - *mode = AllocError; - return(NULL); - } - bzero(glyphs[0].bits, size); - } - glyphs[0].metrics.attributes = - NEARESTPEL((long)(hypot(x1, y1) * sxmult)); - glyphs[0].metrics.rightSideBearing = w + area->xmin; - glyphs[0].metrics.descent = area->ymax - NEARESTPEL(area->origin.y); - glyphs[0].metrics.ascent = h - glyphs[0].metrics.descent; - - if (h > 0 && w > 0) - fill(glyphs[0].bits, h, paddedW, area, byte, bit, wordsize); - Destroy(area); - delmemory(); - xfree(pool); - *mode = Successful; - return(glyphs); -} -#endif |