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 
47 RegisterFunc RegisterUshortIndexed;
48 
49 DECLARE_CONVERT_BLIT(IntArgb, UshortIndexed);
50 DECLARE_CONVERT_BLIT(ThreeByteBgr, UshortIndexed);
51 DECLARE_CONVERT_BLIT(ByteGray, UshortIndexed);
52 DECLARE_CONVERT_BLIT(UshortIndexed, UshortIndexed);
53 DECLARE_CONVERT_BLIT(Index12Gray, UshortIndexed);
54 DECLARE_CONVERT_BLIT(UshortIndexed, IntArgb);
55 DECLARE_SCALE_BLIT(IntArgb, UshortIndexed);
56 DECLARE_SCALE_BLIT(ThreeByteBgr, UshortIndexed);
57 DECLARE_SCALE_BLIT(ByteGray, UshortIndexed);
58 DECLARE_SCALE_BLIT(Index12Gray, UshortIndexed);
59 DECLARE_SCALE_BLIT(UshortIndexed, UshortIndexed);
60 DECLARE_SCALE_BLIT(UshortIndexed, IntArgb);
61 DECLARE_XPAR_CONVERT_BLIT(ByteIndexedBm, UshortIndexed);
62 DECLARE_XPAR_SCALE_BLIT(ByteIndexedBm, UshortIndexed);
63 DECLARE_XPAR_SCALE_BLIT(IntArgbBm, UshortIndexed);
64 DECLARE_XPAR_BLITBG(ByteIndexedBm, UshortIndexed);
65 DECLARE_XPAR_CONVERT_BLIT(IntArgbBm, UshortIndexed);
66 DECLARE_XPAR_BLITBG(IntArgbBm, UshortIndexed);
67 
68 DECLARE_XOR_BLIT(IntArgb, UshortIndexed);
69 DECLARE_ALPHA_MASKFILL(UshortIndexed);
70 DECLARE_ALPHA_MASKBLIT(IntArgb, UshortIndexed);
71 DECLARE_ALPHA_MASKBLIT(IntArgbPre, UshortIndexed);
72 DECLARE_ALPHA_MASKBLIT(IntRgb, UshortIndexed);
73 DECLARE_SOLID_DRAWGLYPHLISTAA(UshortIndexed);
74 
75 NativePrimitive 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 
115 extern jint PixelForByteIndexed(SurfaceDataRasInfo *pRasInfo, jint rgb);
116 extern jboolean checkSameLut(jint *SrcReadLut, jint *DstReadLut,
117                              SurfaceDataRasInfo *pSrcInfo,
118                              SurfaceDataRasInfo *pDstInfo);
119 
RegisterUshortIndexed(JNIEnv * env)120 jboolean RegisterUshortIndexed(JNIEnv *env)
121 {
122     return RegisterPrimitives(env, UshortIndexedPrimitives,
123                               ArraySize(UshortIndexedPrimitives));
124 }
125 
PixelForUshortIndexed(SurfaceDataRasInfo * pRasInfo,jint rgb)126 jint PixelForUshortIndexed(SurfaceDataRasInfo *pRasInfo, jint rgb)
127 {
128     return PixelForByteIndexed(pRasInfo, rgb);
129 }
130 
131 
132 DEFINE_CONVERT_BLIT(IntArgb, UshortIndexed, 3ByteRgb)
133 
134 DEFINE_CONVERT_BLIT(ThreeByteBgr, UshortIndexed, 3ByteRgb)
135 
136 DEFINE_CONVERT_BLIT(ByteGray, UshortIndexed, 3ByteRgb)
137 
138 DEFINE_CONVERT_BLIT(Index12Gray, UshortIndexed, 3ByteRgb)
139 
DEFINE_CONVERT_BLIT_LUT(UshortIndexed,IntArgb,ConvertOnTheFly)140 DEFINE_CONVERT_BLIT_LUT(UshortIndexed, IntArgb, ConvertOnTheFly)
141 
142 DEFINE_SCALE_BLIT_LUT(UshortIndexed, IntArgb, ConvertOnTheFly)
143 
144 void 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 
179 DEFINE_SCALE_BLIT(IntArgb, UshortIndexed, 3ByteRgb)
180 
181 DEFINE_SCALE_BLIT(ThreeByteBgr, UshortIndexed, 3ByteRgb)
182 
183 DEFINE_SCALE_BLIT(ByteGray, UshortIndexed, 3ByteRgb)
184 
185 DEFINE_SCALE_BLIT(Index12Gray, UshortIndexed, 3ByteRgb)
186 
NAME_SCALE_BLIT(UshortIndexed,UshortIndexed)187 void 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 
223 DEFINE_XPAR_CONVERT_BLIT_LUT(ByteIndexedBm, UshortIndexed, ConvertOnTheFly)
224 
225 DEFINE_XPAR_SCALE_BLIT_LUT(ByteIndexedBm, UshortIndexed, ConvertOnTheFly)
226 
227 DEFINE_XPAR_SCALE_BLIT(IntArgbBm, UshortIndexed, 1IntRgb)
228 
229 DEFINE_XPAR_BLITBG_LUT(ByteIndexedBm, UshortIndexed, ConvertOnTheFly)
230 
231 DEFINE_XPAR_CONVERT_BLIT(IntArgbBm, UshortIndexed, 1IntRgb)
232 
233 DEFINE_XPAR_BLITBG(IntArgbBm, UshortIndexed, 1IntRgb)
234 
235 DEFINE_XOR_BLIT(IntArgb, UshortIndexed, AnyByte)
236 
237 DEFINE_ALPHA_MASKFILL(UshortIndexed, 4ByteArgb)
238 
239 DEFINE_ALPHA_MASKBLIT(IntArgb, UshortIndexed, 4ByteArgb)
240 
241 DEFINE_ALPHA_MASKBLIT(IntArgbPre, UshortIndexed, 4ByteArgb)
242 
243 DEFINE_ALPHA_MASKBLIT(IntRgb, UshortIndexed, 4ByteArgb)
244 
245 DEFINE_SOLID_DRAWGLYPHLISTAA(UshortIndexed, 3ByteRgb)
246