blob: b988e355d2f43d6a551cdc2ab840abfbbf593242 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1996 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26/*
27 * This file contains macro definitions for the Storing category of
28 * the macros used by the generic scaleloop function.
29 *
30 * This implementation can store 8-bit or 16-bit pixels into an array
31 * of bytes or shorts such that the pixel for (srcX, srcY) is stored at
32 * index (srcOff + srcY * srcScan + srcX) in the array.
33 *
34 * This implementation can also store 24-bit pixels into an array of bytes
35 * as three consecutive bytes such that the pixel for (srcX, srcY) is
36 * stored at indices (srcOff + srcY * srcScan + srcX * 3 + C) in the
37 * array, where C == 0 for the blue component, 1 for the green component,
38 * and 2 for the red component.
39 */
40
41#define DeclareOutputVars \
42 pixptr dstP; \
43 int pixsz;
44
45#define InitOutput(cvdata, clrdata, dstX, dstY) \
46 do { \
47 switch (clrdata->bitsperpixel) { \
48 case 8: pixsz = 1; break; \
49 case 16: pixsz = 2; break; \
50 case 24: pixsz = 3; break; \
51 default: \
52 SignalError(0, JAVAPKG "InternalError", \
53 "unsupported screen depth"); \
54 return SCALEFAILURE; \
55 } \
56 img_check(pixsz != 2 || (ScanBytes(cvdata) & 1) == 0); \
57 dstP.vp = cvdata->outbuf; \
58 dstP.bp += dstY * ScanBytes(cvdata) + dstX * pixsz; \
59 } while (0)
60
61#define PutPixelInc(pixel, red, green, blue) \
62 do { \
63 switch (pixsz) { \
64 case 1: \
65 *dstP.bp++ = ((unsigned char) pixel); \
66 break; \
67 case 2: \
68 *dstP.sp++ = ((unsigned short) pixel); \
69 break; \
70 case 3: \
71 *dstP.bp++ = blue; \
72 *dstP.bp++ = green; \
73 *dstP.bp++ = red; \
74 break; \
75 } \
76 } while (0)
77
78#define EndOutputRow(cvdata, dstY, dstX1, dstX2) \
79 do { \
80 SendRow(cvdata, dstY, dstX1, dstX2); \
81 dstP.bp += ScanBytes(cvdata) - (dstX2 - dstX1) * pixsz; \
82 } while (0)
83
84#define EndOutputRect(cvdata, dstX1, dstY1, dstX2, dstY2) \
85 SendBuffer(cvdata, dstX1, dstY1, dstX2, dstY2)