Sigrid Solveig Haflínudóttirbitmap fonts: error on uninmplemented bit depths19827002 years agoHistory
1265 lines · 28.5 KB · Text
RawDownload
/* this file is generated. do not modify. */#include "otfsys.h"#include "otf.h"#include "otfpriv.h" #define f2dot14(o) (f = b[2*o]<<8 | b[2*o+1], (f>>14)+(f&((1<<14)-1))/16384.0) int indentΔ = 2; #define rchr(s) (be ? ((s)[0]<<8 | (s)[1]) : ((s)[1]<<8 | (s)[0])) static u8int mark[] = {0x00, 0x00, 0xc0, 0xe0, 0xf0}; static intutf16to8(u8int *o, int osz, u8int *s, int sz){	u32int c, c2;	int i, wr, j, be; 	i = 0;	be = 1;	if(s[0] == 0xfe && s[1] == 0xff)		i += 2;	else if(s[0] == 0xff && s[1] == 0xfe){		be = 0;		i += 2;	} 	for(; i < sz-1 && osz > 1;){		c = rchr(&s[i]);		i += 2;		if(c >= 0xd800 && c <= 0xdbff && i < sz-1){			c2 = rchr(&s[i]);			if(c2 >= 0xdc00 && c2 <= 0xdfff){				c = 0x10000 | (c - 0xd800)<<10 | (c2 - 0xdc00);				i += 2;			}else				return -1;		}else if(c >= 0xdc00 && c <= 0xdfff)			return -1; 		if(c < 0x80)			wr = 1;		else if(c < 0x800)			wr = 2;		else if(c < 0x10000)			wr = 3;		else			wr = 4; 		osz -= wr;		if(osz < 1)			break; 		o += wr;		for(j = wr; j > 1; j--){			*(--o) = (c & 0xbf) | 0x80;			c >>= 6;		}		*(--o) = (u8int)c | mark[wr];		o += wr;	} 	*o = 0;	return i;} static char *strtoutf8(Otf *o, u8int *in, int sz){	char *s; 	// FIXME this is not sufficient, obviously - need more platform/encoding handling	if(o->platformID == 0 || (o->platformID == 3 && o->encodingID == 1)){		s = malloc(sz/2+1);		utf16to8((u8int*)s, sz/2+1, in, sz);	}else{		s = malloc(sz+1);		memcpy(s, in, sz);		s[sz] = 0;	}	return s;} Otf *otfopen(Otfile *f){	Otf *o; 	if((o = calloc(1, sizeof(*o))) == nil){		werrstr("no memory");	}else{		o->f = f;		if(read_TableDirectory(o, &o->td) != 0){			free(o);			o = nil;		}	}	return o;} voidotfprint(Otf *o, Otfile *out, int indent){	print_TableDirectory(out, indent, o, &o->td);} voidotfclose(Otf *o){	if(o == nil)		return;	// FIXME traverse and free everything	free(o);} static intotfpushrange(Otf *o, int off, int len){	Range *r;	int x; 	r = nil;	if(o->r != nil){		if(len < 0)			len = o->r->len - off;		if(len < 0 || off+len > o->r->len){			werrstr("range overflow (len %d) by %d bytes", len, off+len - o->r->len);			goto err;		}		off += o->r->start;	}else if(len < 0){		len = 0x7fffffff;	}	if((r = malloc(sizeof(*r))) == nil){		werrstr("no memory");		goto err;	}	r->par = o->r;	r->start = off;	r->len = len;	r->prevoff = o->off;	if((x = o->f->seek(o->f->aux, off, 0)) != off){		werrstr("seek offset: need %d, got %d", off, x);		goto err;	}	o->off = off;	o->r = r;	return 0;err:	free(r);	return -1;} static intotfpoprange(Otf *o){	Range *r;	int x; 	r = o->r;	if(r == nil){		werrstr("pop without push");		goto err;	}	if((x = o->f->seek(o->f->aux, r->prevoff, 0)) != r->prevoff){		werrstr("seek offset: need %d, got %d", r->prevoff, x);		goto err;	}	o->off = r->prevoff;	o->r = r->par;	free(r);	return 0;err:	return -1;} static voidotfpopranges(Otf *o){	while(o->r != nil)		otfpoprange(o);} static u8int *otfreadn(Otf *o, int n){	Range *r;	u8int *b;	int x; 	r = o->r;	if(r != nil && o->off+n > r->start+r->len){		werrstr("need %d at %d, have %d at %d", n, o->off, r->len, r->start);		goto err;	}	if(n > o->bufsz){		if((b = realloc(o->buf, n)) == nil){			werrstr("no memory");			goto err;		}		o->buf = b;		o->bufsz = n;	}	if((x = o->f->read(o->f->aux, o->buf, n)) != n){		werrstr("need %d, got %d; off %d", n, x, o->off);		goto err;	}	o->off += n; 	return o->buf;err:	return nil;} static intotfarray(Otf *o, void **arr_, void *fun_, int elsz, int num){	int i;	int (*fun)(Otf*, void*);	u8int *arr; 	if((arr = calloc(num, elsz)) == nil){		werrstr("no memory");		goto err;	}	fun = fun_;	for(i = 0; i < num; i++){		if(fun(o, arr + i*elsz) < 0)			goto err;	}	*arr_ = arr;	return 0;err:	free(arr);	return -1;} voidprint_BitmapGlyph(Otfile *f, int indent, Otf *o, BitmapGlyph *v){	void *a = f->aux;	int i; 	USED(o);	if(v->bitDepth > 0)		f->print(a, "%*s%s: %d\n", indent, "", "bitDepth", v->bitDepth);	f->print(a, "%*s%s: %d\n", indent, "", "format", v->format);	f->print(a, "%*s%s: %d\n", indent, "", "offset", v->offset);	if(v->size > 0){		f->print(a, "%*s%s: %d\n", indent, "", "pitchBits", v->pitchBits);		f->print(a, "%*s%s: %d\n", indent, "", "size", v->size);		f->print(a, "%*s%s: ", indent, "", "image");		for(i = 0; i < v->size; i++)			f->print(a, "%02"PRIx8, v->image[i]);		f->print(a, "\n");	}	f->print(a, "%*s%s: %d\n", indent, "", "ppemX", v->ppemX);	f->print(a, "%*s%s: %d\n", indent, "", "ppemY", v->ppemY);	if(v->numComponents > 0){		f->print(a, "%*s%s: %d\n", indent, "", "numComponents", v->numComponents);		f->print(a, "%*s%s:\n", indent, "", "components");		for(i = 0; i < v->numComponents; i++){			f->print(a, "%*s%d:\n", indent+indentΔ, "", i);			print_EbdtComponent(f, indent+indentΔ+indentΔ, o, v->components+i);		}	}} enum {	CGLYPH_FL_WORD_ARGS = 1<<0,	CGLYPH_FL_SCALE = 1<<3,	CGLYPH_FL_OVERLAP_COMPOUND = 1<<10,	CGLYPH_FL_UNSCALED_COMPONENT_OFFSET = 1<<12,}; static intread_ComponentGlyph(Otf *o, ComponentGlyph **out, int instr){	ComponentGlyph *v;	u8int *b;	s16int f; 	if((v = calloc(1, sizeof(*v))) == nil){nomem:		werrstr("no memory");		goto err;	} 	if((b = otfreadn(o, 2*2)) == nil)		goto err;	v->flags = (b[0]<<8 | b[1]) & ~CGLYPH_FL_OVERLAP_COMPOUND;	v->glyphIndex = b[2]<<8 | b[3];	instr |= v->flags & CGLYPH_FL_INSTRUCTIONS;	if(v->flags & CGLYPH_FL_UNSCALED_COMPONENT_OFFSET)		v->flags &= ~(CGLYPH_FL_UNSCALED_COMPONENT_OFFSET | CGLYPH_FL_SCALED_COMPONENT_OFFSET); 	if((v->flags & CGLYPH_FL_WORD_ARGS) != 0 && (b = otfreadn(o, 2*2)) != nil){		if(v->flags & CGLYPH_FL_SIGNED_XY){			v->arg1 = (s16int)(b[0]<<8 | b[1]);			v->arg2 = (s16int)(b[2]<<8 | b[3]);		}else{			v->arg1 = b[0]<<8 | b[1];			v->arg1 = b[2]<<8 | b[3];		}	}else if((b = otfreadn(o, 2)) != nil){		if(v->flags & CGLYPH_FL_SIGNED_XY){			v->arg1 = (s8int)b[0];			v->arg2 = (s8int)b[1];		}else{			v->arg1 = b[0];			v->arg2 = b[1];		}	}	if(b == nil)		goto err; 	v->scaleX = 1.0;	v->scaleY = 1.0;	if((v->flags & CGLYPH_FL_SCALE) != 0 && (b = otfreadn(o, 2)) != nil){		v->scaleX = f2dot14(0);		v->scaleY = v->scaleX;		v->flags &= ~CGLYPH_FL_SCALE;		v->flags |= CGLYPH_FL_SCALE_XY;	}else if((v->flags & CGLYPH_FL_SCALE_XY) != 0 && (b = otfreadn(o, 2*2)) != nil){		v->scaleX = f2dot14(0);		v->scaleY = f2dot14(1);	}else if((v->flags & CGLYPH_FL_2X2_TRANSFORM) != 0 && (b = otfreadn(o, 2*2*2)) != nil){		v->scaleX = f2dot14(0);		v->scale01 = f2dot14(1);		v->scale10 = f2dot14(2);		v->scaleY = f2dot14(3);	}	if(b == nil)		goto err;	if((v->flags & CGLYPH_FL_MORE_COMPONENTS) != 0){		if(read_ComponentGlyph(o, &v->next, instr) != 0){			free(v);			return -1;		}	}else if(instr != 0){		if((b = otfreadn(o, 2)) == nil)			goto err;		v->numInstr = b[0]<<8 | b[1];		if((v->instr = malloc(v->numInstr)) == nil)			goto nomem;		if(v->numInstr > 0 && (b = otfreadn(o, v->numInstr)) == nil)			goto err;		memcpy(v->instr, b, v->numInstr);	}	*out = v;	return 0;err:	if(v != nil)		free(v->instr);	free(v);	werrstr("ComponentGlyph: %r");	return -1;} voidprint_ComponentGlyph(Otfile *f, int indent, Otf *o, ComponentGlyph *v){	void *a = f->aux;	f->print(a, "%*s%s: %#"PRIx16"%s%s%s%s%s%s%s%s%s%s\n", indent, "", "flags", v->flags,		(v->flags&CGLYPH_FL_SIGNED_XY)?" CGLYPH_FL_SIGNED_XY":"",		(v->flags&CGLYPH_FL_ROUND_TO_GRID_XY)?" CGLYPH_FL_ROUND_TO_GRID_XY":"",		(v->flags&CGLYPH_FL_SCALE)?" CGLYPH_FL_SCALE":"",		(v->flags&CGLYPH_FL_MORE_COMPONENTS)?" CGLYPH_FL_MORE_COMPONENTS":"",		(v->flags&CGLYPH_FL_SCALE_XY)?" CGLYPH_FL_SCALE_XY":"",		(v->flags&CGLYPH_FL_2X2_TRANSFORM)?" CGLYPH_FL_2X2_TRANSFORM":"",		(v->flags&CGLYPH_FL_INSTRUCTIONS)?" CGLYPH_FL_INSTRUCTIONS":"",		(v->flags&CGLYPH_FL_METRICS)?" CGLYPH_FL_METRICS":"",		(v->flags&CGLYPH_FL_OVERLAP_COMPOUND)?" CGLYPH_FL_OVERLAP_COMPOUND":"",		(v->flags&CGLYPH_FL_SCALED_COMPONENT_OFFSET)?" CGLYPH_FL_SCALED_COMPONENT_OFFSET":""	);	f->print(a, "%*s%s: %"PRIu16"\n", indent, "", "glyphIndex", v->glyphIndex);	if(v->arg1 != 0 || v->arg2 != 0){		f->print(f->aux, "%*s%s: %d\n", indent, "", "arg1", v->arg1);		f->print(f->aux, "%*s%s: %d\n", indent, "", "arg2", v->arg2);	}	if(v->flags & CGLYPH_FL_SCALE_XY){		f->print(a, "%*s%s: %g\n", indent, "", "scaleX", v->scaleX);		f->print(a, "%*s%s: %g\n", indent, "", "scaleY", v->scaleY);	}else if(v->flags & CGLYPH_FL_2X2_TRANSFORM){		f->print(a, "%*s%s: %g\n", indent, "", "scaleX", v->scaleX);		f->print(a, "%*s%s: %g\n", indent, "", "scale01", v->scale01);		f->print(a, "%*s%s: %g\n", indent, "", "scale10", v->scale10);		f->print(a, "%*s%s: %g\n", indent, "", "scaleY", v->scaleY);	}	if(v->numInstr > 0 && v->instr != nil){		f->print(a, "%*s%s: %"PRIu16"\n", indent, "", "numInstr", v->numInstr);		f->print(a, "%*s%s:", indent, "", "instr");		for(int i = 0; i < v->numInstr; i++)			f->print(a, " %02"PRIx8, v->instr[i]);		f->print(a, "\n");	}	if(v->next != nil){		f->print(a, "%*s%s:\n", indent, "", "next");		print_ComponentGlyph(f, indent+indentΔ, o, v->next);	}} enum {	GLYPH_FL_ON_CURVE_POINT = 1<<0,	GLYPH_FL_X_SHORT_VECTOR = 1<<1,	GLYPH_FL_Y_SHORT_VECTOR = 1<<2,	GLYPH_FL_REPEAT = 1<<3,	GLYPH_FL_X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR = 1<<4,	GLYPH_FL_Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR = 1<<5,	GLYPH_FL_OVERLAP_SIMPLE = 1<<6,}; static intread_SimpleGlyph(Otf *o, SimpleGlyph **out){	SimpleGlyph *v;	u8int *b, *flags;	int i, n, nflags, c, nc; 	flags = nil;	if((v = calloc(1, sizeof(*v))) == nil){nomem:		werrstr("no memory");		goto err;	} 	v->numEndPtsOfContours = o->numberOfContours;	n = o->numberOfContours;	if((b = otfreadn(o, 2*n+2)) == nil)		goto err;	if((v->endPtsOfContours = malloc(2*n)) == nil)		goto nomem;	for(int i = 0; i < n; i++)		v->endPtsOfContours[i] = b[2*i+0]<<8 | b[2*i+1];	v->numPoints = 1 + v->endPtsOfContours[o->numberOfContours-1]; 	v->instructionLength = b[2*n+0]<<8 | b[2*n+1];	n = v->instructionLength;	if((b = otfreadn(o, n)) == nil)		goto err;	if((v->instructions = malloc(n)) == nil)		goto nomem;	memcpy(v->instructions, b, n); 	if((flags = malloc(v->numPoints)) == nil) /* not supposed to be more than that, 64Kb max */		goto nomem;	for(nflags = 0; nflags < v->numPoints;){		if((b = otfreadn(o, 1)) == nil)			goto err;		if((flags[nflags++] = *b) & GLYPH_FL_REPEAT){			flags[nflags-1] ^= GLYPH_FL_REPEAT;			if((b = otfreadn(o, 1)) == nil)				goto err;			if(nflags + *b > v->numPoints){				werrstr("repeat overflow (%d+%d > %d)", nflags, *b, v->numPoints);				goto err;			}			memset(flags+nflags, flags[nflags-1], *b);			nflags += *b;		}	} 	if((v->points = calloc(v->numPoints, sizeof(*v->points))) == nil)		goto nomem; 	/* flags first */	for(i = n = 0; i < nflags && n < v->numPoints; i++, n++)		v->points[n].onCurve = (flags[i] & GLYPH_FL_ON_CURVE_POINT) != 0; 	/* read packed x coordinates */	c = 0;	for(i = n = 0; i < nflags && n < v->numPoints; i++){		if((flags[i] & GLYPH_FL_X_SHORT_VECTOR) != 0){			if((b = otfreadn(o, 1)) == nil)				goto err;			nc = *b;			if((flags[i] & GLYPH_FL_X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) == 0)				nc = -nc;			c = v->points[n++].x = c + nc;		}else if((flags[i] & GLYPH_FL_X_IS_SAME_OR_POSITIVE_X_SHORT_VECTOR) != 0){			v->points[n++].x = c;		}else{			if((b = otfreadn(o, 2)) == nil)				goto err;			c += (s16int)(b[0]<<8 | b[1]);			v->points[n++].x = c;		}	} 	/* read packed y coordinates */	c = 0;	for(i = n = 0; i < nflags && n < v->numPoints; i++){		if((flags[i] & GLYPH_FL_Y_SHORT_VECTOR) != 0){			if((b = otfreadn(o, 1)) == nil)				goto err;			nc = *b;			if((flags[i] & GLYPH_FL_Y_IS_SAME_OR_POSITIVE_Y_SHORT_VECTOR) == 0)				nc = -nc;			c = v->points[n++].y = c + nc;

Lines 1–500 of 1265.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t