From 16e02f6e91a7a8be2d3d4067ad36195e01fc5b92 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sat, 2 Sep 2023 20:18:07 +0000 Subject: Release 11.02.03 git-svn-id: http://svn.code.sf.net/p/netpbm/code/stable@4627 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- analyzer/pgmtexture.c | 8 ++++++-- doc/HISTORY | 15 +++++++++++++++ editor/pamaddnoise.c | 41 ++++++++--------------------------------- generator/ppmrough.c | 46 ++++++++++++++++++++++++++++------------------ version.mk | 2 +- 5 files changed, 58 insertions(+), 54 deletions(-) diff --git a/analyzer/pgmtexture.c b/analyzer/pgmtexture.c index 5af51bf5..06db12f2 100644 --- a/analyzer/pgmtexture.c +++ b/analyzer/pgmtexture.c @@ -915,6 +915,8 @@ main (int argc, const char ** argv) { pm_proginit(&argc, argv); + d = 1; + argn = 1; /* Check for flags. */ @@ -942,11 +944,13 @@ main (int argc, const char ** argv) { if ( argn != argc ) pm_usage( usage ); - d = 1; - grays = pgm_readpgm(ifP, &cols, &rows, &maxval); pm_close (ifP); + if (maxval > PGM_MAXMAXVAL) + pm_error("Maxval %u is too high. We can handle only up to %u", + maxval, PGM_MAXMAXVAL); + /* Determine the number of different gray scales (not maxval) */ for (i = 0; i <= PGM_MAXMAXVAL; ++i) tone[i] = -1; diff --git a/doc/HISTORY b/doc/HISTORY index 3dedba44..288aded6 100644 --- a/doc/HISTORY +++ b/doc/HISTORY @@ -4,6 +4,21 @@ Netpbm. CHANGE HISTORY -------------- +23.09.02 BJH Release 11.02.03 + + pamaddnoise: fix very incorrect noise added for all types. + Introduced in Netpbm 10.94 (March 2021). + + pgmtexture: Fix buffer overflow with maxval > 255. Always + broken. Maxvals > 255 were possible starting in Netpbm 9.0 + (April 2000). + + ppmrough: fix buffer overrun. Always broken (Ppmrough was new + in Netpbm 10.9 (September 2002). + + ppmrough: fix excessive roughness. Introduced in Netpbm 10.94 + (March 2021). + 23.08.18 BJH Release 11.02.02 ppmfade: fix "file not found" crash for most fade modes. diff --git a/editor/pamaddnoise.c b/editor/pamaddnoise.c index 9ca80394..e585700b 100644 --- a/editor/pamaddnoise.c +++ b/editor/pamaddnoise.c @@ -43,14 +43,6 @@ static double const SALT_RATIO = 0.5; -static double -rand1(struct pm_randSt * const randStP) { - - return (double)pm_rand(randStP)/RAND_MAX; -} - - - enum NoiseType { NOISETYPE_GAUSSIAN, NOISETYPE_IMPULSE, /* aka salt and pepper noise */ @@ -226,19 +218,13 @@ addGaussianNoise(sample const maxval, Based on Kasturi/Algorithms of the ACM -----------------------------------------------------------------------------*/ - double x1, x2, xn, yn; + double grnd1, grnd2; /* Gaussian random numbers. mean=0 sigma=1 */ double rawNewSample; - x1 = rand1(randStP); - - if (x1 == 0.0) - x1 = 1.0; - x2 = rand1(randStP); - xn = sqrt(-2.0 * log(x1)) * cos(2.0 * M_PI * x2); - yn = sqrt(-2.0 * log(x1)) * sin(2.0 * M_PI * x2); + pm_gaussrand2(randStP, &grnd1, &grnd2); rawNewSample = - origSample + (sqrt((double) origSample) * sigma1 * xn) + (sigma2 * yn); + origSample + (sqrt((double) origSample) * sigma1 * grnd1) + (sigma2 * grnd2); *newSampleP = MAX(MIN((int)rawNewSample, maxval), 0); } @@ -259,7 +245,7 @@ addImpulseNoise(sample const maxval, double const pepperRatio = 1.0 - saltRatio; double const loTolerance = tolerance * pepperRatio; double const hiTolerance = 1.0 - tolerance * saltRatio; - double const sap = rand1(randStP); + double const sap = pm_drand(randStP); *newSampleP = sap < loTolerance ? 0 : @@ -281,7 +267,7 @@ addLaplacianNoise(sample const maxval, From Pitas' book. -----------------------------------------------------------------------------*/ - double const u = rand1(randStP); + double const u = pm_drand(randStP); double rawNewSample; @@ -314,21 +300,10 @@ addMultiplicativeGaussianNoise(sample const maxval, From Pitas' book. -----------------------------------------------------------------------------*/ - double rayleigh, gauss; + double rawNewSample; - { - double const uniform = rand1(randStP); - if (uniform <= EPSILON) - rayleigh = infinity; - else - rayleigh = sqrt(-2.0 * log( uniform)); - } - { - double const uniform = rand1(randStP); - gauss = rayleigh * cos(2.0 * M_PI * uniform); - } - rawNewSample = origSample + (origSample * mgsigma * gauss); + rawNewSample = origSample + (origSample * mgsigma * pm_gaussrand(randStP)); *newSampleP = MIN(MAX((int)rawNewSample, 0), maxval); } @@ -384,7 +359,7 @@ addPoissonNoise(struct pam * const pamP, double const lambda = origSampleIntensity * lambdaOfMaxval; - double const u = rand1(randStP); + double const u = pm_drand(randStP); /* We now apply the inverse CDF (cumulative distribution function) of the Poisson distribution to uniform random variable 'u' to get a Poisson diff --git a/generator/ppmrough.c b/generator/ppmrough.c index a4a1f14d..c43b1fa5 100644 --- a/generator/ppmrough.c +++ b/generator/ppmrough.c @@ -96,6 +96,14 @@ parseCommandLine(int argc, const char ** argv, cmdlineP->fg = NULL; if (!varSpec) cmdlineP->var = 10; + if (cmdlineP->topSpec && cmdlineP->top > cmdlineP->height) + pm_error("-top value too large. Max is %u", cmdlineP->height); + if (cmdlineP->bottomSpec && cmdlineP->bottom > cmdlineP->height) + pm_error("-bottom value too large. Max is %u", cmdlineP->height); + if (cmdlineP->leftSpec && cmdlineP->left > cmdlineP->width) + pm_error("-left value too large. Max is %u", cmdlineP->width); + if (cmdlineP->rightSpec && cmdlineP->right > cmdlineP->width) + pm_error("-right value too large. Max is %u", cmdlineP->width); if (argc-1 != 0) pm_error("There are no arguments. You specified %d.", argc-1); @@ -159,6 +167,7 @@ procLeft(pixel ** const pixels, int const r2, int const c1, int const c2, + unsigned int const width, unsigned int const var, pixel const bgcolor, struct pm_randSt * const randStP) { @@ -166,15 +175,15 @@ procLeft(pixel ** const pixels, if (r1 + 1 != r2) { int const rm = (r1 + r2) >> 1; int const cm = ((c1 + c2) >> 1) + - (int)floor(((float)pm_rand(randStP) / RAND_MAX - 0.5) * var + 0.5); + (int)floor(((float)pm_drand(randStP) - 0.5) * var + 0.5); - int c; + unsigned int c; - for (c = 0; c < cm; c++) + for (c = 0; c < MIN(width, MAX(0, cm)); c++) pixels[rm][c] = bgcolor; - procLeft(pixels, r1, rm, c1, cm, var, bgcolor, randStP); - procLeft(pixels, rm, r2, cm, c2, var, bgcolor, randStP); + procLeft(pixels, r1, rm, c1, cm, width, var, bgcolor, randStP); + procLeft(pixels, rm, r2, cm, c2, width, var, bgcolor, randStP); } } @@ -194,11 +203,11 @@ procRight(pixel ** const pixels, if (r1 + 1 != r2) { int const rm = (r1 + r2) >> 1; int const cm = ((c1 + c2) >> 1) + - (int)floor(((float)pm_rand(randStP) / RAND_MAX - 0.5) * var + 0.5); + (int)floor(((float)pm_drand(randStP) - 0.5) * var + 0.5); - int c; + unsigned int c; - for (c = cm; c < width; c++) + for (c = MAX(0, cm); c < width; c++) pixels[rm][c] = bgcolor; procRight(pixels, r1, rm, c1, cm, width, var, bgcolor, randStP); @@ -214,6 +223,7 @@ procTop(pixel ** const pixels, int const c2, int const r1, int const r2, + unsigned int const height, unsigned int const var, pixel const bgcolor, struct pm_randSt * const randStP) { @@ -221,15 +231,15 @@ procTop(pixel ** const pixels, if (c1 + 1 != c2) { int const cm = (c1 + c2) >> 1; int const rm = ((r1 + r2) >> 1) + - (int)floor(((float)pm_rand(randStP) / RAND_MAX - 0.5) * var + 0.5); + (int)floor(((float)pm_drand(randStP) - 0.5) * var + 0.5); - int r; + unsigned int r; - for (r = 0; r < rm; r++) + for (r = 0; r < MIN(height, MAX(0, rm)); r++) pixels[r][cm] = bgcolor; - procTop(pixels, c1, cm, r1, rm, var, bgcolor, randStP); - procTop(pixels, cm, c2, rm, r2, var, bgcolor, randStP); + procTop(pixels, c1, cm, r1, rm, height, var, bgcolor, randStP); + procTop(pixels, cm, c2, rm, r2, height, var, bgcolor, randStP); } } @@ -249,11 +259,11 @@ procBottom(pixel ** const pixels, if (c1 + 1 != c2) { int const cm = (c1 + c2) >> 1; int const rm = ((r1 + r2) >> 1) + - (int)floor(((float)pm_rand(randStP) / RAND_MAX - 0.5) * var + 0.5); + (int)floor(((float)pm_drand(randStP) - 0.5) * var + 0.5); - int r; + unsigned int r; - for (r = rm; r < height; ++r) + for (r = MAX(0, rm); r < height; ++r) pixels[r][cm] = bgcolor; procBottom(pixels, c1, cm, r1, rm, height, var, bgcolor, randStP); @@ -286,7 +296,7 @@ makeRaggedLeftBorder(pixel ** const pixels, for (col = 0; col < leftC2; ++col) pixels[leftR2][col] = bgcolor; - procLeft(pixels, leftR1, leftR2, leftC1, leftC2, var, + procLeft(pixels, leftR1, leftR2, leftC1, leftC2, cols, var, bgcolor, randStP); } } @@ -347,7 +357,7 @@ makeRaggedTopBorder(pixel ** const pixels, for (row = 0; row < topR2; ++row) pixels[row][topC2] = bgcolor; - procTop(pixels, topC1, topC2, topR1, topR2, var, bgcolor, randStP); + procTop(pixels, topC1, topC2, topR1, topR2, rows, var, bgcolor, randStP); } } diff --git a/version.mk b/version.mk index 6eedf94e..9218c3f4 100644 --- a/version.mk +++ b/version.mk @@ -1,3 +1,3 @@ NETPBM_MAJOR_RELEASE = 11 NETPBM_MINOR_RELEASE = 2 -NETPBM_POINT_RELEASE = 2 +NETPBM_POINT_RELEASE = 3 -- cgit 1.4.1