X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=inline;f=pdf%2Fxpdf%2FFunction.cc;h=28eed87a5e3862ea21785428adaf07756fceaa59;hb=ed8d29b07f2233cbaa4c134b78710619049a652b;hp=64ea60c1902e6bbbcc8b7e3e3b0ef21ceb993fa6;hpb=5f7eee136b5330a15069179cbd97f168287a9ef6;p=evince.git diff --git a/pdf/xpdf/Function.cc b/pdf/xpdf/Function.cc index 64ea60c1..28eed87a 100644 --- a/pdf/xpdf/Function.cc +++ b/pdf/xpdf/Function.cc @@ -2,15 +2,17 @@ // // Function.cc // -// Copyright 2001-2002 Glyph & Cog, LLC +// Copyright 2001-2003 Glyph & Cog, LLC // //======================================================================== -#ifdef __GNUC__ +#include + +#ifdef USE_GCC_PRAGMAS #pragma implementation #endif -#include +#include #include #include #include @@ -411,7 +413,6 @@ void SampledFunction::transform(double *in, double *out) { ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { Object obj1, obj2; - GBool hasN; int i; ok = gFalse; @@ -424,23 +425,14 @@ ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { error(-1, "Exponential function with more than one input"); goto err1; } - hasN = hasRange; - - //----- default values - for (i = 0; i < funcMaxOutputs; ++i) { - c0[i] = 0; - c1[i] = 1; - } //----- C0 if (dict->lookup("C0", &obj1)->isArray()) { - if (!hasN) { - n = obj1.arrayGetLength(); - hasN = gTrue; - } else if (obj1.arrayGetLength() != n) { + if (hasRange && obj1.arrayGetLength() != n) { error(-1, "Function's C0 array is wrong length"); goto err2; } + n = obj1.arrayGetLength(); for (i = 0; i < n; ++i) { obj1.arrayGet(i, &obj2); if (!obj2.isNum()) { @@ -450,15 +442,19 @@ ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { c0[i] = obj2.getNum(); obj2.free(); } + } else { + if (hasRange && n != 1) { + error(-1, "Function's C0 array is wrong length"); + goto err2; + } + n = 1; + c0[0] = 0; } obj1.free(); //----- C1 if (dict->lookup("C1", &obj1)->isArray()) { - if (!hasN) { - n = obj1.arrayGetLength(); - hasN = gTrue; - } else if (obj1.arrayGetLength() != n) { + if (obj1.arrayGetLength() != n) { error(-1, "Function's C1 array is wrong length"); goto err2; } @@ -471,6 +467,12 @@ ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { c1[i] = obj2.getNum(); obj2.free(); } + } else { + if (n != 1) { + error(-1, "Function's C1 array is wrong length"); + goto err2; + } + c1[0] = 1; } obj1.free(); @@ -482,13 +484,6 @@ ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) { e = obj1.getNum(); obj1.free(); - // this isn't supposed to happen, but I've run into (broken) PDF - // files where it does - if (!hasN) { - error(-1, "Exponential function does not define number of output values"); - n = 1; - } - ok = gTrue; return; @@ -1071,7 +1066,11 @@ GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) { resizeCode(*codePtr); if (isReal) { code[*codePtr].type = psReal; - code[*codePtr].real = atof(tok->getCString()); + { + char *theLocale = setlocale(LC_NUMERIC, "C"); + code[*codePtr].real = atof(tok->getCString()); + setlocale(LC_NUMERIC, theLocale); + } } else { code[*codePtr].type = psInt; code[*codePtr].intg = atoi(tok->getCString()); @@ -1095,14 +1094,14 @@ GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) { if (!parseCode(str, codePtr)) { return gFalse; } + delete tok; + if (!(tok = getToken(str))) { + error(-1, "Unexpected end of PostScript function stream"); + return gFalse; + } } else { elsePtr = -1; } - delete tok; - if (!(tok = getToken(str))) { - error(-1, "Unexpected end of PostScript function stream"); - return gFalse; - } if (!tok->cmp("if")) { if (elsePtr >= 0) { error(-1, "Got 'if' operator with two blocks in PostScript function");