diff options
author | Ken Sharp <ken.sharp@artifex.com> | 2016-05-11 14:01:47 +0100 |
---|---|---|
committer | Ken Sharp <ken.sharp@artifex.com> | 2016-05-11 14:18:43 +0100 |
commit | d5008bf9092e99b5eb7f295c9d684850bf2aa66f (patch) | |
tree | 01141c40344865dc567aafd392a5c8097e4c4a7e /base/gxiscale.c | |
parent | 473afa3fbc71bd8cd1814f5e9d7f551ebbda436d (diff) | |
download | ghostpdl-d5008bf9092e99b5eb7f295c9d684850bf2aa66f.tar.gz |
Remove a load of macros in the graphics library
The 'load' and 'store' macros were deemed offensive for a number of
reasons; they declared variables, hiding them from casual view, they
hid flow control (switch statements started in one macro, ended in
another), returns from inside macros, some macros were not (and could
not be) bounded by "do{...} while" which means care needed to be taken
with ';' and were very deeply nested, the names chose for the macros
made them look like functions, finally macros are hard to debug, even
with a macro-expanding debugger.
Additionally there were the 'LINE_ACCUM' macros, some of which simply
called the 'load/store' macros directly, which just added another
layer of obfuscation, particularly since these macros were defined in
a different header file. Macros could be nested 4 or 5 levels deep.
This commit finishes removing all but one of the macros, the last
remaining macro has been renamed to upper case to make it clearer that
it is a macro. It can't easily be removed since it depends on the size
of gx_color_index, which is a compile time #define.
The functionality of the macros has either been expanded in line or
replaced with inline functions declared in gsbitops.h. The majority
of the macros have been replaced with functions, even for small functions
where it seemed useful to keep the name as a description of the actual
functionality.
I don't anticipate any differences, but I think this makes the code
easier to understand, easier to debug, and therefore easier to maintain.
Diffstat (limited to 'base/gxiscale.c')
-rw-r--r-- | base/gxiscale.c | 126 |
1 files changed, 106 insertions, 20 deletions
diff --git a/base/gxiscale.c b/base/gxiscale.c index bb8a52974..840efd238 100644 --- a/base/gxiscale.c +++ b/base/gxiscale.c @@ -966,7 +966,10 @@ image_render_interpolate(gx_image_enum * penum, const byte * buffer, gx_device_color devc; int status, code; - DECLARE_LINE_ACCUM_COPY(out, bpp, xo); + byte *l_dptr = out; + int l_dbit = 0; + byte l_dbyte = ((l_dbit) ? (byte)(*(l_dptr) & (0xff00 >> (l_dbit))) : 0); + int l_xprev = (xo); stream_w.limit = out + width * max(spp_decode * sizeofPixelOut, ARCH_SIZEOF_COLOR_INDEX) - 1; stream_w.ptr = stream_w.limit - width * spp_decode * sizeofPixelOut; @@ -1000,14 +1003,28 @@ image_render_interpolate(gx_image_enum * penum, const byte * buffer, switch (spp_decode) { case 1: do { - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } vd_pixel(int2fixed(x), int2fixed(ry), color); x++, psrc += 1; } while (x < xe && psrc[-1] == psrc[0]); break; case 3: do { - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } vd_pixel(int2fixed(x), int2fixed(ry), color); x++, psrc += 3; } while (x < xe && @@ -1017,7 +1034,14 @@ image_render_interpolate(gx_image_enum * penum, const byte * buffer, break; case 4: do { - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } x++, psrc += 4; } while (x < xe && psrc[-4] == psrc[0] && @@ -1026,14 +1050,28 @@ image_render_interpolate(gx_image_enum * penum, const byte * buffer, psrc[-1] == psrc[3]); break; default: - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } x++, psrc += spp_decode; } } else { int rcode, i, rep = 0; /* do _COPY in case any pure colors were accumulated above */ - LINE_ACCUM_COPY(dev, out, bpp, xo, x, raster, ry); + if ( x > l_xprev ) { + sample_store_flush(l_dptr, l_dbit, l_dbyte); + code = (*dev_proc(dev, copy_color)) + (dev, out, l_xprev - xo, raster, + gx_no_bitmap_id, l_xprev, ry, x - l_xprev, 1); + if (code < 0) + return code; + } /* as above, see if we can accumulate any runs */ switch (spp_decode) { case 1: @@ -1067,16 +1105,21 @@ image_render_interpolate(gx_image_enum * penum, const byte * buffer, rcode = gx_fill_rectangle_device_rop(x, ry, rep, 1, &devc, dev, lop); if (rcode < 0) return rcode; - /* FIXME: LINE_ACCUM_SKIP can't handle aritrary skip lengths */ - /* I recommend getting rid of the macros !!! */ for (i = 0; i < rep; i++) { - LINE_ACCUM_SKIP(bpp); + sample_store_skip_next(&l_dptr, &l_dbit, bpp, &l_dbyte); } l_xprev = x + rep; x += rep; } } - LINE_ACCUM_COPY(dev, out, bpp, xo, x, raster, ry); + if ( x > l_xprev ) { + sample_store_flush(l_dptr, l_dbit, l_dbyte); + code = (*dev_proc(dev, copy_color)) + (dev, out, l_xprev - xo, raster, + gx_no_bitmap_id, l_xprev, ry, x - l_xprev, 1); + if (code < 0) + return code; + } /*if_debug1m('w', dev->memory, "[w]Y=%d:\n", ry);*/ /* See siscale.c about 'w'. */ inactive: penum->line_xy++; @@ -1349,7 +1392,10 @@ image_render_interpolate_icc(gx_image_enum * penum, const byte * buffer, gx_device_color devc; int status; - DECLARE_LINE_ACCUM_COPY(out, bpp, xo); + byte *l_dptr = out; + int l_dbit = 0; + byte l_dbyte = ((l_dbit) ? (byte)(*(l_dptr) & (0xff00 >> (l_dbit))) : 0); + int l_xprev = (xo); stream_w.limit = out + width * max(spp_interp * sizeofPixelOut, ARCH_SIZEOF_COLOR_INDEX) - 1; stream_w.ptr = stream_w.limit - width * spp_interp * sizeofPixelOut; @@ -1407,14 +1453,28 @@ image_render_interpolate_icc(gx_image_enum * penum, const byte * buffer, switch (spp_cm) { case 1: do { - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } vd_pixel(int2fixed(x), int2fixed(ry), color); x++, p_cm_interp += 1; } while (x < xe && p_cm_interp[-1] == p_cm_interp[0]); break; case 3: do { - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } vd_pixel(int2fixed(x), int2fixed(ry), color); x++, p_cm_interp += 3; } while (x < xe && p_cm_interp[-3] == p_cm_interp[0] && @@ -1423,7 +1483,14 @@ image_render_interpolate_icc(gx_image_enum * penum, const byte * buffer, break; case 4: do { - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } x++, p_cm_interp += 4; } while (x < xe && p_cm_interp[-4] == p_cm_interp[0] && p_cm_interp[-3] == p_cm_interp[1] && @@ -1431,14 +1498,28 @@ image_render_interpolate_icc(gx_image_enum * penum, const byte * buffer, p_cm_interp[-1] == p_cm_interp[3]); break; default: - LINE_ACCUM(color, bpp); + if (sizeof(color) > 4) { + if (sample_store_next64(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } + else { + if (sample_store_next32(color, &l_dptr, &l_dbit, bpp, &l_dbyte) < 0) + return_error(gs_error_rangecheck); + } x++, p_cm_interp += spp_cm; } } else { int rcode, i, rep = 0; /* do _COPY in case any pure colors were accumulated above*/ - LINE_ACCUM_COPY(dev, out, bpp, xo, x, raster, ry); + if ( x > l_xprev ) { + sample_store_flush(l_dptr, l_dbit, l_dbyte); + code = (*dev_proc(dev, copy_color)) + (dev, out, l_xprev - xo, raster, + gx_no_bitmap_id, l_xprev, ry, x - l_xprev, 1); + if (code < 0) + return code; + } /* as above, see if we can accumulate any runs */ switch (spp_cm) { case 1: @@ -1468,16 +1549,21 @@ image_render_interpolate_icc(gx_image_enum * penum, const byte * buffer, rcode = gx_fill_rectangle_device_rop(x, ry, rep, 1, &devc, dev, lop); if (rcode < 0) return rcode; - /* FIXME: LINE_ACCUM_SKIP can't handle aritrary skip lengths */ - /* I recommend getting rid of the macros !!! */ for (i = 0; i < rep; i++) { - LINE_ACCUM_SKIP(bpp); + sample_store_skip_next(&l_dptr, &l_dbit, bpp, &l_dbyte); } l_xprev = x + rep; x += rep; } } /* End on x loop */ - LINE_ACCUM_COPY(dev, out, bpp, xo, x, raster, ry); + if ( x > l_xprev ) { + sample_store_flush(l_dptr, l_dbit, l_dbyte); + code = (*dev_proc(dev, copy_color)) + (dev, out, l_xprev - xo, raster, + gx_no_bitmap_id, l_xprev, ry, x - l_xprev, 1); + if (code < 0) + return code; + } /*if_debug1m('w', penum->memory, "[w]Y=%d:\n", ry);*/ /* See siscale.c about 'w'. */ inactive: penum->line_xy++; |