diff options
Diffstat (limited to 'qemu/ui/vnc-enc-zywrle.h')
-rw-r--r-- | qemu/ui/vnc-enc-zywrle.h | 659 |
1 files changed, 0 insertions, 659 deletions
diff --git a/qemu/ui/vnc-enc-zywrle.h b/qemu/ui/vnc-enc-zywrle.h deleted file mode 100644 index d436d588f..000000000 --- a/qemu/ui/vnc-enc-zywrle.h +++ /dev/null @@ -1,659 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE 'ZYWRLE' VNC CODEC SOURCE CODE. * - * * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A FOLLOWING BSD-STYLE SOURCE LICENSE. * - * PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE 'ZYWRLE' VNC CODEC SOURCE CODE IS (C) COPYRIGHT 2006 * - * BY Hitachi Systems & Services, Ltd. * - * (Noriaki Yamazaki, Research & Development Center) * - * * - * * - ******************************************************************** -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Hitachi Systems & Services, Ltd. nor -the names of its contributors may be used to endorse or promote -products derived from this software without specific prior written -permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ********************************************************************/ - -#ifndef VNC_ENCODING_ZYWRLE_H -#define VNC_ENCODING_ZYWRLE_H - -/* Tables for Coefficients filtering. */ -#ifndef ZYWRLE_QUANTIZE -/* Type A:lower bit omitting of EZW style. */ -static const unsigned int zywrle_param[3][3]={ - {0x0000F000, 0x00000000, 0x00000000}, - {0x0000C000, 0x00F0F0F0, 0x00000000}, - {0x0000C000, 0x00C0C0C0, 0x00F0F0F0}, -/* {0x0000FF00, 0x00000000, 0x00000000}, - {0x0000FF00, 0x00FFFFFF, 0x00000000}, - {0x0000FF00, 0x00FFFFFF, 0x00FFFFFF}, */ -}; -#else -/* Type B:Non liner quantization filter. */ -static const int8_t zywrle_conv[4][256]={ -{ /* bi=5, bo=5 r=0.0:PSNR=24.849 */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}, -{ /* bi=5, bo=5 r=2.0:PSNR=74.031 */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 32, - 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, - 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 64, 64, 64, 64, - 64, 64, 64, 64, 72, 72, 72, 72, - 72, 72, 72, 72, 80, 80, 80, 80, - 80, 80, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 96, 96, - 96, 96, 96, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, - 0, -120, -120, -120, -120, -120, -120, -120, - -120, -120, -120, -112, -112, -112, -112, -112, - -112, -112, -112, -112, -104, -104, -104, -104, - -104, -104, -104, -104, -104, -104, -96, -96, - -96, -96, -96, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -80, - -80, -80, -80, -80, -80, -72, -72, -72, - -72, -72, -72, -72, -72, -64, -64, -64, - -64, -64, -64, -64, -64, -56, -56, -56, - -56, -56, -56, -56, -56, -56, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, - -48, -32, -32, -32, -32, -32, -32, -32, - -32, -32, -32, -32, -32, -32, -32, -32, - -32, -32, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}, -{ /* bi=5, bo=4 r=2.0:PSNR=64.441 */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, - 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, - 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, - 0, -120, -120, -120, -120, -120, -120, -120, - -120, -120, -120, -120, -120, -112, -112, -112, - -112, -112, -112, -112, -112, -112, -104, -104, - -104, -104, -104, -104, -104, -104, -104, -104, - -104, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -80, -80, -80, -80, - -80, -80, -80, -80, -80, -80, -80, -80, - -80, -64, -64, -64, -64, -64, -64, -64, - -64, -64, -64, -64, -64, -64, -64, -64, - -64, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -48, -48, -48, - -48, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -}, -{ /* bi=5, bo=2 r=2.0:PSNR=43.175 */ - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, - 0, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, -88, -88, -88, -88, -88, -88, -88, - -88, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, -} -}; - -static const int8_t *zywrle_param[3][3][3]={ - {{zywrle_conv[0], zywrle_conv[2], zywrle_conv[0]}, - {zywrle_conv[0], zywrle_conv[0], zywrle_conv[0]}, - {zywrle_conv[0], zywrle_conv[0], zywrle_conv[0]}}, - {{zywrle_conv[0], zywrle_conv[3], zywrle_conv[0]}, - {zywrle_conv[1], zywrle_conv[1], zywrle_conv[1]}, - {zywrle_conv[0], zywrle_conv[0], zywrle_conv[0]}}, - {{zywrle_conv[0], zywrle_conv[3], zywrle_conv[0]}, - {zywrle_conv[2], zywrle_conv[2], zywrle_conv[2]}, - {zywrle_conv[1], zywrle_conv[1], zywrle_conv[1]}}, -}; -#endif - -/* Load/Save pixel stuffs. */ -#define ZYWRLE_YMASK15 0xFFFFFFF8 -#define ZYWRLE_UVMASK15 0xFFFFFFF8 -#define ZYWRLE_LOAD_PIXEL15(src, r, g, b) \ - do { \ - r = (((uint8_t*)src)[S_1]<< 1)& 0xF8; \ - g = (((uint8_t*)src)[S_1]<< 6) | (((uint8_t*)src)[S_0]>> 2); \ - g &= 0xF8; \ - b = (((uint8_t*)src)[S_0]<< 3)& 0xF8; \ - } while (0) - -#define ZYWRLE_SAVE_PIXEL15(dst, r, g, b) \ - do { \ - r &= 0xF8; \ - g &= 0xF8; \ - b &= 0xF8; \ - ((uint8_t*)dst)[S_1] = (uint8_t)((r >> 1)|(g >> 6)); \ - ((uint8_t*)dst)[S_0] = (uint8_t)(((b >> 3)|(g << 2))& 0xFF); \ - } while (0) - -#define ZYWRLE_YMASK16 0xFFFFFFFC -#define ZYWRLE_UVMASK16 0xFFFFFFF8 -#define ZYWRLE_LOAD_PIXEL16(src, r, g, b) \ - do { \ - r = ((uint8_t*)src)[S_1] & 0xF8; \ - g = (((uint8_t*)src)[S_1]<< 5) | (((uint8_t*)src)[S_0] >> 3); \ - g &= 0xFC; \ - b = (((uint8_t*)src)[S_0]<< 3) & 0xF8; \ - } while (0) - -#define ZYWRLE_SAVE_PIXEL16(dst, r, g,b) \ - do { \ - r &= 0xF8; \ - g &= 0xFC; \ - b &= 0xF8; \ - ((uint8_t*)dst)[S_1] = (uint8_t)(r | (g >> 5)); \ - ((uint8_t*)dst)[S_0] = (uint8_t)(((b >> 3)|(g << 3)) & 0xFF); \ - } while (0) - -#define ZYWRLE_YMASK32 0xFFFFFFFF -#define ZYWRLE_UVMASK32 0xFFFFFFFF -#define ZYWRLE_LOAD_PIXEL32(src, r, g, b) \ - do { \ - r = ((uint8_t*)src)[L_2]; \ - g = ((uint8_t*)src)[L_1]; \ - b = ((uint8_t*)src)[L_0]; \ - } while (0) -#define ZYWRLE_SAVE_PIXEL32(dst, r, g, b) \ - do { \ - ((uint8_t*)dst)[L_2] = (uint8_t)r; \ - ((uint8_t*)dst)[L_1] = (uint8_t)g; \ - ((uint8_t*)dst)[L_0] = (uint8_t)b; \ - } while (0) - -static inline void harr(int8_t *px0, int8_t *px1) -{ - /* Piecewise-Linear Harr(PLHarr) */ - int x0 = (int)*px0, x1 = (int)*px1; - int orgx0 = x0, orgx1 = x1; - - if ((x0 ^ x1) & 0x80) { - /* differ sign */ - x1 += x0; - if (((x1 ^ orgx1) & 0x80) == 0) { - /* |x1| > |x0| */ - x0 -= x1; /* H = -B */ - } - } else { - /* same sign */ - x0 -= x1; - if (((x0 ^ orgx0) & 0x80) == 0) { - /* |x0| > |x1| */ - x1 += x0; /* L = A */ - } - } - *px0 = (int8_t)x1; - *px1 = (int8_t)x0; -} - -/* - 1D-Wavelet transform. - - In coefficients array, the famous 'pyramid' decomposition is well used. - - 1D Model: - |L0L0L0L0|L0L0L0L0|H0H0H0H0|H0H0H0H0| : level 0 - |L1L1L1L1|H1H1H1H1|H0H0H0H0|H0H0H0H0| : level 1 - - But this method needs line buffer because H/L is different position from X0/X1. - So, I used 'interleave' decomposition instead of it. - - 1D Model: - |L0H0L0H0|L0H0L0H0|L0H0L0H0|L0H0L0H0| : level 0 - |L1H0H1H0|L1H0H1H0|L1H0H1H0|L1H0H1H0| : level 1 - - In this method, H/L and X0/X1 is always same position. - This leads us to more speed and less memory. - Of cause, the result of both method is quite same - because it's only difference that coefficient position. -*/ -static inline void wavelet_level(int *data, int size, int l, int skip_pixel) -{ - int s, ofs; - int8_t *px0; - int8_t *end; - - px0 = (int8_t*)data; - s = (8 << l) * skip_pixel; - end = px0 + (size >> (l + 1)) * s; - s -= 2; - ofs = (4 << l) * skip_pixel; - - while (px0 < end) { - harr(px0, px0 + ofs); - px0++; - harr(px0, px0 + ofs); - px0++; - harr(px0, px0 + ofs); - px0 += s; - } -} - -#ifndef ZYWRLE_QUANTIZE -/* Type A:lower bit omitting of EZW style. */ -static inline void filter_wavelet_square(int *buf, int width, int height, - int level, int l) -{ - int r, s; - int x, y; - int *h; - const unsigned int *m; - - m = &(zywrle_param[level - 1][l]); - s = 2 << l; - - for (r = 1; r < 4; r++) { - h = buf; - if (r & 0x01) { - h += s >> 1; - } - if (r & 0x02) { - h += (s >> 1) * width; - } - for (y = 0; y < height / s; y++) { - for (x = 0; x < width / s; x++) { - /* - these are same following code. - h[x] = h[x] / (~m[x]+1) * (~m[x]+1); - ( round h[x] with m[x] bit ) - '&' operator isn't 'round' but is 'floor'. - So, we must offset when h[x] is negative. - */ - if (((int8_t*)h)[0] & 0x80) { - ((int8_t*)h)[0] += ~((int8_t*)m)[0]; - } - if (((int8_t*)h)[1] & 0x80) { - ((int8_t*)h)[1] += ~((int8_t*)m)[1]; - } - if (((int8_t*)h)[2] & 0x80) { - ((int8_t*)h)[2] += ~((int8_t*)m)[2]; - } - *h &= *m; - h += s; - } - h += (s-1)*width; - } - } -} -#else -/* - Type B:Non liner quantization filter. - - Coefficients have Gaussian curve and smaller value which is - large part of coefficients isn't more important than larger value. - So, I use filter of Non liner quantize/dequantize table. - In general, Non liner quantize formula is explained as following. - - y=f(x) = sign(x)*round( ((abs(x)/(2^7))^ r )* 2^(bo-1) )*2^(8-bo) - x=f-1(y) = sign(y)*round( ((abs(y)/(2^7))^(1/r))* 2^(bi-1) )*2^(8-bi) - ( r:power coefficient bi:effective MSB in input bo:effective MSB in output ) - - r < 1.0 : Smaller value is more important than larger value. - r > 1.0 : Larger value is more important than smaller value. - r = 1.0 : Liner quantization which is same with EZW style. - - r = 0.75 is famous non liner quantization used in MP3 audio codec. - In contrast to audio data, larger value is important in wavelet coefficients. - So, I select r = 2.0 table( quantize is x^2, dequantize sqrt(x) ). - - As compared with EZW style liner quantization, this filter tended to be - more sharp edge and be more compression rate but be more blocking noise and be - less quality. Especially, the surface of graphic objects has distinguishable - noise in middle quality mode. - - We need only quantized-dequantized(filtered) value rather than quantized value - itself because all values are packed or palette-lized in later ZRLE section. - This lead us not to need to modify client decoder when we change - the filtering procedure in future. - Client only decodes coefficients given by encoder. -*/ -static inline void filter_wavelet_square(int *buf, int width, int height, - int level, int l) -{ - int r, s; - int x, y; - int *h; - const int8_t **m; - - m = zywrle_param[level - 1][l]; - s = 2 << l; - - for (r = 1; r < 4; r++) { - h = buf; - if (r & 0x01) { - h += s >> 1; - } - if (r & 0x02) { - h += (s >> 1) * width; - } - for (y = 0; y < height / s; y++) { - for (x = 0; x < width / s; x++) { - ((int8_t*)h)[0] = m[0][((uint8_t*)h)[0]]; - ((int8_t*)h)[1] = m[1][((uint8_t*)h)[1]]; - ((int8_t*)h)[2] = m[2][((uint8_t*)h)[2]]; - h += s; - } - h += (s - 1) * width; - } - } -} -#endif - -static inline void wavelet(int *buf, int width, int height, int level) -{ - int l, s; - int *top; - int *end; - - for (l = 0; l < level; l++) { - top = buf; - end = buf + height * width; - s = width << l; - while (top < end) { - wavelet_level(top, width, l, 1); - top += s; - } - top = buf; - end = buf + width; - s = 1<<l; - while (top < end) { - wavelet_level(top, height, l, width); - top += s; - } - filter_wavelet_square(buf, width, height, level, l); - } -} - - -/* Load/Save coefficients stuffs. - Coefficients manages as 24 bits little-endian pixel. */ -#define ZYWRLE_LOAD_COEFF(src, r, g, b) \ - do { \ - r = ((int8_t*)src)[2]; \ - g = ((int8_t*)src)[1]; \ - b = ((int8_t*)src)[0]; \ - } while (0) - -#define ZYWRLE_SAVE_COEFF(dst, r, g, b) \ - do { \ - ((int8_t*)dst)[2] = (int8_t)r; \ - ((int8_t*)dst)[1] = (int8_t)g; \ - ((int8_t*)dst)[0] = (int8_t)b; \ - } while (0) - -/* - RGB <=> YUV conversion stuffs. - YUV coversion is explained as following formula in strict meaning: - Y = 0.299R + 0.587G + 0.114B ( 0<=Y<=255) - U = -0.169R - 0.331G + 0.500B (-128<=U<=127) - V = 0.500R - 0.419G - 0.081B (-128<=V<=127) - - I use simple conversion RCT(reversible color transform) which is described - in JPEG-2000 specification. - Y = (R + 2G + B)/4 ( 0<=Y<=255) - U = B-G (-256<=U<=255) - V = R-G (-256<=V<=255) -*/ - -/* RCT is N-bit RGB to N-bit Y and N+1-bit UV. - For make Same N-bit, UV is lossy. - More exact PLHarr, we reduce to odd range(-127<=x<=127). */ -#define ZYWRLE_RGBYUV_(r, g, b, y, u, v, ymask, uvmask) \ - do { \ - y = (r + (g << 1) + b) >> 2; \ - u = b - g; \ - v = r - g; \ - y -= 128; \ - u >>= 1; \ - v >>= 1; \ - y &= ymask; \ - u &= uvmask; \ - v &= uvmask; \ - if (y == -128) { \ - y += (0xFFFFFFFF - ymask + 1); \ - } \ - if (u == -128) { \ - u += (0xFFFFFFFF - uvmask + 1); \ - } \ - if (v == -128) { \ - v += (0xFFFFFFFF - uvmask + 1); \ - } \ - } while (0) - - -/* - coefficient packing/unpacking stuffs. - Wavelet transform makes 4 sub coefficient image from 1 original image. - - model with pyramid decomposition: - +------+------+ - | | | - | L | Hx | - | | | - +------+------+ - | | | - | H | Hxy | - | | | - +------+------+ - - So, we must transfer each sub images individually in strict meaning. - But at least ZRLE meaning, following one decompositon image is same as - avobe individual sub image. I use this format. - (Strictly saying, transfer order is reverse(Hxy->Hy->Hx->L) - for simplified procedure for any wavelet level.) - - +------+------+ - | L | - +------+------+ - | Hx | - +------+------+ - | Hy | - +------+------+ - | Hxy | - +------+------+ -*/ -#define ZYWRLE_INC_PTR(data) \ - do { \ - data++; \ - if( data - p >= (w + uw) ) { \ - data += scanline-(w + uw); \ - p = data; \ - } \ - } while (0) - -#define ZYWRLE_TRANSFER_COEFF(buf, data, t, w, h, scanline, level, TRANS) \ - do { \ - ph = buf; \ - s = 2 << level; \ - if (t & 0x01) { \ - ph += s >> 1; \ - } \ - if (t & 0x02) { \ - ph += (s >> 1) * w; \ - } \ - end = ph + h * w; \ - while (ph < end) { \ - line = ph + w; \ - while (ph < line) { \ - TRANS \ - ZYWRLE_INC_PTR(data); \ - ph += s; \ - } \ - ph += (s - 1) * w; \ - } \ - } while (0) - -#define ZYWRLE_PACK_COEFF(buf, data, t, width, height, scanline, level) \ - ZYWRLE_TRANSFER_COEFF(buf, data, t, width, height, scanline, level, \ - ZYWRLE_LOAD_COEFF(ph, r, g, b); \ - ZYWRLE_SAVE_PIXEL(data, r, g, b);) - -#define ZYWRLE_UNPACK_COEFF(buf, data, t, width, height, scanline, level) \ - ZYWRLE_TRANSFER_COEFF(buf, data, t, width, height, scanline, level, \ - ZYWRLE_LOAD_PIXEL(data, r, g, b); \ - ZYWRLE_SAVE_COEFF(ph, r, g, b);) - -#define ZYWRLE_SAVE_UNALIGN(data, TRANS) \ - do { \ - top = buf + w * h; \ - end = buf + (w + uw) * (h + uh); \ - while (top < end) { \ - TRANS \ - ZYWRLE_INC_PTR(data); \ - top++; \ - } \ - } while (0) - -#define ZYWRLE_LOAD_UNALIGN(data,TRANS) \ - do { \ - top = buf + w * h; \ - if (uw) { \ - p = data + w; \ - end = (int*)(p + h * scanline); \ - while (p < (ZRLE_PIXEL*)end) { \ - line = (int*)(p + uw); \ - while (p < (ZRLE_PIXEL*)line) { \ - TRANS \ - p++; \ - top++; \ - } \ - p += scanline - uw; \ - } \ - } \ - if (uh) { \ - p = data + h * scanline; \ - end = (int*)(p + uh * scanline); \ - while (p < (ZRLE_PIXEL*)end) { \ - line = (int*)(p + w); \ - while (p < (ZRLE_PIXEL*)line) { \ - TRANS \ - p++; \ - top++; \ - } \ - p += scanline - w; \ - } \ - } \ - if (uw && uh) { \ - p= data + w + h * scanline; \ - end = (int*)(p + uh * scanline); \ - while (p < (ZRLE_PIXEL*)end) { \ - line = (int*)(p + uw); \ - while (p < (ZRLE_PIXEL*)line) { \ - TRANS \ - p++; \ - top++; \ - } \ - p += scanline-uw; \ - } \ - } \ - } while (0) - -static inline void zywrle_calc_size(int *w, int *h, int level) -{ - *w &= ~((1 << level) - 1); - *h &= ~((1 << level) - 1); -} - -#endif |