1 /*
2  * Copyright (c) 1996, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /*
27  * This file contains macro definitions for the Encoding category of
28  * the macros used by the generic scaleloop function.
29  *
30  * This implementation uses an ordered dithering error matrix with
31  * signed error adjustments to produce a moderately high quality
32  * version of an image with only an 8-bit (or less) RGB colormap and
33  * a "closest color" lookup table.  The ordered dithering technique
34  * does not rely on the order in which the pixels are processed so
35  * this file can be used in cases where the ImageProducer has not
36  * specified the TopDownLeftRight delivery hint.  The ordered dither
37  * technique is also much faster than the Floyd-Steinberg error diffusion
38  * algorithm so this implementation would also be appropriate for
39  * cases where performance is critical such as the processing of a
40  * video stream.
41  *
42  * This file can be used to provide the default implementation of the
43  * Encoding macros for RGB colormapped displays.
44  */
45 
46 /*
47  * These definitions vector the standard macro names to the "Color"
48  * versions of those macros only if the "DitherDeclared" keyword has
49  * not yet been defined elsewhere.  The "DitherDeclared" keyword is
50  * also defined here to claim ownership of the primary implementation
51  * even though this file does not rely on the definitions in any other
52  * files.
53  */
54 #ifndef DitherDeclared
55 #define DitherDeclared
56 #define DeclareDitherVars       DeclareAllColorDitherVars
57 #define InitDither              InitColorDither
58 #define StartDitherLine         StartColorDitherLine
59 #define DitherPixel             ColorDitherPixel
60 #define DitherBufComplete       ColorDitherBufComplete
61 #endif
62 
63 #define DeclareAllColorDitherVars                       \
64     DeclareColorDitherVars                              \
65     int relx, rely;
66 
67 #define DeclareColorDitherVars                          \
68     extern sgn_ordered_dither_array img_oda_red;        \
69     extern sgn_ordered_dither_array img_oda_green;      \
70     extern sgn_ordered_dither_array img_oda_blue;
71 
72 #define InitColorDither(cvdata, clrdata, dstTW)                 \
73     do {} while (0)
74 
75 #define StartColorDitherLine(cvdata, dstX1, dstY)               \
76     do {                                                        \
77         relx = dstX1 & 7;                                       \
78         rely = dstY & 7;                                        \
79     } while (0)
80 
81 #define ColorDitherPixel(dstX, dstY, pixel, red, green, blue)   \
82     do {                                                        \
83         red += img_oda_red[relx][rely];                         \
84         red = ComponentBound(red);                              \
85         green += img_oda_green[relx][rely];                     \
86         green = ComponentBound(green);                          \
87         blue += img_oda_blue[relx][rely];                       \
88         blue = ComponentBound(blue);                            \
89         pixel = ColorCubeOrdMapSgn(red, green, blue);           \
90         relx = (relx + 1) & 7;                                  \
91     } while (0)
92 
93 #define ColorDitherBufComplete(cvdata, dstX1)                   \
94     do {} while (0)
95