1 /*
2 * Copyright (c) 2001, 2004, 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 #include <string.h>
27 #include <stdio.h>
28 #include "AnyByte.h"
29 #include "Index8Gray.h"
30 #include "AlphaMacros.h"
31
32 #include "IntArgb.h"
33 #include "IntArgbPre.h"
34 #include "IntRgb.h"
35 #include "ThreeByteBgr.h"
36 #include "ByteGray.h"
37 #include "ByteIndexed.h"
38 #include "Index12Gray.h"
39
40 /*
41 * This file declares, registers, and defines the various graphics
42 * primitive loops to manipulate surfaces of type "Index8Gray".
43 *
44 * See also LoopMacros.h
45 */
46
47 RegisterFunc RegisterIndex8Gray;
48
49 DECLARE_CONVERT_BLIT(IntArgb, Index8Gray);
50 DECLARE_CONVERT_BLIT(ThreeByteBgr, Index8Gray);
51 DECLARE_CONVERT_BLIT(ByteGray, Index8Gray);
52 DECLARE_CONVERT_BLIT(Index12Gray, Index8Gray);
53 DECLARE_CONVERT_BLIT(ByteIndexed, Index8Gray);
54 DECLARE_CONVERT_BLIT(Index8Gray, Index8Gray);
55
56 DECLARE_SCALE_BLIT(Index8Gray, Index8Gray);
57 DECLARE_SCALE_BLIT(IntArgb, Index8Gray);
58 DECLARE_SCALE_BLIT(ThreeByteBgr, Index8Gray);
59 DECLARE_SCALE_BLIT(UshortGray, Index8Gray);
60 DECLARE_SCALE_BLIT(ByteIndexed, Index8Gray);
61 DECLARE_SCALE_BLIT(ByteGray, Index8Gray);
62 DECLARE_SCALE_BLIT(Index12Gray, Index8Gray);
63
64 DECLARE_XPAR_CONVERT_BLIT(ByteIndexedBm, Index8Gray);
65 DECLARE_XPAR_BLITBG(ByteIndexedBm, Index8Gray);
66
67 DECLARE_XOR_BLIT(IntArgb, Index8Gray);
68 DECLARE_ALPHA_MASKFILL(Index8Gray);
69 DECLARE_ALPHA_MASKBLIT(IntArgb, Index8Gray);
70 DECLARE_ALPHA_MASKBLIT(IntArgbPre, Index8Gray);
71 DECLARE_ALPHA_MASKBLIT(IntRgb, Index8Gray);
72 DECLARE_SRCOVER_MASKFILL(Index8Gray);
73 DECLARE_SRCOVER_MASKBLIT(IntArgb, Index8Gray);
74 DECLARE_SRCOVER_MASKBLIT(IntArgbPre, Index8Gray);
75 DECLARE_SOLID_DRAWGLYPHLISTAA(Index8Gray);
76
77 DECLARE_TRANSFORMHELPER_FUNCS(Index8Gray);
78
79 NativePrimitive Index8GrayPrimitives[] = {
80 REGISTER_CONVERT_BLIT(IntArgb, Index8Gray),
81 REGISTER_CONVERT_BLIT_EQUIV(IntRgb, Index8Gray,
82 NAME_CONVERT_BLIT(IntArgb, Index8Gray)),
83 REGISTER_CONVERT_BLIT(ThreeByteBgr, Index8Gray),
84 REGISTER_CONVERT_BLIT(ByteGray, Index8Gray),
85 REGISTER_CONVERT_BLIT(Index12Gray, Index8Gray),
86 REGISTER_CONVERT_BLIT_FLAGS(Index8Gray, Index8Gray,
87 SD_LOCK_LUT,
88 SD_LOCK_LUT | SD_LOCK_INVGRAY),
89 REGISTER_CONVERT_BLIT(ByteIndexed, Index8Gray),
90
91 REGISTER_SCALE_BLIT(IntArgb, Index8Gray),
92 REGISTER_SCALE_BLIT_EQUIV(IntRgb, Index8Gray,
93 NAME_SCALE_BLIT(IntArgb, Index8Gray)),
94 REGISTER_SCALE_BLIT(ThreeByteBgr, Index8Gray),
95 REGISTER_SCALE_BLIT(UshortGray, Index8Gray),
96 REGISTER_SCALE_BLIT(ByteIndexed, Index8Gray),
97 REGISTER_SCALE_BLIT(ByteGray, Index8Gray),
98 REGISTER_SCALE_BLIT(Index12Gray, Index8Gray),
99 REGISTER_SCALE_BLIT_FLAGS(Index8Gray, Index8Gray, 0,
100 SD_LOCK_LUT | SD_LOCK_INVGRAY),
101
102 REGISTER_XPAR_CONVERT_BLIT(ByteIndexedBm, Index8Gray),
103 REGISTER_XPAR_BLITBG(ByteIndexedBm, Index8Gray),
104
105 REGISTER_XOR_BLIT(IntArgb, Index8Gray),
106 REGISTER_ALPHA_MASKFILL(Index8Gray),
107 REGISTER_ALPHA_MASKBLIT(IntArgb, Index8Gray),
108 REGISTER_ALPHA_MASKBLIT(IntArgbPre, Index8Gray),
109 REGISTER_ALPHA_MASKBLIT(IntRgb, Index8Gray),
110 REGISTER_SRCOVER_MASKFILL(Index8Gray),
111 REGISTER_SRCOVER_MASKBLIT(IntArgb, Index8Gray),
112 REGISTER_SRCOVER_MASKBLIT(IntArgbPre, Index8Gray),
113 REGISTER_SOLID_DRAWGLYPHLISTAA(Index8Gray),
114
115 REGISTER_TRANSFORMHELPER_FUNCS(Index8Gray),
116 };
117
118 extern jboolean checkSameLut(jint *SrcReadLut, jint *DstReadLut,
119 SurfaceDataRasInfo *pSrcInfo,
120 SurfaceDataRasInfo *pDstInfo);
121
RegisterIndex8Gray(JNIEnv * env)122 jboolean RegisterIndex8Gray(JNIEnv *env)
123 {
124 return RegisterPrimitives(env, Index8GrayPrimitives,
125 ArraySize(Index8GrayPrimitives));
126 }
127
PixelForIndex8Gray(SurfaceDataRasInfo * pRasInfo,jint rgb)128 jint PixelForIndex8Gray(SurfaceDataRasInfo *pRasInfo, jint rgb)
129 {
130 jint r, g, b, gray;
131 ExtractIntDcmComponentsX123(rgb, r, g, b);
132 gray = ComposeByteGrayFrom3ByteRgb(r, g, b);
133 return pRasInfo->invGrayTable[gray];
134 }
135
136 DEFINE_CONVERT_BLIT(IntArgb, Index8Gray, 3ByteRgb)
137
138 DEFINE_CONVERT_BLIT(ThreeByteBgr, Index8Gray, 3ByteRgb)
139
140 DEFINE_CONVERT_BLIT(ByteGray, Index8Gray, 1ByteGray)
141
142 DEFINE_CONVERT_BLIT(Index12Gray, Index8Gray, 1ByteGray)
143
DEFINE_CONVERT_BLIT_LUT8(ByteIndexed,Index8Gray,PreProcessLut)144 DEFINE_CONVERT_BLIT_LUT8(ByteIndexed, Index8Gray, PreProcessLut)
145
146 void NAME_CONVERT_BLIT(Index8Gray, Index8Gray)
147 (void *srcBase, void *dstBase,
148 juint width, juint height,
149 SurfaceDataRasInfo *pSrcInfo,
150 SurfaceDataRasInfo *pDstInfo,
151 NativePrimitive *pPrim,
152 CompositeInfo *pCompInfo)
153 {
154 DeclareIndex8GrayLoadVars(SrcRead)
155 DeclareIndex8GrayLoadVars(DstRead)
156 jint srcScan = pSrcInfo->scanStride;
157 jint dstScan = pDstInfo->scanStride;
158
159 InitIndex8GrayLoadVars(SrcRead, pSrcInfo);
160 InitIndex8GrayLoadVars(DstRead, pDstInfo);
161
162 if (checkSameLut(SrcReadLut, DstReadLut, pSrcInfo, pDstInfo)) {
163 do {
164 memcpy(dstBase, srcBase, width);
165 srcBase = PtrAddBytes(srcBase, srcScan);
166 dstBase = PtrAddBytes(dstBase, dstScan);
167 } while (--height > 0);
168 } else {
169 DeclareIndex8GrayStoreVars(DstWrite);
170 InitIndex8GrayStoreVarsY(DstWrite, pDstInfo);
171
172 BlitLoopWidthHeight(Index8Gray, pSrc, srcBase, pSrcInfo,
173 Index8Gray, pDst, dstBase, pDstInfo, DstWrite,
174 width, height,
175 ConvertVia1ByteGray
176 (pSrc, Index8Gray, SrcRead,
177 pDst, Index8Gray, DstWrite, 0, 0));
178 }
179 }
180
NAME_SCALE_BLIT(Index8Gray,Index8Gray)181 void NAME_SCALE_BLIT(Index8Gray, Index8Gray)
182 (void *srcBase, void *dstBase,
183 juint width, juint height,
184 jint sxloc, jint syloc,
185 jint sxinc, jint syinc, jint shift,
186 SurfaceDataRasInfo *pSrcInfo,
187 SurfaceDataRasInfo *pDstInfo,
188 NativePrimitive *pPrim,
189 CompositeInfo *pCompInfo)
190 {
191 DeclareIndex8GrayLoadVars(SrcRead)
192 DeclareIndex8GrayLoadVars(DstRead)
193 jint srcScan = pSrcInfo->scanStride;
194 jint dstScan = pDstInfo->scanStride;
195 DeclareIndex8GrayStoreVars(DstWrite)
196
197 InitIndex8GrayLoadVars(SrcRead, pSrcInfo);
198 InitIndex8GrayLoadVars(DstRead, pDstInfo);
199
200 if (checkSameLut(SrcReadLut, DstReadLut, pSrcInfo, pDstInfo)) {
201 BlitLoopScaleWidthHeight(Index8Gray, pSrc, srcBase, pSrcInfo,
202 Index8Gray, pDst, dstBase, pDstInfo, DstWrite,
203 x, width, height,
204 sxloc, syloc, sxinc, syinc, shift,
205 pDst[0] = pSrc[x]);
206 } else {
207 DeclareIndex8GrayStoreVars(DstWrite);
208 InitIndex8GrayStoreVarsY(DstWrite, pDstInfo);
209 BlitLoopScaleWidthHeight(Index8Gray, pSrc, srcBase, pSrcInfo,
210 Index8Gray, pDst, dstBase, pDstInfo, DstWrite,
211 x, width, height,
212 sxloc, syloc, sxinc, syinc, shift,
213 ConvertVia1ByteGray(pSrc, Index8Gray, SrcRead,
214 pDst, Index8Gray, DstWrite,
215 x, 0));
216 }
217 }
218
219 DEFINE_SCALE_BLIT(IntArgb, Index8Gray, 3ByteRgb)
220
221 DEFINE_SCALE_BLIT(ThreeByteBgr, Index8Gray, 3ByteRgb)
222
223 DEFINE_SCALE_BLIT(UshortGray, Index8Gray, 1ByteGray)
224
225 DEFINE_SCALE_BLIT_LUT8(ByteIndexed, Index8Gray, PreProcessLut)
226
227 DEFINE_SCALE_BLIT(ByteGray, Index8Gray, 1ByteGray)
228
229 DEFINE_SCALE_BLIT(Index12Gray, Index8Gray, 1ByteGray)
230
231 DEFINE_XPAR_CONVERT_BLIT_LUT8(ByteIndexedBm, Index8Gray, PreProcessLut)
232
233 DEFINE_XPAR_BLITBG_LUT8(ByteIndexedBm, Index8Gray, PreProcessLut)
234
235 DEFINE_XOR_BLIT(IntArgb, Index8Gray, AnyByte)
236
237 DEFINE_ALPHA_MASKFILL(Index8Gray, 1ByteGray)
238
239 DEFINE_ALPHA_MASKBLIT(IntArgb, Index8Gray, 1ByteGray)
240
241 DEFINE_ALPHA_MASKBLIT(IntArgbPre, Index8Gray, 1ByteGray)
242
243 DEFINE_ALPHA_MASKBLIT(IntRgb, Index8Gray, 1ByteGray)
244
245 DEFINE_SRCOVER_MASKFILL(Index8Gray, 1ByteGray)
246
247 DEFINE_SRCOVER_MASKBLIT(IntArgb, Index8Gray, 1ByteGray)
248
249 DEFINE_SRCOVER_MASKBLIT(IntArgbPre, Index8Gray, 1ByteGray)
250
251 DEFINE_SOLID_DRAWGLYPHLISTAA(Index8Gray, 1ByteGray)
252
253 DEFINE_TRANSFORMHELPERS(Index8Gray)
254