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 to
31  * produce a moderately high quality version of an image with only
32  * an 8-bit (or less) grayramp.  The ordered dithering technique does
33  * not rely on the order in which the pixels are processed so this
34  * file can be used in cases where the ImageProducer has not specified
35  * the TopDownLeftRight delivery hint.  The ordered dither technique
36  * is also much faster than the Floyd-Steinberg error diffusion
37  * algorithm so this implementation would also be appropriate for
38  * cases where performance is critical such as the processing of a
39  * video stream.
40  *
41  * This file can be used to provide the default implementation of the
42  * Encoding macros for grayscale displays.
43  */
44 
45 /*
46  * These definitions vector the standard macro names to the "Gray"
47  * versions of those macros only if the "DitherDeclared" keyword has
48  * not yet been defined elsewhere.  The "DitherDeclared" keyword is
49  * also defined here to claim ownership of the primary implementation
50  * even though this file does not rely on the definitions in any other
51  * files.
52  */
53 #ifndef DitherDeclared
54 #define DitherDeclared
55 #define DeclareDitherVars       DeclareAllGrayDitherVars
56 #define InitDither              InitGrayDither
57 #define StartDitherLine         StartGrayDitherLine
58 #define DitherPixel             GrayDitherPixel
59 #define DitherBufComplete       GrayDitherBufComplete
60 #endif
61 
62 #define DeclareAllGrayDitherVars                                \
63     DeclareGrayDitherVars                                       \
64     int relx, rely;
65 
66 #define DeclareGrayDitherVars                                   \
67     extern unsigned char img_grays[256];                        \
68     extern unsigned char img_bwgamma[256];                      \
69     extern sgn_ordered_dither_array img_oda_gray;
70 
71 #define InitGrayDither(cvdata, clrdata, dstTW)                          \
72     do {} while (0)
73 
74 #define StartGrayDitherLine(cvdata, dstX1, dstY)                        \
75     do {                                                                \
76         relx = dstX1 & 7;                                               \
77         rely = dstY & 7;                                                \
78     } while (0)
79 
80 #define GrayDitherPixel(dstX, dstY, pixel, red, green, blue)            \
81     do {                                                                \
82         green = RGBTOGRAY(red, green, blue);                            \
83         green += img_oda_gray[relx][rely];                              \
84         green = ComponentBound(green);                                  \
85         pixel = img_grays[img_bwgamma[green]];                          \
86         relx = (relx + 1) & 7;                                          \
87     } while (0)
88 
89 #define GrayDitherBufComplete(cvdata, dstX1)                            \
90     do {} while (0)
91