/********************************************************************
 *                                                                  *
 * 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_ENC_ZYWRLE_H
#define VNC_ENC_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
