📄 pdf_function.c.svn-base
字号:
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 + -