summaryrefslogtreecommitdiff
path: root/Build/source/texk/dvipng/dvipng-1.13/t1.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/texk/dvipng/dvipng-1.13/t1.c')
-rw-r--r--Build/source/texk/dvipng/dvipng-1.13/t1.c192
1 files changed, 192 insertions, 0 deletions
diff --git a/Build/source/texk/dvipng/dvipng-1.13/t1.c b/Build/source/texk/dvipng/dvipng-1.13/t1.c
new file mode 100644
index 00000000000..4a74a8274f4
--- /dev/null
+++ b/Build/source/texk/dvipng/dvipng-1.13/t1.c
@@ -0,0 +1,192 @@
+/* t1.c */
+
+/************************************************************************
+
+ Part of the dvipng distribution
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this program. If not, see
+ <http://www.gnu.org/licenses/>.
+
+ Copyright (C) 2002-2009 Jan-Åke Larsson
+
+************************************************************************/
+
+#include "dvipng.h"
+
+void LoadT1(int32_t c, struct char_entry * ptr)
+{
+ GLYPH *glyph;
+ int original_width,original_height;
+ int i,j,k,width,height;
+ unsigned short shrunk_width,shrunk_height;
+ short xoffset,yoffset;
+ unsigned short i_offset,j_offset;
+
+ DEBUG_PRINT(DEBUG_T1,("\n LOAD T1 CHAR\t%d",c));
+ if ((glyph=
+ T1_SetChar(currentfont->T1id, c,
+ (float)currentfont->dpi*currentfont->d/65536/72.27,
+ currentfont->psfontmap==NULL ? NULL : currentfont->psfontmap->t1_transformp))
+ ==NULL)
+ Fatal("cannot load T1 char %d",c);
+
+ DEBUG_PRINT(DEBUG_T1,(" (%d)",ptr->tfmw));
+
+ original_width = glyph->metrics.rightSideBearing
+ - glyph->metrics.leftSideBearing;
+ original_height = glyph->metrics.ascent - glyph->metrics.descent;
+ DEBUG_PRINT(DEBUG_T1,(" %dx%d",original_width,original_height));
+
+ if (original_width > 0x7fff || original_height > 0x7fff)
+ Fatal("character %d too large in file %s", c, currentfont->name);
+
+ /*
+ * Hotspot issues: Shrinking to the topleft corner rather than the
+ hotspot will displace glyphs a fraction of a pixel. We deal with
+ this in as follows: The glyph is shrunk to its hotspot by
+ offsetting the bitmap somewhat to put the hotspot in the lower
+ left corner of a "shrink square". Shrinking to the topleft corner
+ will then act as shrinking to the hotspot. This may enlarge the
+ bitmap somewhat, of course. (Also remember that the below
+ calculation of i/j_offset is in integer arithmetics.)
+
+ There will still be a displacement from rounding the dvi
+ position, but vertically it will be equal for all glyphs on a
+ line, so we displace a whole line vertically by fractions of a
+ pixel. This is acceptible, IMHO. Sometime there will be support
+ for subpixel positioning, horizontally. Will do for now, I
+ suppose.
+ */
+ xoffset = -glyph->metrics.leftSideBearing;
+ /* printf("xoffset: %d\n",xoffset); */
+ i_offset = ( shrinkfactor - xoffset % shrinkfactor ) % shrinkfactor;
+ width = original_width+i_offset;
+ ptr->xOffset = xoffset+i_offset;
+
+ yoffset = glyph->metrics.ascent-1;
+ /* printf("yoffset: %d\n",yoffset); */
+ j_offset = ( shrinkfactor - (yoffset-(shrinkfactor-1)) % shrinkfactor )
+ % shrinkfactor;
+ height = original_height+j_offset;
+ ptr->yOffset = yoffset+j_offset;
+
+ DEBUG_PRINT(DEBUG_T1,(" (%dx%d)",width,height));
+ /*
+ Extra marginal so that we do not crop the image when shrinking.
+ */
+ shrunk_width = (width + shrinkfactor - 1) / shrinkfactor;
+ shrunk_height = (height + shrinkfactor - 1) / shrinkfactor;
+ ptr->w = shrunk_width;
+ ptr->h = shrunk_height;
+
+ /* printf("(%d,%d) ",ptr->w,ptr->h); */
+ DEBUG_PRINT(DEBUG_GLYPH,("\nDRAW GLYPH %d\n", (int)c));
+
+ /*
+ Shrink raster while doing antialiasing.
+ */
+ if ((ptr->data = calloc(shrunk_width*shrunk_height,sizeof(char))) == NULL)
+ Fatal("unable to malloc image space for char %c", (char)c);
+ for (j = 0; j < original_height; j++) {
+ for (i = 0; i < (original_width+7)/8 ; i++) {
+ for (k = 0; k < 8 ; k++) {
+ DEBUG_PRINT(DEBUG_GLYPH,
+ ("%c",
+ (glyph->bits[i+j*((original_width+7)/8)] & (1<<k)) ?
+ 'x' : ' '));
+ ptr->data[(i*8+k+i_offset)/shrinkfactor
+ +(j+j_offset)/shrinkfactor*shrunk_width] +=
+ (glyph->bits[i+j*((original_width+7)/8)] & (1<<k) ? 1 : 0);
+ }
+ }
+ DEBUG_PRINT(DEBUG_GLYPH,("|\n"));
+ }
+ for (j = 0; j < shrunk_height; j++) {
+ for (i = 0; i < shrunk_width; i++) {
+ ptr->data[i+j*shrunk_width] = ptr->data[i+j*shrunk_width]
+ *255/shrinkfactor/shrinkfactor;
+ DEBUG_PRINT(DEBUG_GLYPH,("%3u ",ptr->data[i+j*shrunk_width]));
+ }
+ DEBUG_PRINT(DEBUG_GLYPH,("|\n"));
+ }
+}
+
+bool InitT1(struct font_entry * tfontp)
+{
+ if (libt1==NULL) {
+ if ((libt1=T1_InitLib( NO_LOGFILE | IGNORE_CONFIGFILE
+ | IGNORE_FONTDATABASE | T1_NO_AFM)) == NULL) {
+ Warning("an error occured during t1lib initialisation, disabling it");
+ option_flags &= ~USE_LIBT1;
+ return(false);
+ }
+# ifdef DEBUG
+ else
+ DEBUG_PRINT(DEBUG_T1,("\n T1LIB VERSION: %s", T1_GetLibIdent()));
+# endif
+ }
+
+ DEBUG_PRINT((DEBUG_DVI|DEBUG_T1),("\n OPEN T1 FONT:\t'%s'", tfontp->name));
+ tfontp->T1id = T1_AddFont( tfontp->name );
+ if (tfontp->T1id < 0) {
+ Warning("t1lib could not open font file %s", tfontp->name);
+ return(false);
+ }
+ if (T1_LoadFont(tfontp->T1id)) {
+ Warning("t1lib could not load font file %s", tfontp->name);
+ return(false);
+ }
+ Message(BE_VERBOSE,"<%s>", tfontp->name);
+ if (tfontp->psfontmap!=NULL && tfontp->psfontmap->encoding != NULL) {
+ DEBUG_PRINT(DEBUG_T1,("\n USE ENCODING:\t'%s'", tfontp->psfontmap->encoding->name));
+ if (T1_ReencodeFont(tfontp->T1id,tfontp->psfontmap->encoding->charname)) {
+ Warning("unable to use font encoding '%s' for %s",
+ tfontp->psfontmap->encoding->name,tfontp->name);
+ return(false);
+ }
+ }
+ tfontp->type = FONT_TYPE_T1;
+ return(true);
+}
+
+
+static void UnLoadT1(struct char_entry *ptr)
+{
+ if (ptr->data!=NULL)
+ free(ptr->data);
+ ptr->data=NULL;
+}
+
+
+void DoneT1(struct font_entry *tfontp)
+{
+ int c=0;
+
+ int error = T1_DeleteFont( tfontp->T1id );
+ if (error)
+ Warning("font file %s could not be closed", tfontp->name);
+ while(c<NFNTCHARS) {
+ if (tfontp->chr[c]!=NULL) {
+ UnLoadT1((struct char_entry*)tfontp->chr[c]);
+ free(tfontp->chr[c]);
+ tfontp->chr[c]=NULL;
+ }
+ c++;
+ }
+ if (tfontp->name!=NULL)
+ free(tfontp->name);
+ tfontp->name=NULL;
+}
+
+