xref: /qemu/ui/vnc-enc-zywrle-template.c (revision ef99aa2a)
1148954faSCorentin Chary 
2148954faSCorentin Chary /********************************************************************
3148954faSCorentin Chary  *                                                                  *
4148954faSCorentin Chary  * THIS FILE IS PART OF THE 'ZYWRLE' VNC CODEC SOURCE CODE.         *
5148954faSCorentin Chary  *                                                                  *
6148954faSCorentin Chary  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
7148954faSCorentin Chary  * GOVERNED BY A FOLLOWING BSD-STYLE SOURCE LICENSE.                *
8148954faSCorentin Chary  * PLEASE READ THESE TERMS BEFORE DISTRIBUTING.                     *
9148954faSCorentin Chary  *                                                                  *
10148954faSCorentin Chary  * THE 'ZYWRLE' VNC CODEC SOURCE CODE IS (C) COPYRIGHT 2006         *
11148954faSCorentin Chary  * BY Hitachi Systems & Services, Ltd.                              *
12e7d81004SStefan Weil  * (Noriaki Yamazaki, Research & Development Center)               *
13148954faSCorentin Chary  *                                                                  *
14148954faSCorentin Chary  *                                                                  *
15148954faSCorentin Chary  ********************************************************************
16148954faSCorentin Chary Redistribution and use in source and binary forms, with or without
17148954faSCorentin Chary modification, are permitted provided that the following conditions
18148954faSCorentin Chary are met:
19148954faSCorentin Chary 
20148954faSCorentin Chary - Redistributions of source code must retain the above copyright
21148954faSCorentin Chary notice, this list of conditions and the following disclaimer.
22148954faSCorentin Chary 
23148954faSCorentin Chary - Redistributions in binary form must reproduce the above copyright
24148954faSCorentin Chary notice, this list of conditions and the following disclaimer in the
25148954faSCorentin Chary documentation and/or other materials provided with the distribution.
26148954faSCorentin Chary 
27148954faSCorentin Chary - Neither the name of the Hitachi Systems & Services, Ltd. nor
28148954faSCorentin Chary the names of its contributors may be used to endorse or promote
29148954faSCorentin Chary products derived from this software without specific prior written
30148954faSCorentin Chary permission.
31148954faSCorentin Chary 
32148954faSCorentin Chary THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33148954faSCorentin Chary ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34148954faSCorentin Chary LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
35148954faSCorentin Chary A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION
36148954faSCorentin Chary OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37148954faSCorentin Chary SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38148954faSCorentin Chary LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39148954faSCorentin Chary DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40148954faSCorentin Chary THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41148954faSCorentin Chary (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
42148954faSCorentin Chary OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43148954faSCorentin Chary  ********************************************************************/
44148954faSCorentin Chary 
45148954faSCorentin Chary /* Change Log:
46148954faSCorentin Chary      V0.02 : 2008/02/04 : Fix mis encode/decode when width != scanline
47148954faSCorentin Chary                              (Thanks Johannes Schindelin, author of LibVNC
48148954faSCorentin Chary                                                   Server/Client)
49148954faSCorentin Chary      V0.01 : 2007/02/06 : Initial release
50148954faSCorentin Chary */
51148954faSCorentin Chary 
52148954faSCorentin Chary /*
53148954faSCorentin Chary [References]
54148954faSCorentin Chary  PLHarr:
55148954faSCorentin Chary    Senecal, J. G., P. Lindstrom, M. A. Duchaineau, and K. I. Joy,
56148954faSCorentin Chary    "An Improved N-Bit to N-Bit Reversible Haar-Like Transform,"
57148954faSCorentin Chary    Pacific Graphics 2004, October 2004, pp. 371-380.
58148954faSCorentin Chary  EZW:
59148954faSCorentin Chary    Shapiro, JM: Embedded Image Coding Using Zerotrees of Wavelet Coefficients,
60148954faSCorentin Chary    IEEE Trans. Signal. Process., Vol.41, pp.3445-3462 (1993).
61148954faSCorentin Chary */
62148954faSCorentin Chary 
63148954faSCorentin Chary 
64148954faSCorentin Chary /* Template Macro stuffs. */
65148954faSCorentin Chary #undef ZYWRLE_ANALYZE
66148954faSCorentin Chary #undef ZYWRLE_SYNTHESIZE
67148954faSCorentin Chary 
68148954faSCorentin Chary #define ZYWRLE_SUFFIX     ZRLE_CONCAT2(ZRLE_BPP,ZRLE_ENDIAN_SUFFIX)
69148954faSCorentin Chary 
70148954faSCorentin Chary #define ZYWRLE_ANALYZE    ZRLE_CONCAT2(zywrle_analyze_,   ZYWRLE_SUFFIX)
71148954faSCorentin Chary #define ZYWRLE_SYNTHESIZE ZRLE_CONCAT2(zywrle_synthesize_,ZYWRLE_SUFFIX)
72148954faSCorentin Chary 
73148954faSCorentin Chary #define ZYWRLE_RGBYUV     ZRLE_CONCAT2(zywrle_rgbyuv_,    ZYWRLE_SUFFIX)
74148954faSCorentin Chary #define ZYWRLE_YUVRGB     ZRLE_CONCAT2(zywrle_yuvrgb_,    ZYWRLE_SUFFIX)
75148954faSCorentin Chary #define ZYWRLE_YMASK      ZRLE_CONCAT2(ZYWRLE_YMASK,      ZRLE_BPP)
76148954faSCorentin Chary #define ZYWRLE_UVMASK     ZRLE_CONCAT2(ZYWRLE_UVMASK,     ZRLE_BPP)
77148954faSCorentin Chary #define ZYWRLE_LOAD_PIXEL ZRLE_CONCAT2(ZYWRLE_LOAD_PIXEL, ZRLE_BPP)
78148954faSCorentin Chary #define ZYWRLE_SAVE_PIXEL ZRLE_CONCAT2(ZYWRLE_SAVE_PIXEL, ZRLE_BPP)
79148954faSCorentin Chary 
80148954faSCorentin Chary /* Packing/Unpacking pixel stuffs.
81148954faSCorentin Chary    Endian conversion stuffs. */
82148954faSCorentin Chary #undef S_0
83148954faSCorentin Chary #undef S_1
84148954faSCorentin Chary #undef L_0
85148954faSCorentin Chary #undef L_1
86148954faSCorentin Chary #undef L_2
87148954faSCorentin Chary 
88148954faSCorentin Chary #if ZYWRLE_ENDIAN == ENDIAN_BIG
89148954faSCorentin Chary #  define S_0   1
90148954faSCorentin Chary #  define S_1   0
91148954faSCorentin Chary #  define L_0   3
92148954faSCorentin Chary #  define L_1   2
93148954faSCorentin Chary #  define L_2   1
94148954faSCorentin Chary #else
95148954faSCorentin Chary #  define S_0   0
96148954faSCorentin Chary #  define S_1   1
97148954faSCorentin Chary #  define L_0   0
98148954faSCorentin Chary #  define L_1   1
99148954faSCorentin Chary #  define L_2   2
100148954faSCorentin Chary #endif
101148954faSCorentin Chary 
102148954faSCorentin Chary #define ZYWRLE_QUANTIZE
103*e16f4c87SPeter Maydell #include "qemu/osdep.h"
104148954faSCorentin Chary #include "vnc-enc-zywrle.h"
105148954faSCorentin Chary 
106148954faSCorentin Chary #ifndef ZRLE_COMPACT_PIXEL
ZYWRLE_RGBYUV(int * buf,ZRLE_PIXEL * data,int width,int height,int scanline)107148954faSCorentin Chary static inline void ZYWRLE_RGBYUV(int *buf, ZRLE_PIXEL *data,
108148954faSCorentin Chary                                  int width, int height, int scanline)
109148954faSCorentin Chary {
110148954faSCorentin Chary     int r, g, b;
111148954faSCorentin Chary     int y, u, v;
112148954faSCorentin Chary     int *line;
113148954faSCorentin Chary     int *end;
114148954faSCorentin Chary 
115148954faSCorentin Chary     end = buf + height * width;
116148954faSCorentin Chary     while (buf < end) {
117148954faSCorentin Chary         line = buf + width;
118148954faSCorentin Chary         while (buf < line) {
119148954faSCorentin Chary             ZYWRLE_LOAD_PIXEL(data, r, g, b);
120148954faSCorentin Chary             ZYWRLE_RGBYUV_(r, g, b, y, u, v, ZYWRLE_YMASK, ZYWRLE_UVMASK);
121148954faSCorentin Chary             ZYWRLE_SAVE_COEFF(buf, v, y, u);
122148954faSCorentin Chary             buf++;
123148954faSCorentin Chary             data++;
124148954faSCorentin Chary         }
125148954faSCorentin Chary         data += scanline - width;
126148954faSCorentin Chary     }
127148954faSCorentin Chary }
128148954faSCorentin Chary 
ZYWRLE_ANALYZE(ZRLE_PIXEL * dst,ZRLE_PIXEL * src,int w,int h,int scanline,int level,int * buf)129148954faSCorentin Chary static ZRLE_PIXEL *ZYWRLE_ANALYZE(ZRLE_PIXEL *dst, ZRLE_PIXEL *src,
130148954faSCorentin Chary                                   int w, int h, int scanline, int level,
131148954faSCorentin Chary                                   int *buf) {
132148954faSCorentin Chary     int l;
133148954faSCorentin Chary     int uw = w;
134148954faSCorentin Chary     int uh = h;
135148954faSCorentin Chary     int *top;
136148954faSCorentin Chary     int *end;
137148954faSCorentin Chary     int *line;
138148954faSCorentin Chary     ZRLE_PIXEL *p;
139148954faSCorentin Chary     int r, g, b;
140148954faSCorentin Chary     int s;
141148954faSCorentin Chary     int *ph;
142148954faSCorentin Chary 
143148954faSCorentin Chary     zywrle_calc_size(&w, &h, level);
144148954faSCorentin Chary 
145148954faSCorentin Chary     if (w == 0 || h == 0) {
146148954faSCorentin Chary         return NULL;
147148954faSCorentin Chary     }
148148954faSCorentin Chary     uw -= w;
149148954faSCorentin Chary     uh -= h;
150148954faSCorentin Chary 
151148954faSCorentin Chary     p = dst;
152148954faSCorentin Chary     ZYWRLE_LOAD_UNALIGN(src,*(ZRLE_PIXEL*)top = *p;);
153148954faSCorentin Chary     ZYWRLE_RGBYUV(buf, src, w, h, scanline);
154148954faSCorentin Chary     wavelet(buf, w, h, level);
155148954faSCorentin Chary     for (l = 0; l < level; l++) {
156148954faSCorentin Chary         ZYWRLE_PACK_COEFF(buf, dst, 3, w, h, scanline, l);
157148954faSCorentin Chary         ZYWRLE_PACK_COEFF(buf, dst, 2, w, h, scanline, l);
158148954faSCorentin Chary         ZYWRLE_PACK_COEFF(buf, dst, 1, w, h, scanline, l);
159148954faSCorentin Chary         if (l == level - 1) {
160148954faSCorentin Chary             ZYWRLE_PACK_COEFF(buf, dst, 0, w, h, scanline, l);
161148954faSCorentin Chary         }
162148954faSCorentin Chary     }
163148954faSCorentin Chary     ZYWRLE_SAVE_UNALIGN(dst,*dst = *(ZRLE_PIXEL*)top;);
164148954faSCorentin Chary     return dst;
165148954faSCorentin Chary }
166148954faSCorentin Chary #endif  /* ZRLE_COMPACT_PIXEL */
167148954faSCorentin Chary 
168148954faSCorentin Chary #undef ZYWRLE_RGBYUV
169148954faSCorentin Chary #undef ZYWRLE_YUVRGB
170148954faSCorentin Chary #undef ZYWRLE_LOAD_PIXEL
171148954faSCorentin Chary #undef ZYWRLE_SAVE_PIXEL
172