亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? glyf.c

?? ttfdump源代碼
?? C
字號:
/* glyf.c -- Load and print Glyf outline data * Copyright (C) 1996 Li-Da Lho, All right reserved */#include <stdio.h>#include <stdlib.h>#include <string.h>#include "config.h"#include "ttf.h"#include "ttfutil.h"#ifdef MEMCHECK#include <dmalloc.h>#endif/* 	$Id: glyf.c,v 1.1.1.1 1998/06/05 07:47:52 robert Exp $	 */#ifndef lintstatic char vcid[] = "$Id: glyf.c,v 1.1.1.1 1998/06/05 07:47:52 robert Exp $";#endif /* lint */static void ttfLoadSimpleGlyph(FILE *fp,GLYFPtr glyf,ULONG offset);static void ttfPrintSimpleGlyph(FILE *fp,GLYFPtr glyf);static void ttfLoadCompositeGlyph(FILE *fp,GLYFPtr glyf,ULONG offset);static void ttfPrintCompositeGlyph(FILE*fp,GLYFPtr glyf);static void ttfFreeCompositeGlyph(GLYFPtr glyf);double fix2dbl(F2Dot14 fixed);/* Naming convention about GLYF and Glyph: * High level functions which are exported should have their name * contain GLYF, on the other hand, low level function (or structures) * which is not intended to be exported should have their name  * contain Glyph */void ttfInitGLYF(TTFontPtr font){    ULONG tag  = 'g' | 'l' << 8 | 'y' << 16 | 'f' << 24;    TableDirPtr ptd;    if ((ptd = ttfLookUpTableDir(tag, font)) != NULL)	{	    font->glyphOffset = ptd->offset;	}}/* offset: where the specified glyph really starts  * callers should compute this themself form the loca tables */void ttfLoadGLYF(FILE *fp, GLYFPtr glyf, ULONG offset){    if (fseek(fp, offset, SEEK_SET) != 0)	ttfError("Fseek Failed in ttfLoadGLYF\n");    glyf->numberOfContours = ttfGetSHORT(fp);    glyf->xMin = ttfGetFWord(fp);    glyf->yMin = ttfGetFWord(fp);    glyf->xMax = ttfGetFWord(fp);    glyf->yMax = ttfGetFWord(fp);    offset += sizeof(USHORT) + 4*sizeof(FWord);    if (glyf->numberOfContours >= 0)	ttfLoadSimpleGlyph(fp, glyf, offset);    else 	ttfLoadCompositeGlyph(fp, glyf, offset); }void ttfPrintGLYF(FILE *fp, GLYFPtr glyf){    fprintf(fp,"\t numberOfContours:\t %d  %s\n", glyf->numberOfContours,	    glyf->numberOfContours == -1 ? "(Composite)": "");    fprintf(fp,"\t xMin:\t\t\t %d\n", glyf->xMin);    fprintf(fp,"\t yMin:\t\t\t %d\n", glyf->yMin);    fprintf(fp,"\t xMax:\t\t\t %d\n", glyf->xMax);    fprintf(fp,"\t yMax:\t\t\t %d\n\n", glyf->yMax);        if (glyf->numberOfContours >= 0)	ttfPrintSimpleGlyph(fp, glyf);    else	ttfPrintCompositeGlyph(fp, glyf);}void ttfFreeGLYF(GLYFPtr glyf){    if (glyf->numberOfContours < 0)	ttfFreeCompositeGlyph(glyf);}static void ttfLoadSimpleGlyph(FILE *fp, GLYFPtr glyf, ULONG offset){    SHORT nCnts = glyf->numberOfContours;    USHORT i,nIns,nPts;    if (fseek(fp, offset, SEEK_SET) != 0)	ttfError("Fseek Failed in ttfLoadSimpleGlyph\n");         if (fread(glyf->endPtsOfContours, sizeof(USHORT), nCnts, fp) != nCnts)	ttfError("Error when getting endPtsOfContours\n");#ifndef WORDS_BIGENDIAN    TwoByteSwap((unsigned char *) glyf->endPtsOfContours,		nCnts*sizeof(USHORT));#endif    if (nCnts != 0)	nPts = (glyf->endPtsOfContours)[nCnts-1]+1;    else	/* there seems to be something wrong with my interpretation of 	 * NOGLYPH chars, doing this way in case there is a char that has 	 * zero contour */	nPts = 0;    /* how to deal with zero instruction glyf properly ?? */    glyf->instructionLength = nIns = ttfGetUSHORT(fp);    if (nIns != 0)	{	    if (fread(glyf->instructions, sizeof(BYTE), nIns, fp) != nIns)		ttfError("Error when getting instructions\n");	}    for (i=0;i<nPts;i++)	{	    BYTE j,c;	    if (((glyf->flags)[i] = c =  ttfGetBYTE(fp)) & FLAGS_REPEAT)		{ /* if this flag should be repeated */		    j = ttfGetBYTE(fp); /* j times */		    while (j--) 			{			    i++;			    (glyf->flags)[i] = c;			    			}		}	}    for (i=0;i<nPts;i++)	{	    BYTE flag;	    flag = (glyf->flags)[i];	    	    if (flag & FLAGS_X_SHORT_VECTOR)		{ /* if the coordinate is a BYTE */		    if (flag & FLAGS_X_SAME)			(glyf->xCoordinates)[i] = (SHORT) ttfGetBYTE(fp);		    else			(glyf->xCoordinates)[i] = (SHORT) -ttfGetBYTE(fp);		}	    else		{ /* the coordiante is a SHORT */		    if (flag & FLAGS_X_SAME)			(glyf->xCoordinates)[i] = 0;		    else			(glyf->xCoordinates)[i] = ttfGetSHORT(fp);		}	}    for (i=0;i<nPts;i++)	{	    BYTE flag;	    flag = (glyf->flags)[i];	    	    if (flag & FLAGS_Y_SHORT_VECTOR)		{ /* if the coordinate is a BYTE */		    if (flag & FLAGS_Y_SAME)			(glyf->yCoordinates)[i] = (SHORT) ttfGetBYTE(fp);		    else			(glyf->yCoordinates)[i] = (SHORT) -ttfGetBYTE(fp);		}	    else		{ /* the coordiante is a SHORT */		    if (flag & FLAGS_Y_SAME)			(glyf->yCoordinates)[i] = 0;		    else			(glyf->yCoordinates)[i] = ttfGetSHORT(fp);		}	}}static void ttfPrintSimpleGlyph(FILE *fp, GLYFPtr glyf){    USHORT i, nPts, nCnts;    SHORT x=0, y=0;    nPts = (glyf->endPtsOfContours)[glyf->numberOfContours-1]+1;    nCnts = glyf->numberOfContours;    fprintf(fp,"\t EndPoints\n");    fprintf(fp,"\t ---------\n");    for (i=0;i<nCnts;i++)	fprintf(fp,"\t  %d: %2d\n",i,(glyf->endPtsOfContours)[i]);    fprintf(fp,"\n");    fprintf(fp,"\t Length of Instructions: %2d\n\n",glyf->instructionLength);    ttfPrintInstructions(fp,glyf->instructions);        fprintf(fp,"\t Flags\n");    fprintf(fp,"\t -----\n");    for (i=0;i<nPts;i++)	{	    BYTE flag;	    char buf[80];	    flag =  (glyf->flags)[i];	    	    if (flag & FLAGS_Y_SAME)		sprintf(buf,"YDual  ");	    else		sprintf(buf,"       ");	    if (flag & FLAGS_X_SAME)		strcat(buf,"XDual   ");	    else		strcat(buf,"        ");	    if (flag & FLAGS_REPEAT)		strcat(buf,"Repeat  ");	    else 		strcat(buf,"        ");	    if (flag & FLAGS_Y_SHORT_VECTOR)		strcat(buf,"Y-Short ");	    else		strcat(buf,"        ");	    if (flag & FLAGS_X_SHORT_VECTOR)		strcat(buf,"X-Short ");	    else		strcat(buf,"        ");	    if (flag & FLAGS_ON_CURVE)		strcat(buf,"On \n");	    else		strcat(buf,"Off\n");	    		    	    fprintf(fp,"\t %2d: %s",i,buf);	}    fprintf(fp,"\n");    fprintf(fp,"\t Coordinates\n");    fprintf(fp,"\t -----------\n");    for (i=0;i<nPts;i++)	{	    x += (glyf->xCoordinates)[i];	    y += (glyf->yCoordinates)[i];	    fprintf(fp,"\t %2d Rel ( %6d, %6d) -> Abs ( %6d, %6d)\n", i,		    (glyf->xCoordinates)[i], (glyf->yCoordinates)[i], x, y);	}    fprintf(fp,"\n");}static void ttfLoadCompositeGlyph(FILE *fp, GLYFPtr glyf, ULONG offset){    USHORT nIns,flags;       Component *cur;    if (fseek(fp, offset, SEEK_SET) != 0)	ttfError("Fseek Failed in ttfLoadCompositeGlyph\n");         if((glyf->comp = cur = (Component *) calloc(1, sizeof(Component))) == NULL)	ttfError("Out Of Memory\n");    cur->previous = NULL; /* beginning of a linked list */    do {   	cur->flags = flags = ttfGetUSHORT(fp);	cur->glyphIndex = ttfGetUSHORT(fp);	if (flags & ARG_1_AND_2_ARE_WORDS)	    {		(cur->data).args[0] = ttfGetSHORT(fp);		(cur->data).args[1] = ttfGetSHORT(fp);	    }	else	    (cur->data).args[0] = ttfGetUSHORT(fp);	if (flags & WE_HAVE_A_SCALE)	    {		(cur->data).transform.scale = ttfGetF2Dot14(fp);	    }	else if (flags & WE_HAVE_AN_X_AND_Y_SCALE)	    {		(cur->data).transform.vector.xscale = ttfGetF2Dot14(fp);		(cur->data).transform.vector.yscale = ttfGetF2Dot14(fp);	    }	else if (flags & WE_HAVE_A_TWO_BY_TWO)	    {		(cur->data).transform.tensor.xscale  = ttfGetF2Dot14(fp);	        (cur->data).transform.tensor.scale01 = ttfGetF2Dot14(fp);		(cur->data).transform.tensor.scale10 = ttfGetF2Dot14(fp);		(cur->data).transform.tensor.yscale  = ttfGetF2Dot14(fp);	    }	    	/* allocate next component */	if ((cur->next = (Component *) calloc(1, sizeof(Component))) == NULL)	    ttfError("Out Of Memory\n");	cur->next->previous = cur;	cur = cur->next; /* move to next component */    } while (flags & MORE_COMPONENT);    cur->next = NULL;  /* end of the linked list */    if (flags & WE_HAVE_INSTRUCTIONS)	{	    glyf->instructionLength = nIns = ttfGetUSHORT(fp);	    if (fread(glyf->instructions, sizeof(BYTE), nIns, fp) != nIns)		ttfError("Error when loading instructions\n");	}    else	{	    glyf->instructionLength = 0;	}}static void ttfPrintCompositeGlyph(FILE *fp, GLYFPtr glyf){    int i = 0;    char buf[80];    USHORT flags;    Component *cur;    cur = glyf->comp;        do {	flags = cur->flags;	fprintf(fp, "\t %d: Flags:\t 0x%x\n", i, flags);	fprintf(fp, "\t    Glyf Index:\t %d\n", cur->glyphIndex);	if (flags & ARGS_ARE_XY_VALUES)	    {		if (flags & ARG_1_AND_2_ARE_WORDS)		    {			fprintf(fp, "\t    X WOffset:\t %d\n", (cur->data).args[0]);			fprintf(fp, "\t    Y WOffset:\t %d\n", (cur->data).args[1]);		    }		else		    {			fprintf(fp, "\t    X BOffset:\t %d\n", 				(signed char) ((cur->data).args[0] >> 8 & 0xff));			fprintf(fp, "\t    Y BOffset:\t %d\n",				(signed char) ((cur->data).args[0] & 0xff));		    }	    }	else	    {		/* what the hell are the "patch points" ?? */ 	    }	if (flags & WE_HAVE_A_SCALE)	    {		fprintf(fp, "\t    X,Y Scale:\t %f\n",			fix2dbl((cur->data).transform.scale));	    }	else if (flags & WE_HAVE_AN_X_AND_Y_SCALE)	    {		fprintf(fp, "\t    X Scale:\t %f\n", 			fix2dbl((cur->data).transform.vector.xscale)); 		fprintf(fp, "\t    Y Scale:\t %f\n", 			fix2dbl((cur->data).transform.vector.yscale)); 	    }	else if (flags & WE_HAVE_A_TWO_BY_TWO)	    {		fprintf(fp, "\t    X Scale:\t %f\n", 			fix2dbl((cur->data).transform.tensor.xscale)); 		fprintf(fp, "\t    X,Y Scale:\t %f\n", 			fix2dbl((cur->data).transform.tensor.scale01)); 		fprintf(fp, "\t    Y,X Scale:\t %f\n", 			fix2dbl((cur->data).transform.tensor.scale10)); 		fprintf(fp, "\t    Y Scale:\t %f\n", 			fix2dbl((cur->data).transform.tensor.yscale)); 	    }	    	if (flags & ROUND_XY_TO_GRID)	    sprintf(buf, "Round X,Y to Grid   ");	else	    sprintf(buf, "                    ");	if (flags & NO_OVERLAP)	    strcat(buf, "NO Overlap   ");	else	    strcat(buf, "             ");	if (flags & USE_MY_METRICS)	    strcat(buf, "Use My Metrics   ");	else	    strcat(buf, "                 ");	fprintf(fp, "\t    Others:\t %s\n\n", buf);	i++;	cur = cur->next;    } while (cur->next != NULL);        fprintf(fp, "\n");    if (flags & WE_HAVE_INSTRUCTIONS)	{	    fprintf(fp,"\t Length of Instructions: %2d\n\n",		    glyf->instructionLength);	    ttfPrintInstructions(fp, glyf->instructions);	}}static void ttfFreeCompositeGlyph(GLYFPtr glyf){    Component *cur,*next;        cur = glyf->comp;    do {	next = cur->next;	free(cur);	cur = next;    } while (cur != NULL);}/* what I want: * outter procedures should not have any ideas about where the glyph starts, * * it just provide the TTFont structure and the character code or the index * of that glyph. Procedures below should do: * 1. look up where the glyph data is. * 2. provided some glyph cache mechanism for the reason that  *    a. it is not necessary to load all glyph into memory, especially for  *    eastern languages. *    b. if a glyph data has been loaded previously, it is not necessary to  *    load it again. *    c. malloc and free are SLOW !! *//* Load a glyph by glyph index */GLYFPtr ttfLoadGlyphIndex(TTFont *font, USHORT idx){    ULONG pos;    GLYFPtr glyf;        /* compute the actual place where the glyph stored */    pos = font->glyphOffset + ttfLookUpGlyfLOCA(font->loca, idx);    glyf = ttfLoadGlyphCached(font, pos);    return glyf;}/* Load a glyph by character code in the current encoding scheme */GLYFPtr ttfLoadGlyphCode(TTFont *font,USHORT cc){    USHORT index;        index = ttfLookUpCMAP(font->encoding,cc);    return ttfLoadGlyphIndex(font,index);}double fix2dbl(F2Dot14 fixed){    double mantissa, fraction;    mantissa = (double) (fixed >> 14);    fraction = (double) (double)(fixed & 0x3fff) / 16384.0;    return mantissa+fraction;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美一区二区三区在线看蜜臀| 一区二区三区不卡视频| 亚洲欧美另类在线| 紧缚奴在线一区二区三区| 91麻豆福利精品推荐| 久久综合狠狠综合久久激情 | 欧美日韩另类一区| 亚洲国产成人私人影院tom| 老司机午夜精品| 欧美三级在线播放| 亚洲女女做受ⅹxx高潮| 粉嫩aⅴ一区二区三区四区五区| 欧美一级片在线观看| 亚洲永久精品国产| 91麻豆自制传媒国产之光| 国产无人区一区二区三区| 久久99精品久久久久久国产越南| 欧美亚洲国产一区二区三区| 亚洲人成精品久久久久久 | 亚洲婷婷国产精品电影人久久| 另类小说图片综合网| 91精品国产欧美一区二区成人| 亚洲黄色av一区| 91在线免费看| 亚洲乱码中文字幕| 91蝌蚪国产九色| 中文字幕一区二区三区四区不卡| 成人永久免费视频| 国产精品久久久久aaaa| 99久久精品免费观看| 亚洲美女视频一区| 欧美日韩情趣电影| 视频一区视频二区中文| 日韩视频永久免费| 国产麻豆日韩欧美久久| 国产三级精品三级在线专区| 欧美最猛黑人xxxxx猛交| 亚洲人精品一区| 欧美无人高清视频在线观看| 午夜精品影院在线观看| 精品欧美乱码久久久久久| 国内精品伊人久久久久av影院 | 26uuu久久综合| 国产成人免费av在线| 中文字幕av一区二区三区高 | 亚洲午夜精品17c| 欧美精品色一区二区三区| 日本v片在线高清不卡在线观看| 日韩免费成人网| 国产成人在线看| 夜夜嗨av一区二区三区网页| 91精品在线一区二区| 国精产品一区一区三区mba桃花 | 亚洲国产日韩综合久久精品| 这里只有精品电影| 国产一区91精品张津瑜| 一区免费观看视频| 91精品中文字幕一区二区三区| 国产在线精品视频| 一区二区三区四区在线| 日韩欧美二区三区| eeuss鲁片一区二区三区在线看| 亚洲精品视频一区二区| 精品少妇一区二区三区免费观看| eeuss影院一区二区三区| 亚洲6080在线| 中文av一区二区| 欧美日韩国产综合视频在线观看| 国产综合色在线视频区| 中文字幕中文乱码欧美一区二区| 欧美老年两性高潮| 成人黄页在线观看| 日韩av不卡在线观看| 中日韩av电影| 欧美变态凌虐bdsm| 色乱码一区二区三区88| 国产综合久久久久影院| 亚洲专区一二三| 国产清纯白嫩初高生在线观看91 | 亚洲成av人片在线| 国产日韩三级在线| 日韩视频免费观看高清完整版 | 久久综合资源网| 欧美日韩国产小视频在线观看| 国产一区久久久| 秋霞电影网一区二区| 一区二区在线观看免费| 中文字幕欧美三区| 久久亚洲二区三区| 日韩免费看的电影| 91麻豆精品国产91久久久资源速度| 99久久精品国产一区二区三区| 国精品**一区二区三区在线蜜桃| 午夜伊人狠狠久久| 一区二区久久久久| 亚洲男同1069视频| 国产精品久久久久三级| 国产三区在线成人av| 久久美女艺术照精彩视频福利播放| 欧美精品一卡两卡| 欧美肥胖老妇做爰| 777久久久精品| 欧美精品v国产精品v日韩精品| 色久综合一二码| 91福利国产精品| 欧美性三三影院| 欧美三级三级三级| 欧美日韩视频在线观看一区二区三区| 91在线云播放| 色综合久久综合| 91色.com| 色999日韩国产欧美一区二区| 91一区二区三区在线观看| 成人动漫精品一区二区| av激情综合网| 91一区二区三区在线观看| 91久久线看在观草草青青| 在线视频综合导航| 欧美日本精品一区二区三区| 91精品国产色综合久久| 日韩欧美精品在线| 国产欧美一区二区精品性| 国产精品久久毛片a| 亚洲精品乱码久久久久久| 亚洲国产视频网站| 日本成人在线一区| 国产精品18久久久久| 成人ar影院免费观看视频| 色噜噜狠狠色综合中国 | 91免费观看国产| 91久久国产综合久久| 欧美日韩日日骚| 精品国产乱码久久久久久蜜臀| 日本一区二区免费在线观看视频| 中文字幕亚洲在| 亚洲国产精品一区二区尤物区| 日本人妖一区二区| 国产999精品久久久久久绿帽| 99re66热这里只有精品3直播 | 国产精品久久久久久久久晋中| 亚洲免费观看在线观看| 日韩成人av影视| 国产精品66部| 欧美日韩精品系列| 久久精品夜色噜噜亚洲aⅴ| 樱花草国产18久久久久| 久久99久久99| 色婷婷综合五月| 亚洲精品在线免费观看视频| 国产精品国产三级国产专播品爱网| 亚洲一区二区视频在线| 国产在线精品不卡| 欧美日韩免费一区二区三区| 久久久久久97三级| 日韩va欧美va亚洲va久久| 成人成人成人在线视频| 日韩亚洲欧美中文三级| 最新不卡av在线| 激情六月婷婷综合| 欧美色图天堂网| 亚洲欧洲日韩在线| 狠狠网亚洲精品| 欧美裸体一区二区三区| 亚洲欧美自拍偷拍色图| 精品一区二区免费| 欧美性大战久久| 欧美国产成人精品| 韩国成人福利片在线播放| 欧美精品一级二级| 亚洲一区欧美一区| 93久久精品日日躁夜夜躁欧美| 精品美女被调教视频大全网站| 亚洲一区二区精品久久av| 成人a免费在线看| 国产三级欧美三级日产三级99 | 欧美日韩精品一区二区三区 | 日韩毛片一二三区| 国产成人av一区二区三区在线| 欧美一区二区三区在| 亚洲午夜一二三区视频| 色综合色狠狠天天综合色| 国产无一区二区| 国产高清久久久久| 久久久一区二区三区| 男男视频亚洲欧美| 91精品国产乱| 日日骚欧美日韩| 欧美精品黑人性xxxx| 视频一区二区不卡| 91精品国产一区二区三区| 午夜私人影院久久久久| 欧美日韩精品三区| 日韩中文欧美在线| 91麻豆精品久久久久蜜臀| 午夜亚洲福利老司机| 欧美日韩日日夜夜| 秋霞午夜av一区二区三区| 日韩免费高清av| 国产精品99久久久久久久女警| 久久久精品一品道一区|