diff options
Diffstat (limited to 'base/gsbitcom.c')
-rw-r--r-- | base/gsbitcom.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/base/gsbitcom.c b/base/gsbitcom.c index 5af03642..6c8c78fe 100644 --- a/base/gsbitcom.c +++ b/base/gsbitcom.c @@ -13,6 +13,7 @@ CA 94945, U.S.A., +1(415)492-9861, for further information. */ +#include <assert.h> /* Oversampled bitmap compression */ #include "std.h" @@ -128,6 +129,34 @@ bits_compress_scaled(const byte * src, int srcx, uint width, uint height, byte *d = dest; uint h; + /* Assert some preconditions are satisfied: */ + + /* log2_x and log2_y must each be 0, 1 or 2. */ + assert(log2_x >= 0 && log2_x < 3); + assert(log2_y >= 0 && log2_y < 3); + + /* srcx and width must be multiple of xscale. */ + assert(srcx % xscale == 0); + assert(width % xscale == 0); + + /* height must be multiple of yscale. */ + assert(height % yscale == 0); + + /* because xscale is 1, 2 or 4 and srcx is a multiple of xscale, + in_shift_initial ends up being constrained as follows: */ + if (log2_x == 0) { + /* in_shift_initial is {0,1,2,3,4,5,6,7]} */ + assert(in_shift_initial >= 0 && in_shift_initial < 8); + } + if (log2_x == 1) { + /* in_shift_initial is {0,2,4,6}. */ + assert(in_shift_initial >= 0 && in_shift_initial < 7 && in_shift_initial % 2 == 0); + } + if (log2_x == 2) { + /* in_shift_initial is {0,4} */ + assert(in_shift_initial == 0 || in_shift_initial == 4); + } + for (h = height; h; srow += sskip, h -= yscale) { const byte *s = srow; @@ -196,8 +225,11 @@ bits_compress_scaled(const byte * src, int srcx, uint width, uint height, for (index = 0, count = 0; index != sskip; index += sraster - ) + ) { + /* Coverity 94484 incorrectly thinks in_shift can be negative. */ + /* coverity[negative_shift] */ count += half_byte_1s[(s[index] >> in_shift) & mask]; + } if (count != 0 && table[count] == 0) { /* Look at adjacent cells to help prevent */ /* dropouts. */ uint orig_count = count; |