⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdf_function.c.svn-base

📁 SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多KB)
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
					SAFE_PUSHINT(st, abs(i1));				}				else {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, fabs(r1));				}				break;			case PSOADD:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, i1 + i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, r1 + r2);				}				break;			case PSOAND:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, i1 & i2);				}				else {					SAFE_POPBOOL(st, &b2);					SAFE_POPBOOL(st, &b1);					SAFE_PUSHBOOL(st, b1 && b2);				}				break;			case PSOATAN:				SAFE_POPNUM(st, &r2);				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, atan2(r1, r2)*RADIAN);				break;			case PSOBITSHIFT:				SAFE_POPINT(st, &i2);				SAFE_POPINT(st, &i1);				if (i2 > 0) {					SAFE_PUSHINT(st, i1 << i2);				}				else if (i2 < 0) {					SAFE_PUSHINT(st, (int)((unsigned int)i1 >> i2));				}				else {					SAFE_PUSHINT(st, i1);				}				break;			case PSOCEILING:				if (!pstopisint(st)) {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, ceil(r1));				}				break;			case PSOCOPY:				SAFE_POPINT(st, &i1);				SAFE_COPY(st, i1);				break;			case PSOCOS:				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, cos(r1/RADIAN));				break;			case PSOCVI:				if (!pstopisint(st)) {					SAFE_POPNUM(st, &r1);					SAFE_PUSHINT(st, (int)r1);				}				break;			case PSOCVR:				if (!pstopisreal(st)) {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, r1);				}				break;			case PSODIV:				SAFE_POPNUM(st, &r2);				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, r1 / r2);				break;			case PSODUP:				SAFE_COPY(st, 1);				break;			case PSOEQ:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHBOOL(st, i1 == i2);				}				else if (pstoptwoarenums(st)) {					SAFE_POPNUM(st, &r1);					SAFE_POPNUM(st, &r1);					SAFE_PUSHBOOL(st, r1 == r2);				}				else {					SAFE_POPBOOL(st, &b2);					SAFE_POPBOOL(st, &b2);					SAFE_PUSHBOOL(st, b1 == b2);				}				break;			case PSOEXCH:				psroll(st, 2, 1);				break;			case PSOEXP:				SAFE_POPNUM(st, &r2);				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, pow(r1, r2));				break;			case PSOFALSE:				SAFE_PUSHBOOL(st, 0);				break;			case PSOFLOOR:				if (!pstopisint(st)) {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, floor(r1));				}				break;			case PSOGE:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHBOOL(st, i1 >= i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHBOOL(st, r1 >= r2);				}				break;			case PSOGT:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHBOOL(st, i1 > i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHBOOL(st, r1 > r2);				}				break;			case PSOIDIV:				SAFE_POPINT(st, &i2);				SAFE_POPINT(st, &i1);				SAFE_PUSHINT(st, i1 / i2);				break;			case PSOINDEX:				SAFE_POPINT(st, &i1);				SAFE_INDEX(st, i1);				break;			case PSOLE:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHBOOL(st, i1 <= i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHBOOL(st, r1 <= r2);				}				break;			case PSOLN:				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, log(r1));				break;			case PSOLOG:				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, log10(r1));				break;			case PSOLT:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHBOOL(st, i1 < i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHBOOL(st, r1 < r2);				}				break;			case PSOMOD:				SAFE_POPINT(st, &i2);				SAFE_POPINT(st, &i1);				SAFE_PUSHINT(st, i1 % i2);				break;			case PSOMUL:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					/* FIXME should check for out-of-range, and push a real instead */					SAFE_PUSHINT(st, i1 * i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, r1 * r2);				}				break;			case PSONE:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHBOOL(st, i1 != i2);				}				else if (pstoptwoarenums(st)) {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHBOOL(st, r1 != r2);				}				else {					SAFE_POPBOOL(st, &b2);					SAFE_POPBOOL(st, &b1);					SAFE_PUSHBOOL(st, b1 != b2);				}				break;			case PSONEG:				if (pstopisint(st)) {					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, -i1);				}				else {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, -r1);				}				break;			case PSONOT:				if (pstopisint(st)) {					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, ~i1);				}				else {					SAFE_POPBOOL(st, &b1);					SAFE_PUSHBOOL(st, !b1);				}				break;			case PSOOR:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, i1 | i2);				}				else {					SAFE_POPBOOL(st, &b2);					SAFE_POPBOOL(st, &b1);					SAFE_PUSHBOOL(st, b1 || b2);				}				break;			case PSOPOP:				SAFE_POP(st);				break;			case PSOROLL:				SAFE_POPINT(st, &i2);				SAFE_POPINT(st, &i1);				psroll(st, i1, i2);				break;			case PSOROUND:				if (!pstopisint(st)) {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, (r1 >= 0) ? floor(r1 + 0.5) : ceil(r1 - 0.5));				}				break;			case PSOSIN:				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, sin(r1/RADIAN));				break;			case PSOSQRT:				SAFE_POPNUM(st, &r1);				SAFE_PUSHREAL(st, sqrt(r1));				break;			case PSOSUB:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, i1 - i2);				}				else {					SAFE_POPNUM(st, &r2);					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, r1 - r2);				}				break;			case PSOTRUE:				SAFE_PUSHBOOL(st, 1);				break;			case PSOTRUNCATE:				if (!pstopisint(st)) {					SAFE_POPNUM(st, &r1);					SAFE_PUSHREAL(st, (r1 >= 0) ? floor(r1) : ceil(r1));				}				break;			case PSOXOR:				if (pstoptwoareints(st)) {					SAFE_POPINT(st, &i2);					SAFE_POPINT(st, &i1);					SAFE_PUSHINT(st, i1 ^ i2);				}				else {					SAFE_POPBOOL(st, &b2);					SAFE_POPBOOL(st, &b1);					SAFE_PUSHBOOL(st, b1 ^ b2);				}				break;			case PSOIF:				SAFE_POPBOOL(st, &b1);				if (b1) {					error = evalpostscriptfunc(func, st, codeptr + 2);					if (error)						return fz_rethrow(error, "runtime error in if-branch");				}				codeptr = func->u.p.code[codeptr + 1].u.block;				break;			case PSOIFELSE:				SAFE_POPBOOL(st, &b1);				if (b1) {					error = evalpostscriptfunc(func, st, codeptr + 2);					if (error)						return fz_rethrow(error, "runtime error in if-branch");				}				else {					error = evalpostscriptfunc(func, st, func->u.p.code[codeptr].u.block);					if (error)						return fz_rethrow(error, "runtime error in else-branch");				}				codeptr = func->u.p.code[codeptr + 1].u.block;				break;			case PSORETURN:				return fz_okay;			default:				return fz_throw("foreign operator in calculator function");			}			break;		default:			return fz_throw("foreign object in calculator function");		}	}}/* * Sample function */static int bps_supported[] = { 1, 2, 4, 8, 12, 16, 24, 32 };static fz_error *loadsamplefunc(pdf_function *func, pdf_xref *xref, fz_obj *dict, int oid, int gen){	fz_error *error;	fz_stream *stream;	fz_obj *obj;	int samplecount;	int bps;	int i;	pdf_logrsrc("sampled function {\n");	func->u.sa.samples = nil;	obj = fz_dictgets(dict, "Size");	if (!fz_isarray(obj) || fz_arraylen(obj) != func->m)		return fz_throw("malformed /Size");	for (i = 0; i < func->m; ++i)		func->u.sa.size[i] = fz_toint(fz_arrayget(obj, i));	obj = fz_dictgets(dict, "BitsPerSample");	if (!fz_isint(obj))		return fz_throw("malformed /BitsPerSample");	func->u.sa.bps = bps = fz_toint(obj);	pdf_logrsrc("bps %d\n", bps);	for (i = 0; i < nelem(bps_supported); ++i)		if (bps == bps_supported[i])			break;	if (i == nelem(bps_supported))		return fz_throw("unsupported BitsPerSample (%d)", bps);	obj = fz_dictgets(dict, "Encode");	if (fz_isarray(obj))	{		if (fz_arraylen(obj) != func->m * 2)			return fz_throw("malformed /Encode");		for (i = 0; i < func->m; ++i)		{			func->u.sa.encode[i][0] = fz_toreal(fz_arrayget(obj, i*2+0));			func->u.sa.encode[i][1] = fz_toreal(fz_arrayget(obj, i*2+1));		}	}	else	{		for (i = 0; i < func->m; ++i)		{			func->u.sa.encode[i][0] = 0;			func->u.sa.encode[i][1] = func->u.sa.size[i] - 1;		}	}	obj = fz_dictgets(dict, "Decode");	if (fz_isarray(obj))	{		if (fz_arraylen(obj) != func->n * 2)			return fz_throw("malformed /Decode");		for (i = 0; i < func->n; ++i)		{			func->u.sa.decode[i][0] = fz_toreal(fz_arrayget(obj, i*2+0));			func->u.sa.decode[i][1] = fz_toreal(fz_arrayget(obj, i*2+1));		}	}	else	{		for (i = 0; i < func->n; ++i)		{			func->u.sa.decode[i][0] = func->range[i][0];			func->u.sa.decode[i][1] = func->range[i][1];		}	}	for (i = 0, samplecount = func->n; i < func->m; ++i)		samplecount *= func->u.sa.size[i];	pdf_logrsrc("samplecount %d\n", samplecount);	func->u.sa.samples = fz_malloc(samplecount * sizeof(int));	if (!func->u.sa.samples)		return fz_throw("outofmem: samples");	error = pdf_openstream(&stream, xref, oid, gen);	if (error)		return fz_rethrow(error, "cannot open samples stream");	/* read samples */	{		unsigned int bitmask = (1 << bps) - 1;		unsigned int buf = 0;		int bits = 0;		int s;		for (i = 0; i < samplecount; ++i)		{			if (fz_peekbyte(stream) == EOF && bits == 0)			{				fz_dropstream(stream);				error = fz_readerror(stream);				if (error)					return fz_rethrow(error, "truncated sample stream");				return fz_throw("truncated sample stream");			}			if (bps == 8) {				s = fz_readbyte(stream);			}			else if (samplecount == 16) {				s = fz_readbyte(stream);				s = (s << 8) + fz_readbyte(stream);			}			else if (samplecount == 32) {				s = fz_readbyte(stream);				s = (s << 8) + fz_readbyte(stream);				s = (s << 8) + fz_readbyte(stream);				s = (s << 8) + fz_readbyte(stream);			}			else {				while (bits < bps)				{					buf = (buf << 8) | (fz_readbyte(stream) & 0xff);					bits += 8;				}				s = (buf >> (bits - bps)) & bitmask;				bits -= bps;			}			func->u.sa.samples[i] = s;		}		error = fz_readerror(stream);		if (error)			return fz_rethrow(error, "truncated sample stream");	}	fz_dropstream(stream);	pdf_logrsrc("}\n");	return fz_okay;}static fz_error *evalsamplefunc(pdf_function *func, float *in, float *out){	float x;	int e[2][MAXM];	float efrac[MAXM];	float static0[1 << 4];	float static1[1 << 4];	float *s0 = static0;	float *s1 = static1;	int i, j, k;	int idx;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -