1/*
2 * Copyright (c) 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
28#include "AnyByte.h"
29#include "UshortIndexed.h"
30#include "AlphaMacros.h"
31
32#include "IntArgb.h"
33#include "IntArgbBm.h"
34#include "IntArgbPre.h"
35#include "IntRgb.h"
36#include "ThreeByteBgr.h"
37#include "ByteGray.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 "UshortIndexed".
43 *
44 * See also LoopMacros.h
45 */
46
47RegisterFunc RegisterUshortIndexed;
48
49DECLARE_CONVERT_BLIT(IntArgb, UshortIndexed);
50DECLARE_CONVERT_BLIT(ThreeByteBgr, UshortIndexed);
51DECLARE_CONVERT_BLIT(ByteGray, UshortIndexed);
52DECLARE_CONVERT_BLIT(UshortIndexed, UshortIndexed);
53DECLARE_CONVERT_BLIT(Index12Gray, UshortIndexed);
54DECLARE_CONVERT_BLIT(UshortIndexed, IntArgb);
55DECLARE_SCALE_BLIT(IntArgb, UshortIndexed);
56DECLARE_SCALE_BLIT(ThreeByteBgr, UshortIndexed);
57DECLARE_SCALE_BLIT(ByteGray, UshortIndexed);
58DECLARE_SCALE_BLIT(Index12Gray, UshortIndexed);
59DECLARE_SCALE_BLIT(UshortIndexed, UshortIndexed);
60DECLARE_SCALE_BLIT(UshortIndexed, IntArgb);
61DECLARE_XPAR_CONVERT_BLIT(ByteIndexedBm, UshortIndexed);
62DECLARE_XPAR_SCALE_BLIT(ByteIndexedBm, UshortIndexed);
63DECLARE_XPAR_SCALE_BLIT(IntArgbBm, UshortIndexed);
64DECLARE_XPAR_BLITBG(ByteIndexedBm, UshortIndexed);
65DECLARE_XPAR_CONVERT_BLIT(IntArgbBm, UshortIndexed);
66DECLARE_XPAR_BLITBG(IntArgbBm, UshortIndexed);
67
68DECLARE_XOR_BLIT(IntArgb, UshortIndexed);
69DECLARE_ALPHA_MASKFILL(UshortIndexed);
70DECLARE_ALPHA_MASKBLIT(IntArgb, UshortIndexed);
71DECLARE_ALPHA_MASKBLIT(IntArgbPre, UshortIndexed);
72DECLARE_ALPHA_MASKBLIT(IntRgb, UshortIndexed);
73DECLARE_SOLID_DRAWGLYPHLISTAA(UshortIndexed);
74
75NativePrimitive UshortIndexedPrimitives[] = {
76 REGISTER_CONVERT_BLIT(IntArgb, UshortIndexed),
77 REGISTER_CONVERT_BLIT_EQUIV(IntRgb, UshortIndexed,
78 NAME_CONVERT_BLIT(IntArgb, UshortIndexed)),
79 REGISTER_CONVERT_BLIT_EQUIV(IntArgbBm, UshortIndexed,
80 NAME_CONVERT_BLIT(IntArgb, UshortIndexed)),
81 REGISTER_CONVERT_BLIT(ThreeByteBgr, UshortIndexed),
82 REGISTER_CONVERT_BLIT(ByteGray, UshortIndexed),
83 REGISTER_CONVERT_BLIT(Index12Gray, UshortIndexed),
84 REGISTER_CONVERT_BLIT_FLAGS(UshortIndexed, UshortIndexed, 0, SD_LOCK_LUT),
85 REGISTER_CONVERT_BLIT(UshortIndexed, IntArgb),
86 REGISTER_CONVERT_BLIT_EQUIV(UshortIndexed, IntRgb,
87 NAME_CONVERT_BLIT(UshortIndexed, IntArgb)),
88 REGISTER_SCALE_BLIT(IntArgb, UshortIndexed),
89 REGISTER_SCALE_BLIT_EQUIV(IntRgb, UshortIndexed,
90 NAME_SCALE_BLIT(IntArgb, UshortIndexed)),
91 REGISTER_SCALE_BLIT_EQUIV(IntArgbBm, UshortIndexed,
92 NAME_SCALE_BLIT(IntArgb, UshortIndexed)),
93 REGISTER_SCALE_BLIT(ThreeByteBgr, UshortIndexed),
94 REGISTER_SCALE_BLIT(ByteGray, UshortIndexed),
95 REGISTER_SCALE_BLIT(Index12Gray, UshortIndexed),
96 REGISTER_SCALE_BLIT_FLAGS(UshortIndexed, UshortIndexed, 0, SD_LOCK_LUT),
97 REGISTER_SCALE_BLIT(UshortIndexed, IntArgb),
98 REGISTER_SCALE_BLIT_EQUIV(UshortIndexed, IntRgb,
99 NAME_SCALE_BLIT(UshortIndexed, IntArgb)),
100 REGISTER_XPAR_CONVERT_BLIT(ByteIndexedBm, UshortIndexed),
101 REGISTER_XPAR_SCALE_BLIT(ByteIndexedBm, UshortIndexed),
102 REGISTER_XPAR_SCALE_BLIT(IntArgbBm, UshortIndexed),
103 REGISTER_XPAR_BLITBG(ByteIndexedBm, UshortIndexed),
104 REGISTER_XPAR_CONVERT_BLIT(IntArgbBm, UshortIndexed),
105 REGISTER_XPAR_BLITBG(IntArgbBm, UshortIndexed),
106
107 REGISTER_XOR_BLIT(IntArgb, UshortIndexed),
108 REGISTER_ALPHA_MASKFILL(UshortIndexed),
109 REGISTER_ALPHA_MASKBLIT(IntArgb, UshortIndexed),
110 REGISTER_ALPHA_MASKBLIT(IntArgbPre, UshortIndexed),
111 REGISTER_ALPHA_MASKBLIT(IntRgb, UshortIndexed),
112 REGISTER_SOLID_DRAWGLYPHLISTAA(UshortIndexed),
113};
114
115extern jint PixelForByteIndexed(SurfaceDataRasInfo *pRasInfo, jint rgb);
116extern jboolean checkSameLut(jint *SrcReadLut, jint *DstReadLut,
117 SurfaceDataRasInfo *pSrcInfo,
118 SurfaceDataRasInfo *pDstInfo);
119
120jboolean RegisterUshortIndexed(JNIEnv *env)
121{
122 return RegisterPrimitives(env, UshortIndexedPrimitives,
123 ArraySize(UshortIndexedPrimitives));
124}
125
126jint PixelForUshortIndexed(SurfaceDataRasInfo *pRasInfo, jint rgb)
127{
128 return PixelForByteIndexed(pRasInfo, rgb);
129}
130
131
132DEFINE_CONVERT_BLIT(IntArgb, UshortIndexed, 3ByteRgb)
133
134DEFINE_CONVERT_BLIT(ThreeByteBgr, UshortIndexed, 3ByteRgb)
135
136DEFINE_CONVERT_BLIT(ByteGray, UshortIndexed, 3ByteRgb)
137
138DEFINE_CONVERT_BLIT(Index12Gray, UshortIndexed, 3ByteRgb)
139
140DEFINE_CONVERT_BLIT_LUT(UshortIndexed, IntArgb, ConvertOnTheFly)
141
142DEFINE_SCALE_BLIT_LUT(UshortIndexed, IntArgb, ConvertOnTheFly)
143
144void NAME_CONVERT_BLIT(UshortIndexed, UshortIndexed)
145 (void *srcBase, void *dstBase,
146 juint width, juint height,
147 SurfaceDataRasInfo *pSrcInfo,
148 SurfaceDataRasInfo *pDstInfo,
149 NativePrimitive *pPrim,
150 CompositeInfo *pCompInfo)
151{
152 DeclareUshortIndexedLoadVars(SrcRead)
153 DeclareUshortIndexedLoadVars(DstRead)
154 jint srcScan = pSrcInfo->scanStride;
155 jint dstScan = pDstInfo->scanStride;
156 jint bytesToCopy = width * pDstInfo->pixelStride;
157
158 InitUshortIndexedLoadVars(SrcRead, pSrcInfo);
159 InitUshortIndexedLoadVars(DstRead, pDstInfo);
160
161 if (checkSameLut(SrcReadLut, DstReadLut, pSrcInfo, pDstInfo)) {
162 do {
163 memcpy(dstBase, srcBase, bytesToCopy);
164 srcBase = PtrAddBytes(srcBase, srcScan);
165 dstBase = PtrAddBytes(dstBase, dstScan);
166 } while (--height > 0);
167 } else {
168 DeclareUshortIndexedStoreVars(DstWrite);
169
170 BlitLoopWidthHeight(UshortIndexed, pSrc, srcBase, pSrcInfo,
171 UshortIndexed, pDst, dstBase, pDstInfo, DstWrite,
172 width, height,
173 ConvertVia3ByteRgb
174 (pSrc, UshortIndexed, SrcRead,
175 pDst, UshortIndexed, DstWrite, 0, 0));
176 }
177}
178
179DEFINE_SCALE_BLIT(IntArgb, UshortIndexed, 3ByteRgb)
180
181DEFINE_SCALE_BLIT(ThreeByteBgr, UshortIndexed, 3ByteRgb)
182
183DEFINE_SCALE_BLIT(ByteGray, UshortIndexed, 3ByteRgb)
184
185DEFINE_SCALE_BLIT(Index12Gray, UshortIndexed, 3ByteRgb)
186
187void NAME_SCALE_BLIT(UshortIndexed, UshortIndexed)
188 (void *srcBase, void *dstBase,
189 juint width, juint height,
190 jint sxloc, jint syloc,
191 jint sxinc, jint syinc, jint shift,
192 SurfaceDataRasInfo *pSrcInfo,
193 SurfaceDataRasInfo *pDstInfo,
194 NativePrimitive *pPrim,
195 CompositeInfo *pCompInfo)
196{
197 DeclareUshortIndexedLoadVars(SrcRead)
198 DeclareUshortIndexedLoadVars(DstRead)
199 jint srcScan = pSrcInfo->scanStride;
200 jint dstScan = pDstInfo->scanStride;
201 DeclareUshortIndexedStoreVars(DstWrite)
202
203 InitUshortIndexedLoadVars(SrcRead, pSrcInfo);
204 InitUshortIndexedLoadVars(DstRead, pDstInfo);
205
206 if (checkSameLut(SrcReadLut, DstReadLut, pSrcInfo, pDstInfo)) {
207 BlitLoopScaleWidthHeight(UshortIndexed, pSrc, srcBase, pSrcInfo,
208 UshortIndexed, pDst, dstBase, pDstInfo, DstWrite,
209 x, width, height,
210 sxloc, syloc, sxinc, syinc, shift,
211 pDst[0] = pSrc[x]);
212 } else {
213 BlitLoopScaleWidthHeight(UshortIndexed, pSrc, srcBase, pSrcInfo,
214 UshortIndexed, pDst, dstBase, pDstInfo, DstWrite,
215 x, width, height,
216 sxloc, syloc, sxinc, syinc, shift,
217 ConvertVia3ByteRgb(pSrc, UshortIndexed, SrcRead,
218 pDst, UshortIndexed, DstWrite,
219 x, 0));
220 }
221}
222
223DEFINE_XPAR_CONVERT_BLIT_LUT(ByteIndexedBm, UshortIndexed, ConvertOnTheFly)
224
225DEFINE_XPAR_SCALE_BLIT_LUT(ByteIndexedBm, UshortIndexed, ConvertOnTheFly)
226
227DEFINE_XPAR_SCALE_BLIT(IntArgbBm, UshortIndexed, 1IntRgb)
228
229DEFINE_XPAR_BLITBG_LUT(ByteIndexedBm, UshortIndexed, ConvertOnTheFly)
230
231DEFINE_XPAR_CONVERT_BLIT(IntArgbBm, UshortIndexed, 1IntRgb)
232
233DEFINE_XPAR_BLITBG(IntArgbBm, UshortIndexed, 1IntRgb)
234
235DEFINE_XOR_BLIT(IntArgb, UshortIndexed, AnyByte)
236
237DEFINE_ALPHA_MASKFILL(UshortIndexed, 4ByteArgb)
238
239DEFINE_ALPHA_MASKBLIT(IntArgb, UshortIndexed, 4ByteArgb)
240
241DEFINE_ALPHA_MASKBLIT(IntArgbPre, UshortIndexed, 4ByteArgb)
242
243DEFINE_ALPHA_MASKBLIT(IntRgb, UshortIndexed, 4ByteArgb)
244
245DEFINE_SOLID_DRAWGLYPHLISTAA(UshortIndexed, 3ByteRgb)
246