From 3a6e008f72ac52052d76ef95af33b0eafbfabc13 Mon Sep 17 00:00:00 2001 From: rdb Date: Sun, 31 Oct 2010 13:32:35 +0000 Subject: [PATCH] Better solution to subzero clamping problem --- panda/src/pnmimage/pnmImage.cxx | 46 ++++++++++----------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/panda/src/pnmimage/pnmImage.cxx b/panda/src/pnmimage/pnmImage.cxx index 66df0aca2b..3529403a41 100644 --- a/panda/src/pnmimage/pnmImage.cxx +++ b/panda/src/pnmimage/pnmImage.cxx @@ -1464,25 +1464,28 @@ operator += (const PNMImage &other) { void PNMImage:: operator += (const Colord &other) { size_t array_size = _x_size * _y_size; - xel addxel (to_val(other.get_x()), to_val(other.get_y()), to_val(other.get_z())); - xelval addalpha = to_val(other.get_w()); + // Note: don't use to_val here because it clamps values below 0 + int add_r = (int)(other.get_x() * get_maxval() + 0.5); + int add_g = (int)(other.get_y() * get_maxval() + 0.5); + int add_b = (int)(other.get_z() * get_maxval() + 0.5); + int add_a = (int)(other.get_w() * get_maxval() + 0.5); if (_array != NULL && _alpha != NULL) { for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r + addxel.r); - _array[i].g = clamp_val(_array[i].g + addxel.g); - _array[i].b = clamp_val(_array[i].b + addxel.b); - _alpha[i] = clamp_val(_alpha[i] + addalpha); + _array[i].r = clamp_val(_array[i].r + add_r); + _array[i].g = clamp_val(_array[i].g + add_g); + _array[i].b = clamp_val(_array[i].b + add_b); + _alpha[i] = clamp_val(_alpha[i] + add_a); } } else if (_array != NULL) { for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r + addxel.r); - _array[i].g = clamp_val(_array[i].g + addxel.g); - _array[i].b = clamp_val(_array[i].b + addxel.b); + _array[i].r = clamp_val(_array[i].r + add_r); + _array[i].g = clamp_val(_array[i].g + add_g); + _array[i].b = clamp_val(_array[i].b + add_b); } } else if (_alpha != NULL) { for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] + addalpha); + _alpha[i] = clamp_val(_alpha[i] + add_a); } } } @@ -1529,28 +1532,7 @@ operator -= (const PNMImage &other) { //////////////////////////////////////////////////////////////////// void PNMImage:: operator -= (const Colord &other) { - size_t array_size = _x_size * _y_size; - xel subxel (to_val(other.get_x()), to_val(other.get_y()), to_val(other.get_z())); - xelval subalpha = to_val(other.get_w()); - - if (_array != NULL && _alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r - subxel.r); - _array[i].g = clamp_val(_array[i].g - subxel.g); - _array[i].b = clamp_val(_array[i].b - subxel.b); - _alpha[i] = clamp_val(_alpha[i] + subalpha); - } - } else if (_array != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _array[i].r = clamp_val(_array[i].r - subxel.r); - _array[i].g = clamp_val(_array[i].g - subxel.g); - _array[i].b = clamp_val(_array[i].b - subxel.b); - } - } else if (_alpha != NULL) { - for (size_t i = 0; i < array_size; ++i) { - _alpha[i] = clamp_val(_alpha[i] - subalpha); - } - } + (*this) += (-other); } ////////////////////////////////////////////////////////////////////