Mercurial > projects > dwt-win
annotate dwt/graphics/ImageData.d @ 246:fd9c62a2998e
Updater SWT 3.4M7 to 3.4
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Tue, 01 Jul 2008 10:15:59 +0200 |
parents | 36f5cb12e1a2 |
children |
rev | line source |
---|---|
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1 /******************************************************************************* |
246 | 2 * Copyright (c) 2000, 2008 IBM Corporation and others. |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3 * All rights reserved. This program and the accompanying materials |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
4 * are made available under the terms of the Eclipse Public License v1.0 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
5 * which accompanies this distribution, and is available at |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
6 * http://www.eclipse.org/legal/epl-v10.html |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
7 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
8 * Contributors: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
9 * IBM Corporation - initial API and implementation |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
10 * Port to the D programming language: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 * Frank Benoit <benoit@tionex.de> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
12 *******************************************************************************/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
13 module dwt.graphics.ImageData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
14 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
16 import dwt.graphics.PaletteData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
17 import dwt.graphics.RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
18 import dwt.graphics.Image; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
19 import dwt.graphics.GC; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
20 import dwt.graphics.Device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 import dwt.graphics.ImageDataLoader; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 import dwt.DWT; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
23 import dwt.internal.CloneableCompatibility; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
24 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 public import dwt.dwthelper.InputStream; |
23 | 26 import dwt.dwthelper.System; |
212
ab60f3309436
reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents:
23
diff
changeset
|
27 import dwt.dwthelper.utils; |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
28 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
29 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
30 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
31 * Instances of this class are device-independent descriptions |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
32 * of images. They are typically used as an intermediate format |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 * between loading from or writing to streams and creating an |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
34 * <code>Image</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 * Note that the public fields <code>x</code>, <code>y</code>, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
37 * <code>disposalMethod</code> and <code>delayTime</code> are |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
38 * typically only used when the image is in a set of images used |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
39 * for animation. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
40 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
41 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
42 * @see Image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
43 * @see ImageLoader |
246 | 44 * @see <a href="http://www.eclipse.org/swt/snippets/#image">ImageData snippets</a> |
45 * @see <a href="http://www.eclipse.org/swt/examples.php">DWT Example: ImageAnalyzer</a> | |
46 * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a> | |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
47 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
48 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
49 public final class ImageData : CloneableCompatibility { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
51 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
52 * The width of the image, in pixels. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
53 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 public int width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
55 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
56 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
57 * The height of the image, in pixels. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
58 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
59 public int height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
60 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
61 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
62 * The color depth of the image, in bits per pixel. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
63 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
64 * Note that a depth of 8 or less does not necessarily |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
65 * mean that the image is palette indexed, or |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
66 * conversely that a depth greater than 8 means that |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
67 * the image is direct color. Check the associated |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
68 * PaletteData's isDirect field for such determinations. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
70 public int depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
71 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
72 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
73 * The scanline padding. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
74 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
75 * If one scanline of the image is not a multiple of |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
76 * this number, it will be padded with zeros until it is. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
77 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
78 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
79 public int scanlinePad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 * The number of bytes per scanline. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 * This is a multiple of the scanline padding. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
86 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 public int bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 * The pixel data of the image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
91 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
92 * Note that for 16 bit depth images the pixel data is stored |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
93 * in least significant byte order; however, for 24bit and |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
94 * 32bit depth images the pixel data is stored in most |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
95 * significant byte order. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
96 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
97 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
98 public byte[] data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
99 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 * The color table for the image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 public PaletteData palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
104 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
105 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
106 * The transparent pixel. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
107 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
108 * Pixels with this value are transparent. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
109 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
110 * The default is -1 which means 'no transparent pixel'. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
111 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
112 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
113 public int transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
114 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
115 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
116 * An icon-specific field containing the data from the icon mask. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
117 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
118 * This is a 1 bit bitmap stored with the most significant |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
119 * bit first. The number of bytes per scanline is |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
120 * '((width + 7) / 8 + (maskPad - 1)) / maskPad * maskPad'. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
121 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
122 * The default is null which means 'no transparency mask'. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
123 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
124 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
125 public byte[] maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
126 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
127 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
128 * An icon-specific field containing the scanline pad of the mask. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
129 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
130 * If one scanline of the transparency mask is not a |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
131 * multiple of this number, it will be padded with zeros until |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
132 * it is. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
133 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
134 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
135 public int maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
136 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
137 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
138 * The alpha data of the image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
139 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
140 * Every pixel can have an <em>alpha blending</em> value that |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
141 * varies from 0, meaning fully transparent, to 255 meaning |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
142 * fully opaque. The number of bytes per scanline is |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
143 * 'width'. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
144 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
145 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
146 public byte[] alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
147 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
148 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
149 * The global alpha value to be used for every pixel. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
150 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
151 * If this value is set, the <code>alphaData</code> field |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
152 * is ignored and when the image is rendered each pixel |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
153 * will be blended with the background an amount |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
154 * proportional to this value. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
155 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
156 * The default is -1 which means 'no global alpha value' |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
157 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
158 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
159 public int alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
160 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
161 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
162 * The type of file from which the image was read. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
163 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
164 * It is expressed as one of the following values: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
165 * <dl> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
166 * <dt><code>IMAGE_BMP</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
167 * <dd>Windows BMP file format, no compression</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
168 * <dt><code>IMAGE_BMP_RLE</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
169 * <dd>Windows BMP file format, RLE compression if appropriate</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
170 * <dt><code>IMAGE_GIF</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
171 * <dd>GIF file format</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
172 * <dt><code>IMAGE_ICO</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
173 * <dd>Windows ICO file format</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
174 * <dt><code>IMAGE_JPEG</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
175 * <dd>JPEG file format</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
176 * <dt><code>IMAGE_PNG</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
177 * <dd>PNG file format</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
178 * </dl> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
179 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
180 public int type; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
181 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
182 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
183 * The x coordinate of the top left corner of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
184 * within the logical screen (this field corresponds to |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
185 * the GIF89a Image Left Position value). |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
186 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
187 public int x; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
188 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
189 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
190 * The y coordinate of the top left corner of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
191 * within the logical screen (this field corresponds to |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
192 * the GIF89a Image Top Position value). |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
193 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
194 public int y; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
195 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
196 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
197 * A description of how to dispose of the current image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
198 * before displaying the next. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
199 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
200 * It is expressed as one of the following values: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
201 * <dl> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
202 * <dt><code>DM_UNSPECIFIED</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
203 * <dd>disposal method not specified</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
204 * <dt><code>DM_FILL_NONE</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
205 * <dd>do nothing - leave the image in place</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
206 * <dt><code>DM_FILL_BACKGROUND</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
207 * <dd>fill with the background color</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
208 * <dt><code>DM_FILL_PREVIOUS</code></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
209 * <dd>restore the previous picture</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
210 * </dl> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
211 * (this field corresponds to the GIF89a Disposal Method value) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
212 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
213 public int disposalMethod; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
214 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
215 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
216 * The time to delay before displaying the next image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
217 * in an animation (this field corresponds to the GIF89a |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
218 * Delay Time value). |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
219 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
220 public int delayTime; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
221 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
222 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
223 * Arbitrary channel width data to 8-bit conversion table. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
224 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
225 private static byte[][] ANY_TO_EIGHT; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
226 private static byte[] ONE_TO_ONE_MAPPING; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
227 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
228 private static bool static_this_completed = false; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
229 private static void static_this() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
230 if( static_this_completed ) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
231 synchronized { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
232 if( static_this_completed ) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
233 ANY_TO_EIGHT = new byte[][](9); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
234 for (int b = 0; b < 9; ++b) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
235 byte[] data = ANY_TO_EIGHT[b] = new byte[1 << b]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
236 if (b is 0) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
237 int inc = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
238 for (int bit = 0x10000; (bit >>= b) !is 0;) inc |= bit; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
239 for (int v = 0, p = 0; v < 0x10000; v+= inc) data[p++] = cast(byte)(v >> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
240 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
241 ONE_TO_ONE_MAPPING = ANY_TO_EIGHT[8]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
242 static_this_completed = true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
243 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
244 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
245 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
246 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
247 * Scaled 8x8 Bayer dither matrix. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
248 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
249 static const int[][] DITHER_MATRIX = [ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
250 [ 0xfc0000, 0x7c0000, 0xdc0000, 0x5c0000, 0xf40000, 0x740000, 0xd40000, 0x540000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
251 [ 0x3c0000, 0xbc0000, 0x1c0000, 0x9c0000, 0x340000, 0xb40000, 0x140000, 0x940000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
252 [ 0xcc0000, 0x4c0000, 0xec0000, 0x6c0000, 0xc40000, 0x440000, 0xe40000, 0x640000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
253 [ 0x0c0000, 0x8c0000, 0x2c0000, 0xac0000, 0x040000, 0x840000, 0x240000, 0xa40000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
254 [ 0xf00000, 0x700000, 0xd00000, 0x500000, 0xf80000, 0x780000, 0xd80000, 0x580000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
255 [ 0x300000, 0xb00000, 0x100000, 0x900000, 0x380000, 0xb80000, 0x180000, 0x980000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
256 [ 0xc00000, 0x400000, 0xe00000, 0x600000, 0xc80000, 0x480000, 0xe80000, 0x680000 ], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
257 [ 0x000000, 0x800000, 0x200000, 0xa00000, 0x080000, 0x880000, 0x280000, 0xa80000 ] |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
258 ]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
259 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
260 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
261 * Constructs a new, empty ImageData with the given width, height, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
262 * depth and palette. The data will be initialized to an (all zero) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
263 * array of the appropriate size. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
264 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
265 * @param width the width of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
266 * @param height the height of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
267 * @param depth the depth of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
268 * @param palette the palette of the image (must not be null) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
269 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
270 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
271 * <li>ERROR_INVALID_ARGUMENT - if the width or height is negative, or if the depth is not |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
272 * one of 1, 2, 4, 8, 16, 24 or 32</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
273 * <li>ERROR_NULL_ARGUMENT - if the palette is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
274 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
275 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
276 public this(int width, int height, int depth, PaletteData palette) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
277 this(width, height, depth, palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
278 4, null, 0, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
279 null, -1, -1, DWT.IMAGE_UNDEFINED, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
280 0, 0, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
281 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
282 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
283 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
284 * Constructs a new, empty ImageData with the given width, height, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
285 * depth, palette, scanlinePad and data. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
286 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
287 * @param width the width of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
288 * @param height the height of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
289 * @param depth the depth of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
290 * @param palette the palette of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
291 * @param scanlinePad the padding of each line, in bytes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
292 * @param data the data of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
293 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
294 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
295 * <li>ERROR_INVALID_ARGUMENT - if the width or height is negative, or if the depth is not |
213 | 296 * one of 1, 2, 4, 8, 16, 24 or 32, or the data array is too small to contain the image data</li> |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
297 * <li>ERROR_NULL_ARGUMENT - if the palette or data is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
298 * <li>ERROR_CANNOT_BE_ZERO - if the scanlinePad is zero</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
299 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
300 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
301 public this(int width, int height, int depth, PaletteData palette, int scanlinePad, byte[] data) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
302 this(width, height, depth, palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
303 scanlinePad, checkData(data), 0, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
304 null, -1, -1, DWT.IMAGE_UNDEFINED, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
305 0, 0, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
306 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
307 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
308 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
309 * Constructs an <code>ImageData</code> loaded from the specified |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
310 * input stream. Throws an error if an error occurs while loading |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
311 * the image, or if the image has an unsupported type. Application |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
312 * code is still responsible for closing the input stream. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
313 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
314 * This constructor is provided for convenience when loading a single |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
315 * image only. If the stream contains multiple images, only the first |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
316 * one will be loaded. To load multiple images, use |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
317 * <code>ImageLoader.load()</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
318 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
319 * This constructor may be used to load a resource as follows: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
320 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
321 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
322 * static ImageData loadImageData (Class clazz, String string) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
323 * InputStream stream = clazz.getResourceAsStream (string); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
324 * if (stream is null) return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
325 * ImageData imageData = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
326 * try { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
327 * imageData = new ImageData (stream); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
328 * } catch (DWTException ex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
329 * } finally { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
330 * try { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
331 * stream.close (); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
332 * } catch (IOException ex) {} |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
333 * } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
334 * return imageData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
335 * } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
336 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
337 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
338 * @param stream the input stream to load the image from (must not be null) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
339 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
340 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
341 * <li>ERROR_NULL_ARGUMENT - if the stream is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
342 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
343 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
344 * <li>ERROR_IO - if an IO error occurs while reading from the stream</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
345 * <li>ERROR_INVALID_IMAGE - if the image stream contains invalid data</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
346 * <li>ERROR_UNSUPPORTED_FORMAT - if the image stream contains an unrecognized format</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
347 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
348 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
349 * @see ImageLoader#load(InputStream) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
350 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
351 public this(InputStream stream) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
352 ImageData[] data = ImageDataLoader.load(stream); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
353 if (data.length < 1) DWT.error(DWT.ERROR_INVALID_IMAGE); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
354 ImageData i = data[0]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
355 setAllFields( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
356 i.width, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
357 i.height, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
358 i.depth, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
359 i.scanlinePad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
360 i.bytesPerLine, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
361 i.data, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
362 i.palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
363 i.transparentPixel, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
364 i.maskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
365 i.maskPad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
366 i.alphaData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
367 i.alpha, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
368 i.type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
369 i.x, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
370 i.y, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
371 i.disposalMethod, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
372 i.delayTime); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
373 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
374 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
375 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
376 * Constructs an <code>ImageData</code> loaded from a file with the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
377 * specified name. Throws an error if an error occurs loading the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
378 * image, or if the image has an unsupported type. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
379 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
380 * This constructor is provided for convenience when loading a single |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
381 * image only. If the file contains multiple images, only the first |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
382 * one will be loaded. To load multiple images, use |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
383 * <code>ImageLoader.load()</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
384 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
385 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
386 * @param filename the name of the file to load the image from (must not be null) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
387 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
388 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
389 * <li>ERROR_NULL_ARGUMENT - if the file name is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
390 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
391 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
392 * <li>ERROR_IO - if an IO error occurs while reading from the file</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
393 * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
394 * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
395 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
396 */ |
212
ab60f3309436
reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents:
23
diff
changeset
|
397 public this(String filename) { |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
398 ImageData[] data = ImageDataLoader.load(filename); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
399 if (data.length < 1) DWT.error(DWT.ERROR_INVALID_IMAGE); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
400 ImageData i = data[0]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
401 setAllFields( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
402 i.width, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
403 i.height, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
404 i.depth, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
405 i.scanlinePad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
406 i.bytesPerLine, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
407 i.data, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
408 i.palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
409 i.transparentPixel, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
410 i.maskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
411 i.maskPad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
412 i.alphaData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
413 i.alpha, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
414 i.type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
415 i.x, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
416 i.y, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
417 i.disposalMethod, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
418 i.delayTime); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
419 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
420 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
421 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
422 * Prevents uninitialized instances from being created outside the package. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
423 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
424 private this() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
425 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
426 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
427 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
428 * Constructs an image data by giving values for all non-computable fields. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
429 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
430 * This method is for internal use, and is not described further. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
431 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
432 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
433 this( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
434 int width, int height, int depth, PaletteData palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
435 int scanlinePad, byte[] data, int maskPad, byte[] maskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
436 byte[] alphaData, int alpha, int transparentPixel, int type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
437 int x, int y, int disposalMethod, int delayTime) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
438 { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
439 if (palette is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
440 if (!(depth is 1 || depth is 2 || depth is 4 || depth is 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
441 || depth is 16 || depth is 24 || depth is 32)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
442 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
443 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
444 if (width <= 0 || height <= 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
445 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
446 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
447 if (scanlinePad is 0) DWT.error (DWT.ERROR_CANNOT_BE_ZERO); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
448 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
449 int bytesPerLine = (((width * depth + 7) / 8) + (scanlinePad - 1)) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
450 / scanlinePad * scanlinePad; |
213 | 451 |
452 /* | |
453 * When the image is being loaded from a PNG, we need to use the theoretical minimum | |
454 * number of bytes per line to check whether there is enough data, because the actual | |
455 * number of bytes per line is calculated based on the given depth, which may be larger | |
456 * than the actual depth of the PNG. | |
457 */ | |
458 int minBytesPerLine = type is DWT.IMAGE_PNG ? ((((width + 7) / 8) + 3) / 4) * 4 : bytesPerLine; | |
459 if (data !is null && data.length < minBytesPerLine * height) { | |
460 DWT.error(DWT.ERROR_INVALID_ARGUMENT); | |
461 } | |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
462 setAllFields( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
463 width, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
464 height, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
465 depth, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
466 scanlinePad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
467 bytesPerLine, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
468 data !is null ? data : new byte[bytesPerLine * height], |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
469 palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
470 transparentPixel, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
471 maskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
472 maskPad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
473 alphaData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
474 alpha, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
475 type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
476 x, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
477 y, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
478 disposalMethod, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
479 delayTime); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
480 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
481 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
482 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
483 * Initializes all fields in the receiver. This method must be called |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
484 * by all public constructors to ensure that all fields are initialized |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
485 * for a new ImageData object. If a new field is added to the class, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
486 * then it must be added to this method. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
487 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
488 * This method is for internal use, and is not described further. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
489 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
490 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
491 void setAllFields(int width, int height, int depth, int scanlinePad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
492 int bytesPerLine, byte[] data, PaletteData palette, int transparentPixel, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
493 byte[] maskData, int maskPad, byte[] alphaData, int alpha, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
494 int type, int x, int y, int disposalMethod, int delayTime) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
495 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
496 this.width = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
497 this.height = height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
498 this.depth = depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
499 this.scanlinePad = scanlinePad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
500 this.bytesPerLine = bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
501 this.data = data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
502 this.palette = palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
503 this.transparentPixel = transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
504 this.maskData = maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
505 this.maskPad = maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
506 this.alphaData = alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
507 this.alpha = alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
508 this.type = type; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
509 this.x = x; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
510 this.y = y; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
511 this.disposalMethod = disposalMethod; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
512 this.delayTime = delayTime; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
513 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
514 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
515 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
516 * Invokes internal DWT functionality to create a new instance of |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
517 * this class. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
518 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
519 * <b>IMPORTANT:</b> This method is <em>not</em> part of the public |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
520 * API for <code>ImageData</code>. It is marked public only so that it |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
521 * can be shared within the packages provided by DWT. It is subject |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
522 * to change without notice, and should never be called from |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
523 * application code. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
524 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
525 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
526 * This method is for internal use, and is not described further. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
527 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
528 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
529 public static ImageData internal_new( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
530 int width, int height, int depth, PaletteData palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
531 int scanlinePad, byte[] data, int maskPad, byte[] maskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
532 byte[] alphaData, int alpha, int transparentPixel, int type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
533 int x, int y, int disposalMethod, int delayTime) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
534 { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
535 return new ImageData( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
536 width, height, depth, palette, scanlinePad, data, maskPad, maskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
537 alphaData, alpha, transparentPixel, type, x, y, disposalMethod, delayTime); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
538 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
539 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
540 ImageData colorMaskImage(int pixel) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
541 ImageData mask = new ImageData(width, height, 1, bwPalette(), |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
542 2, null, 0, null, null, -1, -1, DWT.IMAGE_UNDEFINED, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
543 0, 0, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
544 int[] row = new int[width]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
545 for (int y = 0; y < height; y++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
546 getPixels(0, y, width, row, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
547 for (int i = 0; i < width; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
548 if (pixel !is -1 && row[i] is pixel) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
549 row[i] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
550 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
551 row[i] = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
552 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
553 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
554 mask.setPixels(0, y, width, row, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
555 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
556 return mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
557 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
558 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
559 static byte[] checkData(byte [] data) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
560 if (data is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
561 return data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
562 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
563 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
564 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
565 * Returns a new instance of the same class as the receiver, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
566 * whose slots have been filled in with <em>copies</em> of |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
567 * the values in the slots of the receiver. That is, the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
568 * returned object is a <em>deep copy</em> of the receiver. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
569 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
570 * @return a copy of the receiver. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
571 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
572 public Object clone() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
573 byte[] cloneData = new byte[data.length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
574 System.arraycopy(data, 0, cloneData, 0, data.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
575 byte[] cloneMaskData = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
576 if (maskData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
577 cloneMaskData = new byte[maskData.length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
578 System.arraycopy(maskData, 0, cloneMaskData, 0, maskData.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
579 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
580 byte[] cloneAlphaData = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
581 if (alphaData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
582 cloneAlphaData = new byte[alphaData.length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
583 System.arraycopy(alphaData, 0, cloneAlphaData, 0, alphaData.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
584 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
585 return new ImageData( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
586 width, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
587 height, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
588 depth, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
589 palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
590 scanlinePad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
591 cloneData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
592 maskPad, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
593 cloneMaskData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
594 cloneAlphaData, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
595 alpha, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
596 transparentPixel, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
597 type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
598 x, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
599 y, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
600 disposalMethod, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
601 delayTime); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
602 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
603 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
604 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
605 * Returns the alpha value at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
606 * scanline <code>y</code> in the receiver's alpha data. |
246 | 607 * The alpha value is between 0 (transparent) and |
608 * 255 (opaque). | |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
609 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
610 * @param x the x coordinate of the pixel to get the alpha value of |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
611 * @param y the y coordinate of the pixel to get the alpha value of |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
612 * @return the alpha value at the given coordinates |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
613 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
614 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
615 * <li>ERROR_INVALID_ARGUMENT - if either argument is out of range</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
616 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
617 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
618 public int getAlpha(int x, int y) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
619 if (x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
620 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
621 if (alphaData is null) return 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
622 return alphaData[y * width + x] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
623 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
624 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
625 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
626 * Returns <code>getWidth</code> alpha values starting at offset |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
627 * <code>x</code> in scanline <code>y</code> in the receiver's alpha |
246 | 628 * data starting at <code>startIndex</code>. The alpha values |
629 * are unsigned, between <code>(byte)0</code> (transparent) and | |
630 * <code>(byte)255</code> (opaque). | |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
631 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
632 * @param x the x position of the pixel to begin getting alpha values |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
633 * @param y the y position of the pixel to begin getting alpha values |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
634 * @param getWidth the width of the data to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
635 * @param alphas the buffer in which to put the alpha values |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
636 * @param startIndex the offset into the image to begin getting alpha values |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
637 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
638 * @exception IndexOutOfBoundsException if getWidth is too large |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
639 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
640 * <li>ERROR_NULL_ARGUMENT - if pixels is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
641 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
642 * <li>ERROR_INVALID_ARGUMENT - if getWidth is negative</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
643 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
644 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
645 public void getAlphas(int x, int y, int getWidth, byte[] alphas, int startIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
646 if (alphas is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
647 if (getWidth < 0 || x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
648 if (getWidth is 0) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
649 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
650 if (alphaData is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
651 int endIndex = startIndex + getWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
652 for (int i = startIndex; i < endIndex; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
653 alphas[i] = cast(byte)255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
654 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
655 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
656 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
657 // may throw an IndexOutOfBoundsException |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
658 System.arraycopy(alphaData, y * width + x, alphas, startIndex, getWidth); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
659 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
660 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
661 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
662 * Returns the pixel value at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
663 * scanline <code>y</code> in the receiver's data. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
664 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
665 * @param x the x position of the pixel to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
666 * @param y the y position of the pixel to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
667 * @return the pixel at the given coordinates |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
668 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
669 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
670 * <li>ERROR_INVALID_ARGUMENT - if either argument is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
671 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
672 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
673 * <li>ERROR_UNSUPPORTED_DEPTH if the depth is not one of 1, 2, 4, 8, 16, 24 or 32</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
674 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
675 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
676 public int getPixel(int x, int y) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
677 if (x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
678 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
679 int theByte; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
680 int mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
681 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
682 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
683 index = (y * bytesPerLine) + (x * 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
684 return ((data[index] & 0xFF) << 24) + ((data[index+1] & 0xFF) << 16) + |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
685 ((data[index+2] & 0xFF) << 8) + (data[index+3] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
686 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
687 index = (y * bytesPerLine) + (x * 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
688 return ((data[index] & 0xFF) << 16) + ((data[index+1] & 0xFF) << 8) + |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
689 (data[index+2] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
690 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
691 index = (y * bytesPerLine) + (x * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
692 return ((data[index+1] & 0xFF) << 8) + (data[index] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
693 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
694 index = (y * bytesPerLine) + x ; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
695 return data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
696 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
697 index = (y * bytesPerLine) + (x >> 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
698 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
699 if ((x & 0x1) is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
700 return theByte >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
701 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
702 return theByte & 0x0F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
703 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
704 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
705 index = (y * bytesPerLine) + (x >> 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
706 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
707 int offset = 3 - (x % 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
708 mask = 3 << (offset * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
709 return (theByte & mask) >> (offset * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
710 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
711 index = (y * bytesPerLine) + (x >> 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
712 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
713 mask = 1 << (7 - (x & 0x7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
714 if ((theByte & mask) is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
715 return 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
716 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
717 return 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
718 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
719 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
720 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
721 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
722 return 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
723 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
724 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
725 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
726 * Returns <code>getWidth</code> pixel values starting at offset |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
727 * <code>x</code> in scanline <code>y</code> in the receiver's |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
728 * data starting at <code>startIndex</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
729 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
730 * @param x the x position of the first pixel to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
731 * @param y the y position of the first pixel to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
732 * @param getWidth the width of the data to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
733 * @param pixels the buffer in which to put the pixels |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
734 * @param startIndex the offset into the byte array to begin storing pixels |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
735 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
736 * @exception IndexOutOfBoundsException if getWidth is too large |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
737 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
738 * <li>ERROR_NULL_ARGUMENT - if pixels is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
739 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
740 * <li>ERROR_INVALID_ARGUMENT - if getWidth is negative</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
741 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
742 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
743 * <li>ERROR_UNSUPPORTED_DEPTH - if the depth is not one of 1, 2, 4 or 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
744 * (For higher depths, use the int[] version of this method.)</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
745 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
746 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
747 public void getPixels(int x, int y, int getWidth, byte[] pixels, int startIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
748 if (pixels is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
749 if (getWidth < 0 || x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
750 if (getWidth is 0) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
751 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
752 int theByte; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
753 int mask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
754 int n = getWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
755 int i = startIndex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
756 int srcX = x, srcY = y; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
757 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
758 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
759 index = (y * bytesPerLine) + x; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
760 for (int j = 0; j < getWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
761 pixels[i] = data[index]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
762 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
763 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
764 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
765 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
766 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
767 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
768 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
769 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
770 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
771 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
772 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
773 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
774 index = (y * bytesPerLine) + (x >> 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
775 if ((x & 0x1) is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
776 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
777 pixels[i] = cast(byte)(theByte & 0x0F); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
778 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
779 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
780 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
781 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
782 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
783 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
784 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
785 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
786 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
787 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
788 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
789 while (n > 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
790 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
791 pixels[i] = cast(byte)(theByte >> 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
792 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
793 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
794 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
795 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
796 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
797 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
798 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
799 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
800 pixels[i] = cast(byte)(theByte & 0x0F); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
801 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
802 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
803 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
804 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
805 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
806 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
807 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
808 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
809 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
810 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
811 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
812 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
813 if (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
814 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
815 pixels[i] = cast(byte)(theByte >> 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
816 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
817 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
818 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
819 index = (y * bytesPerLine) + (x >> 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
820 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
821 int offset; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
822 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
823 offset = 3 - (srcX % 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
824 mask = 3 << (offset * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
825 pixels[i] = cast(byte)((theByte & mask) >> (offset * 2)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
826 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
827 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
828 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
829 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
830 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
831 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
832 if (n > 0) theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
833 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
834 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
835 if (offset is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
836 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
837 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
838 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
839 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
840 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
841 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
842 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
843 index = (y * bytesPerLine) + (x >> 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
844 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
845 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
846 mask = 1 << (7 - (srcX & 0x7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
847 if ((theByte & mask) is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
848 pixels[i] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
849 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
850 pixels[i] = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
851 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
852 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
853 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
854 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
855 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
856 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
857 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
858 if (n > 0) theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
859 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
860 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
861 if (mask is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
862 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
863 if (n > 0) theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
864 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
865 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
866 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
867 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
868 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
869 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
870 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
871 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
872 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
873 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
874 * Returns <code>getWidth</code> pixel values starting at offset |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
875 * <code>x</code> in scanline <code>y</code> in the receiver's |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
876 * data starting at <code>startIndex</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
877 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
878 * @param x the x position of the first pixel to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
879 * @param y the y position of the first pixel to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
880 * @param getWidth the width of the data to get |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
881 * @param pixels the buffer in which to put the pixels |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
882 * @param startIndex the offset into the buffer to begin storing pixels |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
883 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
884 * @exception IndexOutOfBoundsException if getWidth is too large |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
885 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
886 * <li>ERROR_NULL_ARGUMENT - if pixels is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
887 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
888 * <li>ERROR_INVALID_ARGUMENT - if getWidth is negative</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
889 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
890 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
891 * <li>ERROR_UNSUPPORTED_DEPTH - if the depth is not one of 1, 2, 4, 8, 16, 24 or 32</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
892 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
893 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
894 public void getPixels(int x, int y, int getWidth, int[] pixels, int startIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
895 if (pixels is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
896 if (getWidth < 0 || x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
897 if (getWidth is 0) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
898 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
899 int theByte; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
900 int mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
901 int n = getWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
902 int i = startIndex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
903 int srcX = x, srcY = y; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
904 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
905 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
906 index = (y * bytesPerLine) + (x * 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
907 i = startIndex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
908 for (int j = 0; j < getWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
909 pixels[i] = ((data[index] & 0xFF) << 24) | ((data[index+1] & 0xFF) << 16) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
910 | ((data[index+2] & 0xFF) << 8) | (data[index+3] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
911 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
912 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
913 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
914 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
915 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
916 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
917 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
918 index += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
919 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
920 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
921 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
922 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
923 index = (y * bytesPerLine) + (x * 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
924 for (int j = 0; j < getWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
925 pixels[i] = ((data[index] & 0xFF) << 16) | ((data[index+1] & 0xFF) << 8) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
926 | (data[index+2] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
927 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
928 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
929 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
930 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
931 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
932 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
933 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
934 index += 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
935 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
936 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
937 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
938 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
939 index = (y * bytesPerLine) + (x * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
940 for (int j = 0; j < getWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
941 pixels[i] = ((data[index+1] & 0xFF) << 8) + (data[index] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
942 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
943 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
944 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
945 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
946 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
947 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
948 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
949 index += 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
950 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
951 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
952 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
953 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
954 index = (y * bytesPerLine) + x; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
955 for (int j = 0; j < getWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
956 pixels[i] = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
957 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
958 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
959 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
960 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
961 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
962 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
963 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
964 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
965 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
966 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
967 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
968 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
969 index = (y * bytesPerLine) + (x >> 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
970 if ((x & 0x1) is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
971 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
972 pixels[i] = theByte & 0x0F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
973 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
974 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
975 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
976 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
977 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
978 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
979 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
980 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
981 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
982 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
983 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
984 while (n > 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
985 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
986 pixels[i] = theByte >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
987 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
988 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
989 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
990 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
991 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
992 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
993 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
994 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
995 pixels[i] = theByte & 0x0F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
996 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
997 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
998 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
999 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1000 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1001 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1002 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1003 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1004 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1005 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1006 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1007 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1008 if (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1009 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1010 pixels[i] = theByte >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1011 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1012 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1013 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1014 index = (y * bytesPerLine) + (x >> 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1015 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1016 int offset; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1017 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1018 offset = 3 - (srcX % 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1019 mask = 3 << (offset * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1020 pixels[i] = cast(byte)((theByte & mask) >> (offset * 2)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1021 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1022 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1023 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1024 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1025 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1026 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1027 if (n > 0) theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1028 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1029 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1030 if (offset is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1031 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1032 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1033 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1034 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1035 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1036 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1037 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1038 index = (y * bytesPerLine) + (x >> 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1039 theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1040 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1041 mask = 1 << (7 - (srcX & 0x7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1042 if ((theByte & mask) is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1043 pixels[i] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1044 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1045 pixels[i] = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1046 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1047 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1048 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1049 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1050 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1051 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1052 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1053 if (n > 0) theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1054 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1055 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1056 if (mask is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1057 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1058 if (n > 0) theByte = data[index] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1059 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1060 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1061 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1062 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1063 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1064 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1065 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1066 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1067 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1068 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1069 * Returns an array of <code>RGB</code>s which comprise the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1070 * indexed color table of the receiver, or null if the receiver |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1071 * has a direct color model. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1072 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1073 * @return the RGB values for the image or null if direct color |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1074 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1075 * @see PaletteData#getRGBs() |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1076 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1077 public RGB[] getRGBs() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1078 return palette.getRGBs(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1079 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1080 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1081 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1082 * Returns an <code>ImageData</code> which specifies the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1083 * transparency mask information for the receiver. If the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1084 * receiver has no transparency or is not an icon, returns |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1085 * an opaque mask. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1086 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1087 * @return the transparency mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1088 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1089 public ImageData getTransparencyMask() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1090 if (getTransparencyType() is DWT.TRANSPARENCY_MASK) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1091 return new ImageData(width, height, 1, bwPalette(), maskPad, maskData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1092 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1093 return colorMaskImage(transparentPixel); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1094 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1095 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1096 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1097 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1098 * Returns the image transparency type, which will be one of |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1099 * <code>DWT.TRANSPARENCY_NONE</code>, <code>DWT.TRANSPARENCY_MASK</code>, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1100 * <code>DWT.TRANSPARENCY_PIXEL</code> or <code>DWT.TRANSPARENCY_ALPHA</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1101 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1102 * @return the receiver's transparency type |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1103 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1104 public int getTransparencyType() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1105 if (maskData !is null) return DWT.TRANSPARENCY_MASK; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1106 if (transparentPixel !is -1) return DWT.TRANSPARENCY_PIXEL; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1107 if (alphaData !is null) return DWT.TRANSPARENCY_ALPHA; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1108 return DWT.TRANSPARENCY_NONE; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1109 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1110 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1111 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1112 * Returns the byte order of the receiver. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1113 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1114 * @return MSB_FIRST or LSB_FIRST |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1115 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1116 int getByteOrder() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1117 return depth !is 16 ? MSB_FIRST : LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1118 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1119 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1120 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1121 * Returns a copy of the receiver which has been stretched or |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1122 * shrunk to the specified size. If either the width or height |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1123 * is negative, the resulting image will be inverted in the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1124 * associated axis. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1125 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1126 * @param width the width of the new ImageData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1127 * @param height the height of the new ImageData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1128 * @return a scaled copy of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1129 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1130 public ImageData scaledTo(int width, int height) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1131 /* Create a destination image with no data */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1132 bool flipX = (width < 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1133 if (flipX) width = - width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1134 bool flipY = (height < 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1135 if (flipY) height = - height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1136 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1137 ImageData dest = new ImageData( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1138 width, height, depth, palette, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1139 scanlinePad, null, 0, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1140 null, -1, transparentPixel, type, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1141 x, y, disposalMethod, delayTime); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1142 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1143 /* Scale the image contents */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1144 if (palette.isDirect) blit(BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1145 this.data, this.depth, this.bytesPerLine, this.getByteOrder(), 0, 0, this.width, this.height, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1146 ALPHA_OPAQUE, null, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1147 dest.data, dest.depth, dest.bytesPerLine, dest.getByteOrder(), 0, 0, dest.width, dest.height, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1148 flipX, flipY); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1149 else blit(BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1150 this.data, this.depth, this.bytesPerLine, this.getByteOrder(), 0, 0, this.width, this.height, null, null, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1151 ALPHA_OPAQUE, null, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1152 dest.data, dest.depth, dest.bytesPerLine, dest.getByteOrder(), 0, 0, dest.width, dest.height, null, null, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1153 flipX, flipY); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1154 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1155 /* Scale the image mask or alpha */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1156 if (maskData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1157 dest.maskPad = this.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1158 int destBpl = (dest.width + 7) / 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1159 destBpl = (destBpl + (dest.maskPad - 1)) / dest.maskPad * dest.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1160 dest.maskData = new byte[destBpl * dest.height]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1161 int srcBpl = (this.width + 7) / 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1162 srcBpl = (srcBpl + (this.maskPad - 1)) / this.maskPad * this.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1163 blit(BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1164 this.maskData, 1, srcBpl, MSB_FIRST, 0, 0, this.width, this.height, null, null, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1165 ALPHA_OPAQUE, null, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1166 dest.maskData, 1, destBpl, MSB_FIRST, 0, 0, dest.width, dest.height, null, null, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1167 flipX, flipY); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1168 } else if (alpha !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1169 dest.alpha = this.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1170 } else if (alphaData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1171 dest.alphaData = new byte[dest.width * dest.height]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1172 blit(BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1173 this.alphaData, 8, this.width, MSB_FIRST, 0, 0, this.width, this.height, null, null, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1174 ALPHA_OPAQUE, null, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1175 dest.alphaData, 8, dest.width, MSB_FIRST, 0, 0, dest.width, dest.height, null, null, null, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1176 flipX, flipY); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1177 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1178 return dest; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1179 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1180 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1181 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1182 * Sets the alpha value at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1183 * scanline <code>y</code> in the receiver's alpha data. |
246 | 1184 * The alpha value must be between 0 (transparent) |
1185 * and 255 (opaque). | |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1186 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1187 * @param x the x coordinate of the alpha value to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1188 * @param y the y coordinate of the alpha value to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1189 * @param alpha the value to set the alpha to |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1190 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1191 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1192 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1193 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1194 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1195 public void setAlpha(int x, int y, int alpha) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1196 if (x >= width || y >= height || x < 0 || y < 0 || alpha < 0 || alpha > 255) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1197 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1198 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1199 if (alphaData is null) alphaData = new byte[width * height]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1200 alphaData[y * width + x] = cast(byte)alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1201 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1202 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1203 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1204 * Sets the alpha values starting at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1205 * scanline <code>y</code> in the receiver's alpha data to the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1206 * values from the array <code>alphas</code> starting at |
246 | 1207 * <code>startIndex</code>. The alpha values must be between |
1208 * <code>(byte)0</code> (transparent) and <code>(byte)255</code> (opaque) | |
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1209 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1210 * @param x the x coordinate of the pixel to being setting the alpha values |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1211 * @param y the y coordinate of the pixel to being setting the alpha values |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1212 * @param putWidth the width of the alpha values to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1213 * @param alphas the alpha values to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1214 * @param startIndex the index at which to begin setting |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1215 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1216 * @exception IndexOutOfBoundsException if putWidth is too large |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1217 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1218 * <li>ERROR_NULL_ARGUMENT - if pixels is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1219 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1220 * <li>ERROR_INVALID_ARGUMENT - if putWidth is negative</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1221 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1222 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1223 public void setAlphas(int x, int y, int putWidth, byte[] alphas, int startIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1224 if (alphas is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1225 if (putWidth < 0 || x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1226 if (putWidth is 0) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1227 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1228 if (alphaData is null) alphaData = new byte[width * height]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1229 // may throw an IndexOutOfBoundsException |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1230 System.arraycopy(alphas, startIndex, alphaData, y * width + x, putWidth); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1231 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1232 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1233 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1234 * Sets the pixel value at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1235 * scanline <code>y</code> in the receiver's data. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1236 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1237 * @param x the x coordinate of the pixel to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1238 * @param y the y coordinate of the pixel to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1239 * @param pixelValue the value to set the pixel to |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1240 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1241 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1242 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1243 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1244 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1245 * <li>ERROR_UNSUPPORTED_DEPTH if the depth is not one of 1, 2, 4, 8, 16, 24 or 32</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1246 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1247 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1248 public void setPixel(int x, int y, int pixelValue) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1249 if (x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1250 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1251 byte theByte; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1252 int mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1253 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1254 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1255 index = (y * bytesPerLine) + (x * 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1256 data[index] = cast(byte)((pixelValue >> 24) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1257 data[index + 1] = cast(byte)((pixelValue >> 16) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1258 data[index + 2] = cast(byte)((pixelValue >> 8) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1259 data[index + 3] = cast(byte)(pixelValue & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1260 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1261 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1262 index = (y * bytesPerLine) + (x * 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1263 data[index] = cast(byte)((pixelValue >> 16) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1264 data[index + 1] = cast(byte)((pixelValue >> 8) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1265 data[index + 2] = cast(byte)(pixelValue & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1266 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1267 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1268 index = (y * bytesPerLine) + (x * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1269 data[index + 1] = cast(byte)((pixelValue >> 8) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1270 data[index] = cast(byte)(pixelValue & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1271 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1272 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1273 index = (y * bytesPerLine) + x ; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1274 data[index] = cast(byte)(pixelValue & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1275 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1276 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1277 index = (y * bytesPerLine) + (x >> 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1278 if ((x & 0x1) is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1279 data[index] = cast(byte)((data[index] & 0x0F) | ((pixelValue & 0x0F) << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1280 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1281 data[index] = cast(byte)((data[index] & 0xF0) | (pixelValue & 0x0F)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1282 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1283 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1284 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1285 index = (y * bytesPerLine) + (x >> 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1286 theByte = data[index]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1287 int offset = 3 - (x % 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1288 mask = 0xFF ^ (3 << (offset * 2)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1289 data[index] = cast(byte)((data[index] & mask) | (pixelValue << (offset * 2))); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1290 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1291 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1292 index = (y * bytesPerLine) + (x >> 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1293 theByte = data[index]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1294 mask = 1 << (7 - (x & 0x7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1295 if ((pixelValue & 0x1) is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1296 data[index] = cast(byte)(theByte | mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1297 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1298 data[index] = cast(byte)(theByte & (mask ^ -1)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1299 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1300 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1301 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1302 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1303 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1304 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1305 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1306 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1307 * Sets the pixel values starting at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1308 * scanline <code>y</code> in the receiver's data to the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1309 * values from the array <code>pixels</code> starting at |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1310 * <code>startIndex</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1311 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1312 * @param x the x position of the pixel to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1313 * @param y the y position of the pixel to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1314 * @param putWidth the width of the pixels to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1315 * @param pixels the pixels to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1316 * @param startIndex the index at which to begin setting |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1317 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1318 * @exception IndexOutOfBoundsException if putWidth is too large |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1319 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1320 * <li>ERROR_NULL_ARGUMENT - if pixels is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1321 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1322 * <li>ERROR_INVALID_ARGUMENT - if putWidth is negative</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1323 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1324 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1325 * <li>ERROR_UNSUPPORTED_DEPTH if the depth is not one of 1, 2, 4, 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1326 * (For higher depths, use the int[] version of this method.)</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1327 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1328 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1329 public void setPixels(int x, int y, int putWidth, byte[] pixels, int startIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1330 if (pixels is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1331 if (putWidth < 0 || x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1332 if (putWidth is 0) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1333 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1334 int theByte; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1335 int mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1336 int n = putWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1337 int i = startIndex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1338 int srcX = x, srcY = y; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1339 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1340 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1341 index = (y * bytesPerLine) + x; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1342 for (int j = 0; j < putWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1343 data[index] = cast(byte)(pixels[i] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1344 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1345 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1346 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1347 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1348 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1349 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1350 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1351 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1352 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1353 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1354 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1355 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1356 index = (y * bytesPerLine) + (x >> 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1357 bool high = (x & 0x1) is 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1358 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1359 theByte = pixels[i] & 0x0F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1360 if (high) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1361 data[index] = cast(byte)((data[index] & 0x0F) | (theByte << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1362 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1363 data[index] = cast(byte)((data[index] & 0xF0) | theByte); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1364 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1365 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1366 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1367 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1368 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1369 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1370 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1371 high = true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1372 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1373 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1374 if (!high) index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1375 high = !high; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1376 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1377 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1378 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1379 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1380 byte [] masks = [ cast(byte)0xFC, cast(byte)0xF3, cast(byte)0xCF, cast(byte)0x3F ]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1381 index = (y * bytesPerLine) + (x >> 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1382 int offset = 3 - (x % 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1383 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1384 theByte = pixels[i] & 0x3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1385 data[index] = cast(byte)((data[index] & masks[offset]) | (theByte << (offset * 2))); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1386 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1387 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1388 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1389 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1390 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1391 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1392 offset = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1393 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1394 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1395 if (offset is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1396 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1397 offset = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1398 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1399 offset--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1400 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1401 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1402 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1403 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1404 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1405 index = (y * bytesPerLine) + (x >> 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1406 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1407 mask = 1 << (7 - (srcX & 0x7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1408 if ((pixels[i] & 0x1) is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1409 data[index] = cast(byte)((data[index] & 0xFF) | mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1410 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1411 data[index] = cast(byte)((data[index] & 0xFF) & (mask ^ -1)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1412 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1413 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1414 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1415 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1416 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1417 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1418 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1419 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1420 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1421 if (mask is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1422 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1423 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1424 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1425 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1426 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1427 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1428 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1429 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1430 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1431 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1432 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1433 * Sets the pixel values starting at offset <code>x</code> in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1434 * scanline <code>y</code> in the receiver's data to the |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1435 * values from the array <code>pixels</code> starting at |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1436 * <code>startIndex</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1437 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1438 * @param x the x position of the pixel to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1439 * @param y the y position of the pixel to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1440 * @param putWidth the width of the pixels to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1441 * @param pixels the pixels to set |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1442 * @param startIndex the index at which to begin setting |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1443 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1444 * @exception IndexOutOfBoundsException if putWidth is too large |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1445 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1446 * <li>ERROR_NULL_ARGUMENT - if pixels is null</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1447 * <li>ERROR_INVALID_ARGUMENT - if x or y is out of bounds</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1448 * <li>ERROR_INVALID_ARGUMENT - if putWidth is negative</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1449 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1450 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1451 * <li>ERROR_UNSUPPORTED_DEPTH if the depth is not one of 1, 2, 4, 8, 16, 24 or 32</li> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1452 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1453 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1454 public void setPixels(int x, int y, int putWidth, int[] pixels, int startIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1455 if (pixels is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1456 if (putWidth < 0 || x >= width || y >= height || x < 0 || y < 0) DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1457 if (putWidth is 0) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1458 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1459 int theByte; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1460 int mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1461 int n = putWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1462 int i = startIndex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1463 int pixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1464 int srcX = x, srcY = y; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1465 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1466 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1467 index = (y * bytesPerLine) + (x * 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1468 for (int j = 0; j < putWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1469 pixel = pixels[i]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1470 data[index] = cast(byte)((pixel >> 24) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1471 data[index + 1] = cast(byte)((pixel >> 16) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1472 data[index + 2] = cast(byte)((pixel >> 8) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1473 data[index + 3] = cast(byte)(pixel & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1474 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1475 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1476 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1477 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1478 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1479 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1480 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1481 index += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1482 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1483 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1484 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1485 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1486 index = (y * bytesPerLine) + (x * 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1487 for (int j = 0; j < putWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1488 pixel = pixels[i]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1489 data[index] = cast(byte)((pixel >> 16) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1490 data[index + 1] = cast(byte)((pixel >> 8) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1491 data[index + 2] = cast(byte)(pixel & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1492 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1493 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1494 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1495 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1496 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1497 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1498 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1499 index += 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1500 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1501 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1502 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1503 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1504 index = (y * bytesPerLine) + (x * 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1505 for (int j = 0; j < putWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1506 pixel = pixels[i]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1507 data[index] = cast(byte)(pixel & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1508 data[index + 1] = cast(byte)((pixel >> 8) & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1509 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1510 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1511 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1512 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1513 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1514 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1515 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1516 index += 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1517 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1518 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1519 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1520 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1521 index = (y * bytesPerLine) + x; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1522 for (int j = 0; j < putWidth; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1523 data[index] = cast(byte)(pixels[i] & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1524 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1525 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1526 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1527 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1528 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1529 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1530 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1531 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1532 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1533 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1534 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1535 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1536 index = (y * bytesPerLine) + (x >> 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1537 bool high = (x & 0x1) is 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1538 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1539 theByte = pixels[i] & 0x0F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1540 if (high) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1541 data[index] = cast(byte)((data[index] & 0x0F) | (theByte << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1542 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1543 data[index] = cast(byte)((data[index] & 0xF0) | theByte); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1544 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1545 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1546 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1547 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1548 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1549 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1550 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1551 high = true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1552 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1553 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1554 if (!high) index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1555 high = !high; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1556 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1557 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1558 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1559 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1560 byte [] masks = [ cast(byte)0xFC, cast(byte)0xF3, cast(byte)0xCF, cast(byte)0x3F ]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1561 index = (y * bytesPerLine) + (x >> 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1562 int offset = 3 - (x % 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1563 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1564 theByte = pixels[i] & 0x3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1565 data[index] = cast(byte)((data[index] & masks[offset]) | (theByte << (offset * 2))); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1566 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1567 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1568 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1569 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1570 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1571 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1572 offset = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1573 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1574 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1575 if (offset is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1576 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1577 offset = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1578 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1579 offset--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1580 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1581 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1582 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1583 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1584 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1585 index = (y * bytesPerLine) + (x >> 3); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1586 while (n > 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1587 mask = 1 << (7 - (srcX & 0x7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1588 if ((pixels[i] & 0x1) is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1589 data[index] = cast(byte)((data[index] & 0xFF) | mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1590 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1591 data[index] = cast(byte)((data[index] & 0xFF) & (mask ^ -1)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1592 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1593 i++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1594 n--; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1595 srcX++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1596 if (srcX >= width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1597 srcY++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1598 index = srcY * bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1599 srcX = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1600 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1601 if (mask is 1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1602 index++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1603 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1604 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1605 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1606 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1607 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1608 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1609 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1610 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1611 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1612 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1613 * Returns a palette with 2 colors: black & white. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1614 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1615 static PaletteData bwPalette() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1616 return new PaletteData( [ new RGB(0, 0, 0), new RGB(255, 255, 255) ] ); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1617 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1618 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1619 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1620 * Gets the offset of the most significant bit for |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1621 * the given mask. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1622 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1623 static int getMSBOffset(int mask) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1624 for (int i = 31; i >= 0; i--) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1625 if (((mask >> i) & 0x1) !is 0) return i + 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1626 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1627 return 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1628 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1629 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1630 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1631 * Finds the closest match. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1632 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1633 static int closestMatch(int depth, byte red, byte green, byte blue, int redMask, int greenMask, int blueMask, byte[] reds, byte[] greens, byte[] blues) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1634 if (depth > 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1635 int rshift = 32 - getMSBOffset(redMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1636 int gshift = 32 - getMSBOffset(greenMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1637 int bshift = 32 - getMSBOffset(blueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1638 return (((red << 24) >>> rshift) & redMask) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1639 (((green << 24) >>> gshift) & greenMask) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1640 (((blue << 24) >>> bshift) & blueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1641 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1642 int r, g, b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1643 int minDistance = 0x7fffffff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1644 int nearestPixel = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1645 int n = reds.length; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1646 for (int j = 0; j < n; j++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1647 r = (reds[j] & 0xFF) - (red & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1648 g = (greens[j] & 0xFF) - (green & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1649 b = (blues[j] & 0xFF) - (blue & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1650 int distance = r*r + g*g + b*b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1651 if (distance < minDistance) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1652 nearestPixel = j; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1653 if (distance is 0) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1654 minDistance = distance; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1655 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1656 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1657 return nearestPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1658 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1659 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1660 static final ImageData convertMask(ImageData mask) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1661 if (mask.depth is 1) return mask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1662 PaletteData palette = new PaletteData([new RGB(0, 0, 0), new RGB(255,255,255)]); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1663 ImageData newMask = new ImageData(mask.width, mask.height, 1, palette); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1664 /* Find index of black in mask palette */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1665 int blackIndex = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1666 RGB[] rgbs = mask.getRGBs(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1667 if (rgbs !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1668 while (blackIndex < rgbs.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1669 if (rgbs[blackIndex] is palette.colors[0] ) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1670 blackIndex++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1671 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1672 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1673 int[] pixels = new int[mask.width]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1674 for (int y = 0; y < mask.height; y++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1675 mask.getPixels(0, y, mask.width, pixels, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1676 for (int i = 0; i < pixels.length; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1677 if (pixels[i] is blackIndex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1678 pixels[i] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1679 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1680 pixels[i] = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1681 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1682 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1683 newMask.setPixels(0, y, mask.width, pixels, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1684 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1685 return newMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1686 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1687 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1688 static final byte[] convertPad(byte[] data, int width, int height, int depth, int pad, int newPad) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1689 if (pad is newPad) return data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1690 int stride = (width * depth + 7) / 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1691 int bpl = (stride + (pad - 1)) / pad * pad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1692 int newBpl = (stride + (newPad - 1)) / newPad * newPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1693 byte[] newData = new byte[height * newBpl]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1694 int srcIndex = 0, destIndex = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1695 for (int y = 0; y < height; y++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1696 System.arraycopy(data, srcIndex, newData, destIndex, stride); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1697 srcIndex += bpl; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1698 destIndex += newBpl; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1699 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1700 return newData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1701 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1702 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1703 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1704 * Blit operation bits to be OR'ed together to specify the desired operation. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1705 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1706 static const int |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1707 BLIT_SRC = 1, // copy source directly, else applies logic operations |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1708 BLIT_ALPHA = 2, // enable alpha blending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1709 BLIT_DITHER = 4; // enable dithering in low color modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1710 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1711 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1712 * Alpha mode, values 0 - 255 specify global alpha level |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1713 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1714 static const int |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1715 ALPHA_OPAQUE = 255, // Fully opaque (ignores any alpha data) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1716 ALPHA_TRANSPARENT = 0, // Fully transparent (ignores any alpha data) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1717 ALPHA_CHANNEL_SEPARATE = -1, // Use alpha channel from separate alphaData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1718 ALPHA_CHANNEL_SOURCE = -2, // Use alpha channel embedded in sourceData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1719 ALPHA_MASK_UNPACKED = -3, // Use transparency mask formed by bytes in alphaData (non-zero is opaque) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1720 ALPHA_MASK_PACKED = -4, // Use transparency mask formed by packed bits in alphaData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1721 ALPHA_MASK_INDEX = -5, // Consider source palette indices transparent if in alphaData array |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1722 ALPHA_MASK_RGB = -6; // Consider source RGBs transparent if in RGB888 format alphaData array |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1723 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1724 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1725 * Byte and bit order constants. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1726 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1727 static const int LSB_FIRST = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1728 static const int MSB_FIRST = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1729 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1730 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1731 * Data types (internal) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1732 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1733 private static const int |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1734 // direct / true color formats with arbitrary masks & shifts |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1735 TYPE_GENERIC_8 = 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1736 TYPE_GENERIC_16_MSB = 1, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1737 TYPE_GENERIC_16_LSB = 2, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1738 TYPE_GENERIC_24 = 3, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1739 TYPE_GENERIC_32_MSB = 4, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1740 TYPE_GENERIC_32_LSB = 5, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1741 // palette indexed color formats |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1742 TYPE_INDEX_8 = 6, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1743 TYPE_INDEX_4 = 7, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1744 TYPE_INDEX_2 = 8, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1745 TYPE_INDEX_1_MSB = 9, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1746 TYPE_INDEX_1_LSB = 10; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1747 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1748 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1749 * Blits a direct palette image into a direct palette image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1750 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1751 * Note: When the source and destination depth, order and masks |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1752 * are pairwise equal and the blitter operation is BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1753 * the masks are ignored. Hence when not changing the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1754 * data format, 0 may be specified for the masks. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1755 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1756 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1757 * @param op the blitter operation: a combination of BLIT_xxx flags |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1758 * (see BLIT_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1759 * @param srcData the source byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1760 * @param srcDepth the source depth: one of 8, 16, 24, 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1761 * @param srcStride the source number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1762 * @param srcOrder the source byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1763 * ignored if srcDepth is not 16 or 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1764 * @param srcX the top-left x-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1765 * @param srcY the top-left y-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1766 * @param srcWidth the width of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1767 * @param srcHeight the height of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1768 * @param srcRedMask the source red channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1769 * @param srcGreenMask the source green channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1770 * @param srcBlueMask the source blue channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1771 * @param alphaMode the alpha blending or mask mode, may be |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1772 * an integer 0-255 for global alpha; ignored if BLIT_ALPHA |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1773 * not specified in the blitter operations |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1774 * (see ALPHA_MODE_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1775 * @param alphaData the alpha blending or mask data, varies depending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1776 * on the value of alphaMode and sometimes ignored |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1777 * @param alphaStride the alpha data number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1778 * @param alphaX the top-left x-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1779 * @param alphaY the top-left y-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1780 * @param destData the destination byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1781 * @param destDepth the destination depth: one of 8, 16, 24, 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1782 * @param destStride the destination number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1783 * @param destOrder the destination byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1784 * ignored if destDepth is not 16 or 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1785 * @param destX the top-left x-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1786 * @param destY the top-left y-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1787 * @param destWidth the width of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1788 * @param destHeight the height of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1789 * @param destRedMask the destination red channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1790 * @param destGreenMask the destination green channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1791 * @param destBlueMask the destination blue channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1792 * @param flipX if true the resulting image is flipped along the vertical axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1793 * @param flipY if true the resulting image is flipped along the horizontal axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1794 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1795 static void blit(int op, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1796 byte[] srcData, int srcDepth, int srcStride, int srcOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1797 int srcX, int srcY, int srcWidth, int srcHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1798 int srcRedMask, int srcGreenMask, int srcBlueMask, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1799 int alphaMode, byte[] alphaData, int alphaStride, int alphaX, int alphaY, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1800 byte[] destData, int destDepth, int destStride, int destOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1801 int destX, int destY, int destWidth, int destHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1802 int destRedMask, int destGreenMask, int destBlueMask, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1803 bool flipX, bool flipY) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1804 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1805 static_this(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1806 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1807 if ((destWidth <= 0) || (destHeight <= 0) || (alphaMode is ALPHA_TRANSPARENT)) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1808 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1809 // these should be supplied as params later |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1810 const int srcAlphaMask = 0, destAlphaMask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1811 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1812 /*** Prepare scaling data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1813 int dwm1 = destWidth - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1814 int sfxi = (dwm1 !is 0) ? cast(int)(((cast(long)srcWidth << 16) - 1) / dwm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1815 int dhm1 = destHeight - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1816 int sfyi = (dhm1 !is 0) ? cast(int)(((cast(long)srcHeight << 16) - 1) / dhm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1817 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1818 /*** Prepare source-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1819 int sbpp, stype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1820 switch (srcDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1821 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1822 sbpp = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1823 stype = TYPE_GENERIC_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1824 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1825 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1826 sbpp = 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1827 stype = (srcOrder is MSB_FIRST) ? TYPE_GENERIC_16_MSB : TYPE_GENERIC_16_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1828 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1829 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1830 sbpp = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1831 stype = TYPE_GENERIC_24; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1832 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1833 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1834 sbpp = 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1835 stype = (srcOrder is MSB_FIRST) ? TYPE_GENERIC_32_MSB : TYPE_GENERIC_32_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1836 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1837 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1838 //throw new IllegalArgumentException("Invalid source type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1839 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1840 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1841 int spr = srcY * srcStride + srcX * sbpp; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1842 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1843 /*** Prepare destination-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1844 int dbpp, dtype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1845 switch (destDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1846 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1847 dbpp = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1848 dtype = TYPE_GENERIC_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1849 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1850 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1851 dbpp = 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1852 dtype = (destOrder is MSB_FIRST) ? TYPE_GENERIC_16_MSB : TYPE_GENERIC_16_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1853 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1854 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1855 dbpp = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1856 dtype = TYPE_GENERIC_24; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1857 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1858 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1859 dbpp = 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1860 dtype = (destOrder is MSB_FIRST) ? TYPE_GENERIC_32_MSB : TYPE_GENERIC_32_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1861 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1862 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1863 //throw new IllegalArgumentException("Invalid destination type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1864 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1865 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1866 int dpr = ((flipY) ? destY + dhm1 : destY) * destStride + ((flipX) ? destX + dwm1 : destX) * dbpp; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1867 int dprxi = (flipX) ? -dbpp : dbpp; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1868 int dpryi = (flipY) ? -destStride : destStride; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1869 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1870 /*** Prepare special processing data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1871 int apr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1872 if ((op & BLIT_ALPHA) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1873 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1874 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1875 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1876 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1877 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1878 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1879 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1880 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1881 alphaStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1882 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1883 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1884 case ALPHA_MASK_INDEX: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1885 //throw new IllegalArgumentException("Invalid alpha type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1886 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1887 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1888 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1889 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1890 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1891 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1892 alphaMode = (alphaMode << 16) / 255; // prescale |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1893 case ALPHA_CHANNEL_SOURCE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1894 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1895 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1896 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1897 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1898 alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1899 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1900 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1901 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1902 /*** Blit ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1903 int dp = dpr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1904 int sp = spr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1905 if ((alphaMode is 0x10000) && (stype is dtype) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1906 (srcRedMask is destRedMask) && (srcGreenMask is destGreenMask) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1907 (srcBlueMask is destBlueMask) && (srcAlphaMask is destAlphaMask)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1908 /*** Fast blit (straight copy) ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1909 switch (sbpp) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1910 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1911 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1912 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1913 destData[dp] = srcData[sp]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1914 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1915 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1916 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1917 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1918 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1919 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1920 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1921 destData[dp] = srcData[sp]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1922 destData[dp + 1] = srcData[sp + 1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1923 sp += (sfx >>> 16) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1924 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1925 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1926 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1927 case 3: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1928 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1929 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1930 destData[dp] = srcData[sp]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1931 destData[dp + 1] = srcData[sp + 1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1932 destData[dp + 2] = srcData[sp + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1933 sp += (sfx >>> 16) * 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1934 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1935 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1936 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1937 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1938 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1939 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1940 destData[dp] = srcData[sp]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1941 destData[dp + 1] = srcData[sp + 1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1942 destData[dp + 2] = srcData[sp + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1943 destData[dp + 3] = srcData[sp + 3]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1944 sp += (sfx >>> 16) * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1945 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1946 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1947 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1948 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1949 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1950 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1951 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1952 /*** Comprehensive blit (apply transformations) ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1953 int srcRedShift = getChannelShift(srcRedMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1954 byte[] srcReds = ANY_TO_EIGHT[getChannelWidth(srcRedMask, srcRedShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1955 int srcGreenShift = getChannelShift(srcGreenMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1956 byte[] srcGreens = ANY_TO_EIGHT[getChannelWidth(srcGreenMask, srcGreenShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1957 int srcBlueShift = getChannelShift(srcBlueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1958 byte[] srcBlues = ANY_TO_EIGHT[getChannelWidth(srcBlueMask, srcBlueShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1959 int srcAlphaShift = getChannelShift(srcAlphaMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1960 byte[] srcAlphas = ANY_TO_EIGHT[getChannelWidth(srcAlphaMask, srcAlphaShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1961 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1962 int destRedShift = getChannelShift(destRedMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1963 int destRedWidth = getChannelWidth(destRedMask, destRedShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1964 byte[] destReds = ANY_TO_EIGHT[destRedWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1965 int destRedPreShift = 8 - destRedWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1966 int destGreenShift = getChannelShift(destGreenMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1967 int destGreenWidth = getChannelWidth(destGreenMask, destGreenShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1968 byte[] destGreens = ANY_TO_EIGHT[destGreenWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1969 int destGreenPreShift = 8 - destGreenWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1970 int destBlueShift = getChannelShift(destBlueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1971 int destBlueWidth = getChannelWidth(destBlueMask, destBlueShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1972 byte[] destBlues = ANY_TO_EIGHT[destBlueWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1973 int destBluePreShift = 8 - destBlueWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1974 int destAlphaShift = getChannelShift(destAlphaMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1975 int destAlphaWidth = getChannelWidth(destAlphaMask, destAlphaShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1976 byte[] destAlphas = ANY_TO_EIGHT[destAlphaWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1977 int destAlphaPreShift = 8 - destAlphaWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1978 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1979 int ap = apr, alpha = alphaMode; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1980 int r = 0, g = 0, b = 0, a = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1981 int rq = 0, gq = 0, bq = 0, aq = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1982 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1983 sp = spr += (sfy >>> 16) * srcStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1984 ap = apr += (sfy >>> 16) * alphaStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1985 sfy = (sfy & 0xffff) + sfyi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1986 dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1987 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1988 dp += dprxi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1989 sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1990 /*** READ NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1991 switch (stype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1992 case TYPE_GENERIC_8: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1993 int data = srcData[sp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1994 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1995 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1996 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1997 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1998 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1999 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2000 case TYPE_GENERIC_16_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2001 int data = ((srcData[sp] & 0xff) << 8) | (srcData[sp + 1] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2002 sp += (sfx >>> 16) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2003 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2004 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2005 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2006 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2007 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2008 case TYPE_GENERIC_16_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2009 int data = ((srcData[sp + 1] & 0xff) << 8) | (srcData[sp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2010 sp += (sfx >>> 16) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2011 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2012 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2013 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2014 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2015 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2016 case TYPE_GENERIC_24: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2017 int data = (( ((srcData[sp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2018 (srcData[sp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2019 (srcData[sp + 2] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2020 sp += (sfx >>> 16) * 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2021 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2022 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2023 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2024 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2025 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2026 case TYPE_GENERIC_32_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2027 int data = (( (( ((srcData[sp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2028 (srcData[sp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2029 (srcData[sp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2030 (srcData[sp + 3] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2031 sp += (sfx >>> 16) * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2032 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2033 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2034 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2035 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2036 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2037 case TYPE_GENERIC_32_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2038 int data = (( (( ((srcData[sp + 3] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2039 (srcData[sp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2040 (srcData[sp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2041 (srcData[sp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2042 sp += (sfx >>> 16) * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2043 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2044 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2045 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2046 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2047 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2048 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2049 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2050 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2051 /*** DO SPECIAL PROCESSING IF REQUIRED ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2052 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2053 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2054 alpha = ((alphaData[ap] & 0xff) << 16) / 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2055 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2056 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2057 case ALPHA_CHANNEL_SOURCE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2058 alpha = (a << 16) / 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2059 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2060 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2061 alpha = (alphaData[ap] !is 0) ? 0x10000 : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2062 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2063 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2064 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2065 alpha = (alphaData[ap >> 3] << ((ap & 7) + 9)) & 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2066 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2067 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2068 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2069 alpha = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2070 for (int i = 0; i < alphaData.length; i += 3) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2071 if ((r is alphaData[i]) && (g is alphaData[i + 1]) && (b is alphaData[i + 2])) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2072 alpha = 0x0000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2073 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2074 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2075 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2076 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2077 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2078 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2079 if (alpha !is 0x10000) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2080 if (alpha is 0x0000) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2081 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2082 case TYPE_GENERIC_8: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2083 int data = destData[dp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2084 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2085 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2086 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2087 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2088 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2089 case TYPE_GENERIC_16_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2090 int data = ((destData[dp] & 0xff) << 8) | (destData[dp + 1] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2091 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2092 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2093 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2094 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2095 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2096 case TYPE_GENERIC_16_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2097 int data = ((destData[dp + 1] & 0xff) << 8) | (destData[dp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2098 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2099 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2100 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2101 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2102 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2103 case TYPE_GENERIC_24: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2104 int data = (( ((destData[dp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2105 (destData[dp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2106 (destData[dp + 2] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2107 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2108 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2109 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2110 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2111 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2112 case TYPE_GENERIC_32_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2113 int data = (( (( ((destData[dp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2114 (destData[dp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2115 (destData[dp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2116 (destData[dp + 3] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2117 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2118 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2119 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2120 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2121 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2122 case TYPE_GENERIC_32_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2123 int data = (( (( ((destData[dp + 3] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2124 (destData[dp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2125 (destData[dp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2126 (destData[dp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2127 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2128 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2129 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2130 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2131 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2132 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2133 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2134 // Perform alpha blending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2135 a = aq + ((a - aq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2136 r = rq + ((r - rq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2137 g = gq + ((g - gq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2138 b = bq + ((b - bq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2139 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2140 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2141 /*** WRITE NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2142 int data = |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2143 (r >>> destRedPreShift << destRedShift) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2144 (g >>> destGreenPreShift << destGreenShift) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2145 (b >>> destBluePreShift << destBlueShift) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2146 (a >>> destAlphaPreShift << destAlphaShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2147 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2148 case TYPE_GENERIC_8: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2149 destData[dp] = cast(byte) data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2150 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2151 case TYPE_GENERIC_16_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2152 destData[dp] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2153 destData[dp + 1] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2154 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2155 case TYPE_GENERIC_16_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2156 destData[dp] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2157 destData[dp + 1] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2158 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2159 case TYPE_GENERIC_24: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2160 destData[dp] = cast(byte) (data >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2161 destData[dp + 1] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2162 destData[dp + 2] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2163 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2164 case TYPE_GENERIC_32_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2165 destData[dp] = cast(byte) (data >>> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2166 destData[dp + 1] = cast(byte) (data >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2167 destData[dp + 2] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2168 destData[dp + 3] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2169 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2170 case TYPE_GENERIC_32_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2171 destData[dp] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2172 destData[dp + 1] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2173 destData[dp + 2] = cast(byte) (data >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2174 destData[dp + 3] = cast(byte) (data >>> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2175 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2176 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2177 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2178 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2179 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2180 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2181 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2182 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2183 * Blits an index palette image into an index palette image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2184 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2185 * Note: The source and destination red, green, and blue |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2186 * arrays may be null if no alpha blending or dither is to be |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2187 * performed. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2188 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2189 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2190 * @param op the blitter operation: a combination of BLIT_xxx flags |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2191 * (see BLIT_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2192 * @param srcData the source byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2193 * @param srcDepth the source depth: one of 1, 2, 4, 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2194 * @param srcStride the source number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2195 * @param srcOrder the source byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2196 * ignored if srcDepth is not 1 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2197 * @param srcX the top-left x-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2198 * @param srcY the top-left y-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2199 * @param srcWidth the width of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2200 * @param srcHeight the height of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2201 * @param srcReds the source palette red component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2202 * @param srcGreens the source palette green component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2203 * @param srcBlues the source palette blue component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2204 * @param alphaMode the alpha blending or mask mode, may be |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2205 * an integer 0-255 for global alpha; ignored if BLIT_ALPHA |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2206 * not specified in the blitter operations |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2207 * (see ALPHA_MODE_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2208 * @param alphaData the alpha blending or mask data, varies depending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2209 * on the value of alphaMode and sometimes ignored |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2210 * @param alphaStride the alpha data number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2211 * @param alphaX the top-left x-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2212 * @param alphaY the top-left y-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2213 * @param destData the destination byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2214 * @param destDepth the destination depth: one of 1, 2, 4, 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2215 * @param destStride the destination number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2216 * @param destOrder the destination byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2217 * ignored if destDepth is not 1 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2218 * @param destX the top-left x-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2219 * @param destY the top-left y-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2220 * @param destWidth the width of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2221 * @param destHeight the height of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2222 * @param destReds the destination palette red component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2223 * @param destGreens the destination palette green component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2224 * @param destBlues the destination palette blue component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2225 * @param flipX if true the resulting image is flipped along the vertical axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2226 * @param flipY if true the resulting image is flipped along the horizontal axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2227 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2228 static void blit(int op, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2229 byte[] srcData, int srcDepth, int srcStride, int srcOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2230 int srcX, int srcY, int srcWidth, int srcHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2231 byte[] srcReds, byte[] srcGreens, byte[] srcBlues, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2232 int alphaMode, byte[] alphaData, int alphaStride, int alphaX, int alphaY, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2233 byte[] destData, int destDepth, int destStride, int destOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2234 int destX, int destY, int destWidth, int destHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2235 byte[] destReds, byte[] destGreens, byte[] destBlues, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2236 bool flipX, bool flipY) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2237 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2238 static_this(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2239 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2240 if ((destWidth <= 0) || (destHeight <= 0) || (alphaMode is ALPHA_TRANSPARENT)) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2241 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2242 /*** Prepare scaling data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2243 int dwm1 = destWidth - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2244 int sfxi = (dwm1 !is 0) ? cast(int)(((cast(long)srcWidth << 16) - 1) / dwm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2245 int dhm1 = destHeight - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2246 int sfyi = (dhm1 !is 0) ? cast(int)(((cast(long)srcHeight << 16) - 1) / dhm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2247 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2248 /*** Prepare source-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2249 int stype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2250 switch (srcDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2251 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2252 stype = TYPE_INDEX_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2253 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2254 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2255 srcStride <<= 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2256 stype = TYPE_INDEX_4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2257 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2258 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2259 srcStride <<= 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2260 stype = TYPE_INDEX_2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2261 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2262 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2263 srcStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2264 stype = (srcOrder is MSB_FIRST) ? TYPE_INDEX_1_MSB : TYPE_INDEX_1_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2265 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2266 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2267 //throw new IllegalArgumentException("Invalid source type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2268 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2269 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2270 int spr = srcY * srcStride + srcX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2271 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2272 /*** Prepare destination-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2273 int dtype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2274 switch (destDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2275 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2276 dtype = TYPE_INDEX_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2277 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2278 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2279 destStride <<= 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2280 dtype = TYPE_INDEX_4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2281 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2282 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2283 destStride <<= 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2284 dtype = TYPE_INDEX_2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2285 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2286 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2287 destStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2288 dtype = (destOrder is MSB_FIRST) ? TYPE_INDEX_1_MSB : TYPE_INDEX_1_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2289 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2290 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2291 //throw new IllegalArgumentException("Invalid source type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2292 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2293 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2294 int dpr = ((flipY) ? destY + dhm1 : destY) * destStride + ((flipX) ? destX + dwm1 : destX); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2295 int dprxi = (flipX) ? -1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2296 int dpryi = (flipY) ? -destStride : destStride; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2297 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2298 /*** Prepare special processing data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2299 int apr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2300 if ((op & BLIT_ALPHA) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2301 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2302 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2303 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2304 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2305 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2306 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2307 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2308 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2309 alphaStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2310 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2311 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2312 case ALPHA_MASK_INDEX: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2313 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2314 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2315 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2316 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2317 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2318 alphaMode = (alphaMode << 16) / 255; // prescale |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2319 case ALPHA_CHANNEL_SOURCE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2320 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2321 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2322 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2323 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2324 alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2325 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2326 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2327 bool ditherEnabled = (op & BLIT_DITHER) !is 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2328 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2329 /*** Blit ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2330 int dp = dpr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2331 int sp = spr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2332 int ap = apr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2333 int destPaletteSize = 1 << destDepth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2334 if ((destReds !is null) && (destReds.length < destPaletteSize)) destPaletteSize = destReds.length; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2335 byte[] paletteMapping = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2336 bool isExactPaletteMapping = true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2337 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2338 case 0x10000: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2339 /*** If the palettes and formats are equivalent use a one-to-one mapping ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2340 if ((stype is dtype) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2341 (srcReds is destReds) && (srcGreens is destGreens) && (srcBlues is destBlues)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2342 paletteMapping = ONE_TO_ONE_MAPPING; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2343 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2344 /*** If palettes have not been supplied, supply a suitable mapping ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2345 } else if ((srcReds is null) || (destReds is null)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2346 if (srcDepth <= destDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2347 paletteMapping = ONE_TO_ONE_MAPPING; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2348 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2349 paletteMapping = new byte[1 << srcDepth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2350 int mask = (0xff << destDepth) >>> 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2351 for (int i = 0; i < paletteMapping.length; ++i) paletteMapping[i] = cast(byte)(i & mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2352 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2353 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2354 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2355 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2356 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2357 case ALPHA_MASK_INDEX: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2358 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2359 /*** Generate a palette mapping ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2360 int srcPaletteSize = 1 << srcDepth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2361 paletteMapping = new byte[srcPaletteSize]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2362 if ((srcReds !is null) && (srcReds.length < srcPaletteSize)) srcPaletteSize = srcReds.length; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2363 for (int i = 0, r, g, b, index; i < srcPaletteSize; ++i) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2364 r = srcReds[i] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2365 g = srcGreens[i] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2366 b = srcBlues[i] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2367 index = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2368 int minDistance = 0x7fffffff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2369 for (int j = 0, dr, dg, db, distance; j < destPaletteSize; ++j) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2370 dr = (destReds[j] & 0xff) - r; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2371 dg = (destGreens[j] & 0xff) - g; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2372 db = (destBlues[j] & 0xff) - b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2373 distance = dr * dr + dg * dg + db * db; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2374 if (distance < minDistance) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2375 index = j; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2376 if (distance is 0) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2377 minDistance = distance; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2378 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2379 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2380 paletteMapping[i] = cast(byte)index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2381 if (minDistance !is 0) isExactPaletteMapping = false; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2382 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2383 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2384 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2385 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2386 if ((paletteMapping !is null) && (isExactPaletteMapping || ! ditherEnabled)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2387 if ((stype is dtype) && (alphaMode is 0x10000)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2388 /*** Fast blit (copy w/ mapping) ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2389 switch (stype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2390 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2391 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2392 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2393 destData[dp] = paletteMapping[srcData[sp] & 0xff]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2394 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2395 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2396 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2397 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2398 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2399 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2400 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2401 int v; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2402 if ((sp & 1) !is 0) v = paletteMapping[srcData[sp >> 1] & 0x0f]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2403 else v = (srcData[sp >> 1] >>> 4) & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2404 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2405 if ((dp & 1) !is 0) destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0xf0) | v); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2406 else destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0x0f) | (v << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2407 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2408 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2409 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2410 case TYPE_INDEX_2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2411 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2412 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2413 int index = paletteMapping[(srcData[sp >> 2] >>> (6 - (sp & 3) * 2)) & 0x03]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2414 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2415 int shift = 6 - (dp & 3) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2416 destData[dp >> 2] = cast(byte)(destData[dp >> 2] & ~(0x03 << shift) | (index << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2417 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2418 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2419 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2420 case TYPE_INDEX_1_MSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2421 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2422 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2423 int index = paletteMapping[(srcData[sp >> 3] >>> (7 - (sp & 7))) & 0x01]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2424 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2425 int shift = 7 - (dp & 7); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2426 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (index << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2427 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2428 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2429 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2430 case TYPE_INDEX_1_LSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2431 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, sp = spr += (sfy >>> 16) * srcStride, sfy = (sfy & 0xffff) + sfyi, dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2432 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, dp += dprxi, sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2433 int index = paletteMapping[(srcData[sp >> 3] >>> (sp & 7)) & 0x01]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2434 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2435 int shift = dp & 7; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2436 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (index << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2437 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2438 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2439 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2440 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2441 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2442 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2443 /*** Convert between indexed modes using mapping and mask ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2444 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2445 sp = spr += (sfy >>> 16) * srcStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2446 sfy = (sfy & 0xffff) + sfyi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2447 dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2448 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2449 dp += dprxi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2450 sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2451 int index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2452 /*** READ NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2453 switch (stype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2454 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2455 index = srcData[sp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2456 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2457 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2458 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2459 if ((sp & 1) !is 0) index = srcData[sp >> 1] & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2460 else index = (srcData[sp >> 1] >>> 4) & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2461 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2462 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2463 case TYPE_INDEX_2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2464 index = (srcData[sp >> 2] >>> (6 - (sp & 3) * 2)) & 0x03; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2465 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2466 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2467 case TYPE_INDEX_1_MSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2468 index = (srcData[sp >> 3] >>> (7 - (sp & 7))) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2469 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2470 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2471 case TYPE_INDEX_1_LSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2472 index = (srcData[sp >> 3] >>> (sp & 7)) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2473 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2474 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2475 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2476 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2477 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2478 /*** APPLY MASK ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2479 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2480 case ALPHA_MASK_UNPACKED: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2481 byte mask = alphaData[ap]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2482 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2483 if (mask is 0) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2484 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2485 case ALPHA_MASK_PACKED: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2486 int mask = alphaData[ap >> 3] & (1 << (ap & 7)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2487 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2488 if (mask is 0) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2489 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2490 case ALPHA_MASK_INDEX: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2491 int i = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2492 while (i < alphaData.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2493 if (index is (alphaData[i] & 0xff)) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2494 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2495 if (i < alphaData.length) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2496 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2497 case ALPHA_MASK_RGB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2498 byte r = srcReds[index], g = srcGreens[index], b = srcBlues[index]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2499 int i = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2500 while (i < alphaData.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2501 if ((r is alphaData[i]) && (g is alphaData[i + 1]) && (b is alphaData[i + 2])) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2502 i += 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2503 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2504 if (i < alphaData.length) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2505 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2506 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2507 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2508 index = paletteMapping[index] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2509 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2510 /*** WRITE NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2511 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2512 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2513 destData[dp] = cast(byte) index; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2514 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2515 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2516 if ((dp & 1) !is 0) destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0xf0) | index); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2517 else destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0x0f) | (index << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2518 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2519 case TYPE_INDEX_2: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2520 int shift = 6 - (dp & 3) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2521 destData[dp >> 2] = cast(byte)(destData[dp >> 2] & ~(0x03 << shift) | (index << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2522 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2523 case TYPE_INDEX_1_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2524 int shift = 7 - (dp & 7); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2525 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (index << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2526 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2527 case TYPE_INDEX_1_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2528 int shift = dp & 7; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2529 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (index << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2530 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2531 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2532 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2533 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2534 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2535 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2536 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2537 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2538 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2539 /*** Comprehensive blit (apply transformations) ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2540 int alpha = alphaMode; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2541 int index = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2542 int indexq = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2543 int lastindex = 0, lastr = -1, lastg = -1, lastb = -1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2544 int[] rerr, gerr, berr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2545 if (ditherEnabled) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2546 rerr = new int[destWidth + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2547 gerr = new int[destWidth + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2548 berr = new int[destWidth + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2549 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2550 rerr = null; gerr = null; berr = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2551 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2552 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2553 sp = spr += (sfy >>> 16) * srcStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2554 ap = apr += (sfy >>> 16) * alphaStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2555 sfy = (sfy & 0xffff) + sfyi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2556 dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2557 int lrerr = 0, lgerr = 0, lberr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2558 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2559 dp += dprxi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2560 sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2561 /*** READ NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2562 switch (stype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2563 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2564 index = srcData[sp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2565 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2566 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2567 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2568 if ((sp & 1) !is 0) index = srcData[sp >> 1] & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2569 else index = (srcData[sp >> 1] >>> 4) & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2570 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2571 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2572 case TYPE_INDEX_2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2573 index = (srcData[sp >> 2] >>> (6 - (sp & 3) * 2)) & 0x03; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2574 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2575 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2576 case TYPE_INDEX_1_MSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2577 index = (srcData[sp >> 3] >>> (7 - (sp & 7))) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2578 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2579 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2580 case TYPE_INDEX_1_LSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2581 index = (srcData[sp >> 3] >>> (sp & 7)) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2582 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2583 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2584 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2585 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2586 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2587 /*** DO SPECIAL PROCESSING IF REQUIRED ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2588 int r = srcReds[index] & 0xff, g = srcGreens[index] & 0xff, b = srcBlues[index] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2589 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2590 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2591 alpha = ((alphaData[ap] & 0xff) << 16) / 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2592 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2593 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2594 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2595 alpha = (alphaData[ap] !is 0) ? 0x10000 : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2596 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2597 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2598 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2599 alpha = (alphaData[ap >> 3] << ((ap & 7) + 9)) & 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2600 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2601 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2602 case ALPHA_MASK_INDEX: { // could speed up using binary search if we sorted the indices |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2603 int i = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2604 while (i < alphaData.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2605 if (index is (alphaData[i] & 0xff)) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2606 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2607 if (i < alphaData.length) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2608 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2609 case ALPHA_MASK_RGB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2610 int i = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2611 while (i < alphaData.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2612 if ((r is (alphaData[i] & 0xff)) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2613 (g is (alphaData[i + 1] & 0xff)) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2614 (b is (alphaData[i + 2] & 0xff))) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2615 i += 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2616 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2617 if (i < alphaData.length) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2618 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2619 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2620 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2621 if (alpha !is 0x10000) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2622 if (alpha is 0x0000) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2623 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2624 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2625 indexq = destData[dp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2626 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2627 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2628 if ((dp & 1) !is 0) indexq = destData[dp >> 1] & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2629 else indexq = (destData[dp >> 1] >>> 4) & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2630 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2631 case TYPE_INDEX_2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2632 indexq = (destData[dp >> 2] >>> (6 - (dp & 3) * 2)) & 0x03; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2633 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2634 case TYPE_INDEX_1_MSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2635 indexq = (destData[dp >> 3] >>> (7 - (dp & 7))) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2636 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2637 case TYPE_INDEX_1_LSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2638 indexq = (destData[dp >> 3] >>> (dp & 7)) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2639 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2640 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2641 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2642 // Perform alpha blending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2643 int rq = destReds[indexq] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2644 int gq = destGreens[indexq] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2645 int bq = destBlues[indexq] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2646 r = rq + ((r - rq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2647 g = gq + ((g - gq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2648 b = bq + ((b - bq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2649 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2650 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2651 /*** MAP COLOR TO THE PALETTE ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2652 if (ditherEnabled) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2653 // Floyd-Steinberg error diffusion |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2654 r += rerr[dx] >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2655 if (r < 0) r = 0; else if (r > 255) r = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2656 g += gerr[dx] >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2657 if (g < 0) g = 0; else if (g > 255) g = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2658 b += berr[dx] >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2659 if (b < 0) b = 0; else if (b > 255) b = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2660 rerr[dx] = lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2661 gerr[dx] = lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2662 berr[dx] = lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2663 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2664 if (r !is lastr || g !is lastg || b !is lastb) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2665 // moving the variable declarations out seems to make the JDK JIT happier... |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2666 for (int j = 0, dr, dg, db, distance, minDistance = 0x7fffffff; j < destPaletteSize; ++j) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2667 dr = (destReds[j] & 0xff) - r; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2668 dg = (destGreens[j] & 0xff) - g; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2669 db = (destBlues[j] & 0xff) - b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2670 distance = dr * dr + dg * dg + db * db; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2671 if (distance < minDistance) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2672 lastindex = j; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2673 if (distance is 0) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2674 minDistance = distance; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2675 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2676 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2677 lastr = r; lastg = g; lastb = b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2678 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2679 if (ditherEnabled) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2680 // Floyd-Steinberg error diffusion, cont'd... |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2681 int dxm1 = dx - 1, dxp1 = dx + 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2682 int acc; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2683 rerr[dxp1] += acc = (lrerr = r - (destReds[lastindex] & 0xff)) + lrerr + lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2684 rerr[dx] += acc += lrerr + lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2685 rerr[dxm1] += acc + lrerr + lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2686 gerr[dxp1] += acc = (lgerr = g - (destGreens[lastindex] & 0xff)) + lgerr + lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2687 gerr[dx] += acc += lgerr + lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2688 gerr[dxm1] += acc + lgerr + lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2689 berr[dxp1] += acc = (lberr = b - (destBlues[lastindex] & 0xff)) + lberr + lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2690 berr[dx] += acc += lberr + lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2691 berr[dxm1] += acc + lberr + lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2692 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2693 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2694 /*** WRITE NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2695 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2696 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2697 destData[dp] = cast(byte) lastindex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2698 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2699 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2700 if ((dp & 1) !is 0) destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0xf0) | lastindex); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2701 else destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0x0f) | (lastindex << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2702 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2703 case TYPE_INDEX_2: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2704 int shift = 6 - (dp & 3) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2705 destData[dp >> 2] = cast(byte)(destData[dp >> 2] & ~(0x03 << shift) | (lastindex << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2706 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2707 case TYPE_INDEX_1_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2708 int shift = 7 - (dp & 7); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2709 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (lastindex << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2710 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2711 case TYPE_INDEX_1_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2712 int shift = dp & 7; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2713 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (lastindex << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2714 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2715 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2716 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2717 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2718 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2719 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2720 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2721 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2722 * Blits an index palette image into a direct palette image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2723 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2724 * Note: The source and destination masks and palettes must |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2725 * always be fully specified. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2726 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2727 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2728 * @param op the blitter operation: a combination of BLIT_xxx flags |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2729 * (see BLIT_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2730 * @param srcData the source byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2731 * @param srcDepth the source depth: one of 1, 2, 4, 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2732 * @param srcStride the source number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2733 * @param srcOrder the source byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2734 * ignored if srcDepth is not 1 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2735 * @param srcX the top-left x-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2736 * @param srcY the top-left y-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2737 * @param srcWidth the width of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2738 * @param srcHeight the height of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2739 * @param srcReds the source palette red component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2740 * @param srcGreens the source palette green component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2741 * @param srcBlues the source palette blue component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2742 * @param alphaMode the alpha blending or mask mode, may be |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2743 * an integer 0-255 for global alpha; ignored if BLIT_ALPHA |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2744 * not specified in the blitter operations |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2745 * (see ALPHA_MODE_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2746 * @param alphaData the alpha blending or mask data, varies depending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2747 * on the value of alphaMode and sometimes ignored |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2748 * @param alphaStride the alpha data number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2749 * @param alphaX the top-left x-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2750 * @param alphaY the top-left y-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2751 * @param destData the destination byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2752 * @param destDepth the destination depth: one of 8, 16, 24, 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2753 * @param destStride the destination number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2754 * @param destOrder the destination byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2755 * ignored if destDepth is not 16 or 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2756 * @param destX the top-left x-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2757 * @param destY the top-left y-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2758 * @param destWidth the width of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2759 * @param destHeight the height of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2760 * @param destRedMask the destination red channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2761 * @param destGreenMask the destination green channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2762 * @param destBlueMask the destination blue channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2763 * @param flipX if true the resulting image is flipped along the vertical axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2764 * @param flipY if true the resulting image is flipped along the horizontal axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2765 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2766 static void blit(int op, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2767 byte[] srcData, int srcDepth, int srcStride, int srcOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2768 int srcX, int srcY, int srcWidth, int srcHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2769 byte[] srcReds, byte[] srcGreens, byte[] srcBlues, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2770 int alphaMode, byte[] alphaData, int alphaStride, int alphaX, int alphaY, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2771 byte[] destData, int destDepth, int destStride, int destOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2772 int destX, int destY, int destWidth, int destHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2773 int destRedMask, int destGreenMask, int destBlueMask, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2774 bool flipX, bool flipY) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2775 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2776 static_this(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2777 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2778 if ((destWidth <= 0) || (destHeight <= 0) || (alphaMode is ALPHA_TRANSPARENT)) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2779 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2780 // these should be supplied as params later |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2781 int destAlphaMask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2782 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2783 /*** Prepare scaling data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2784 int dwm1 = destWidth - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2785 int sfxi = (dwm1 !is 0) ? cast(int)(((cast(long)srcWidth << 16) - 1) / dwm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2786 int dhm1 = destHeight - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2787 int sfyi = (dhm1 !is 0) ? cast(int)(((cast(long)srcHeight << 16) - 1) / dhm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2788 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2789 /*** Prepare source-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2790 int stype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2791 switch (srcDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2792 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2793 stype = TYPE_INDEX_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2794 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2795 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2796 srcStride <<= 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2797 stype = TYPE_INDEX_4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2798 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2799 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2800 srcStride <<= 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2801 stype = TYPE_INDEX_2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2802 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2803 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2804 srcStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2805 stype = (srcOrder is MSB_FIRST) ? TYPE_INDEX_1_MSB : TYPE_INDEX_1_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2806 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2807 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2808 //throw new IllegalArgumentException("Invalid source type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2809 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2810 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2811 int spr = srcY * srcStride + srcX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2812 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2813 /*** Prepare destination-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2814 int dbpp, dtype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2815 switch (destDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2816 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2817 dbpp = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2818 dtype = TYPE_GENERIC_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2819 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2820 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2821 dbpp = 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2822 dtype = (destOrder is MSB_FIRST) ? TYPE_GENERIC_16_MSB : TYPE_GENERIC_16_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2823 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2824 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2825 dbpp = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2826 dtype = TYPE_GENERIC_24; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2827 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2828 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2829 dbpp = 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2830 dtype = (destOrder is MSB_FIRST) ? TYPE_GENERIC_32_MSB : TYPE_GENERIC_32_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2831 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2832 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2833 //throw new IllegalArgumentException("Invalid destination type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2834 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2835 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2836 int dpr = ((flipY) ? destY + dhm1 : destY) * destStride + ((flipX) ? destX + dwm1 : destX) * dbpp; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2837 int dprxi = (flipX) ? -dbpp : dbpp; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2838 int dpryi = (flipY) ? -destStride : destStride; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2839 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2840 /*** Prepare special processing data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2841 int apr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2842 if ((op & BLIT_ALPHA) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2843 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2844 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2845 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2846 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2847 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2848 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2849 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2850 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2851 alphaStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2852 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2853 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2854 case ALPHA_MASK_INDEX: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2855 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2856 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2857 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2858 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2859 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2860 alphaMode = (alphaMode << 16) / 255; // prescale |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2861 case ALPHA_CHANNEL_SOURCE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2862 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2863 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2864 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2865 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2866 alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2867 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2868 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2869 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2870 /*** Comprehensive blit (apply transformations) ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2871 int destRedShift = getChannelShift(destRedMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2872 int destRedWidth = getChannelWidth(destRedMask, destRedShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2873 byte[] destReds = ANY_TO_EIGHT[destRedWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2874 int destRedPreShift = 8 - destRedWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2875 int destGreenShift = getChannelShift(destGreenMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2876 int destGreenWidth = getChannelWidth(destGreenMask, destGreenShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2877 byte[] destGreens = ANY_TO_EIGHT[destGreenWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2878 int destGreenPreShift = 8 - destGreenWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2879 int destBlueShift = getChannelShift(destBlueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2880 int destBlueWidth = getChannelWidth(destBlueMask, destBlueShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2881 byte[] destBlues = ANY_TO_EIGHT[destBlueWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2882 int destBluePreShift = 8 - destBlueWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2883 int destAlphaShift = getChannelShift(destAlphaMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2884 int destAlphaWidth = getChannelWidth(destAlphaMask, destAlphaShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2885 byte[] destAlphas = ANY_TO_EIGHT[destAlphaWidth]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2886 int destAlphaPreShift = 8 - destAlphaWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2887 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2888 int dp = dpr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2889 int sp = spr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2890 int ap = apr, alpha = alphaMode; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2891 int r = 0, g = 0, b = 0, a = 0, index = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2892 int rq = 0, gq = 0, bq = 0, aq = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2893 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2894 sp = spr += (sfy >>> 16) * srcStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2895 ap = apr += (sfy >>> 16) * alphaStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2896 sfy = (sfy & 0xffff) + sfyi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2897 dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2898 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2899 dp += dprxi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2900 sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2901 /*** READ NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2902 switch (stype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2903 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2904 index = srcData[sp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2905 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2906 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2907 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2908 if ((sp & 1) !is 0) index = srcData[sp >> 1] & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2909 else index = (srcData[sp >> 1] >>> 4) & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2910 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2911 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2912 case TYPE_INDEX_2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2913 index = (srcData[sp >> 2] >>> (6 - (sp & 3) * 2)) & 0x03; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2914 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2915 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2916 case TYPE_INDEX_1_MSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2917 index = (srcData[sp >> 3] >>> (7 - (sp & 7))) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2918 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2919 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2920 case TYPE_INDEX_1_LSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2921 index = (srcData[sp >> 3] >>> (sp & 7)) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2922 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2923 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2924 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2925 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2926 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2927 /*** DO SPECIAL PROCESSING IF REQUIRED ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2928 r = srcReds[index] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2929 g = srcGreens[index] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2930 b = srcBlues[index] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2931 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2932 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2933 alpha = ((alphaData[ap] & 0xff) << 16) / 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2934 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2935 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2936 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2937 alpha = (alphaData[ap] !is 0) ? 0x10000 : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2938 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2939 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2940 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2941 alpha = (alphaData[ap >> 3] << ((ap & 7) + 9)) & 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2942 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2943 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2944 case ALPHA_MASK_INDEX: { // could speed up using binary search if we sorted the indices |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2945 int i = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2946 while (i < alphaData.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2947 if (index is (alphaData[i] & 0xff)) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2948 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2949 if (i < alphaData.length) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2950 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2951 case ALPHA_MASK_RGB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2952 int i = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2953 while (i < alphaData.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2954 if ((r is (alphaData[i] & 0xff)) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2955 (g is (alphaData[i + 1] & 0xff)) && |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2956 (b is (alphaData[i + 2] & 0xff))) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2957 i += 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2958 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2959 if (i < alphaData.length) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2960 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2961 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2962 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2963 if (alpha !is 0x10000) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2964 if (alpha is 0x0000) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2965 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2966 case TYPE_GENERIC_8: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2967 int data = destData[dp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2968 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2969 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2970 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2971 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2972 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2973 case TYPE_GENERIC_16_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2974 int data = ((destData[dp] & 0xff) << 8) | (destData[dp + 1] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2975 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2976 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2977 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2978 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2979 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2980 case TYPE_GENERIC_16_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2981 int data = ((destData[dp + 1] & 0xff) << 8) | (destData[dp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2982 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2983 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2984 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2985 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2986 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2987 case TYPE_GENERIC_24: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2988 int data = (( ((destData[dp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2989 (destData[dp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2990 (destData[dp + 2] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2991 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2992 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2993 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2994 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2995 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2996 case TYPE_GENERIC_32_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2997 int data = (( (( ((destData[dp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2998 (destData[dp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2999 (destData[dp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3000 (destData[dp + 3] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3001 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3002 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3003 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3004 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3005 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3006 case TYPE_GENERIC_32_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3007 int data = (( (( ((destData[dp + 3] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3008 (destData[dp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3009 (destData[dp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3010 (destData[dp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3011 rq = destReds[(data & destRedMask) >>> destRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3012 gq = destGreens[(data & destGreenMask) >>> destGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3013 bq = destBlues[(data & destBlueMask) >>> destBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3014 aq = destAlphas[(data & destAlphaMask) >>> destAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3015 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3016 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3017 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3018 // Perform alpha blending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3019 a = aq + ((a - aq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3020 r = rq + ((r - rq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3021 g = gq + ((g - gq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3022 b = bq + ((b - bq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3023 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3024 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3025 /*** WRITE NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3026 int data = |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3027 (r >>> destRedPreShift << destRedShift) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3028 (g >>> destGreenPreShift << destGreenShift) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3029 (b >>> destBluePreShift << destBlueShift) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3030 (a >>> destAlphaPreShift << destAlphaShift); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3031 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3032 case TYPE_GENERIC_8: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3033 destData[dp] = cast(byte) data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3034 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3035 case TYPE_GENERIC_16_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3036 destData[dp] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3037 destData[dp + 1] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3038 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3039 case TYPE_GENERIC_16_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3040 destData[dp] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3041 destData[dp + 1] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3042 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3043 case TYPE_GENERIC_24: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3044 destData[dp] = cast(byte) (data >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3045 destData[dp + 1] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3046 destData[dp + 2] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3047 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3048 case TYPE_GENERIC_32_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3049 destData[dp] = cast(byte) (data >>> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3050 destData[dp + 1] = cast(byte) (data >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3051 destData[dp + 2] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3052 destData[dp + 3] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3053 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3054 case TYPE_GENERIC_32_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3055 destData[dp] = cast(byte) (data & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3056 destData[dp + 1] = cast(byte) (data >>> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3057 destData[dp + 2] = cast(byte) (data >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3058 destData[dp + 3] = cast(byte) (data >>> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3059 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3060 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3061 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3062 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3063 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3064 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3065 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3066 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3067 * Blits a direct palette image into an index palette image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3068 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3069 * Note: The source and destination masks and palettes must |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3070 * always be fully specified. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3071 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3072 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3073 * @param op the blitter operation: a combination of BLIT_xxx flags |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3074 * (see BLIT_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3075 * @param srcData the source byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3076 * @param srcDepth the source depth: one of 8, 16, 24, 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3077 * @param srcStride the source number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3078 * @param srcOrder the source byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3079 * ignored if srcDepth is not 16 or 32 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3080 * @param srcX the top-left x-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3081 * @param srcY the top-left y-coord of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3082 * @param srcWidth the width of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3083 * @param srcHeight the height of the source blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3084 * @param srcRedMask the source red channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3085 * @param srcGreenMask the source green channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3086 * @param srcBlueMask the source blue channel mask |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3087 * @param alphaMode the alpha blending or mask mode, may be |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3088 * an integer 0-255 for global alpha; ignored if BLIT_ALPHA |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3089 * not specified in the blitter operations |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3090 * (see ALPHA_MODE_xxx constants) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3091 * @param alphaData the alpha blending or mask data, varies depending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3092 * on the value of alphaMode and sometimes ignored |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3093 * @param alphaStride the alpha data number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3094 * @param alphaX the top-left x-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3095 * @param alphaY the top-left y-coord of the alpha blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3096 * @param destData the destination byte array containing image data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3097 * @param destDepth the destination depth: one of 1, 2, 4, 8 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3098 * @param destStride the destination number of bytes per line |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3099 * @param destOrder the destination byte ordering: one of MSB_FIRST or LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3100 * ignored if destDepth is not 1 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3101 * @param destX the top-left x-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3102 * @param destY the top-left y-coord of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3103 * @param destWidth the width of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3104 * @param destHeight the height of the destination blit region |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3105 * @param destReds the destination palette red component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3106 * @param destGreens the destination palette green component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3107 * @param destBlues the destination palette blue component intensities |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3108 * @param flipX if true the resulting image is flipped along the vertical axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3109 * @param flipY if true the resulting image is flipped along the horizontal axis |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3110 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3111 static void blit(int op, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3112 byte[] srcData, int srcDepth, int srcStride, int srcOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3113 int srcX, int srcY, int srcWidth, int srcHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3114 int srcRedMask, int srcGreenMask, int srcBlueMask, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3115 int alphaMode, byte[] alphaData, int alphaStride, int alphaX, int alphaY, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3116 byte[] destData, int destDepth, int destStride, int destOrder, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3117 int destX, int destY, int destWidth, int destHeight, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3118 byte[] destReds, byte[] destGreens, byte[] destBlues, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3119 bool flipX, bool flipY) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3120 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3121 static_this(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3122 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3123 if ((destWidth <= 0) || (destHeight <= 0) || (alphaMode is ALPHA_TRANSPARENT)) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3124 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3125 // these should be supplied as params later |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3126 int srcAlphaMask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3127 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3128 /*** Prepare scaling data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3129 int dwm1 = destWidth - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3130 int sfxi = (dwm1 !is 0) ? cast(int)(((cast(long)srcWidth << 16) - 1) / dwm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3131 int dhm1 = destHeight - 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3132 int sfyi = (dhm1 !is 0) ? cast(int)(((cast(long)srcHeight << 16) - 1) / dhm1) : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3133 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3134 /*** Prepare source-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3135 int sbpp, stype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3136 switch (srcDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3137 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3138 sbpp = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3139 stype = TYPE_GENERIC_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3140 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3141 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3142 sbpp = 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3143 stype = (srcOrder is MSB_FIRST) ? TYPE_GENERIC_16_MSB : TYPE_GENERIC_16_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3144 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3145 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3146 sbpp = 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3147 stype = TYPE_GENERIC_24; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3148 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3149 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3150 sbpp = 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3151 stype = (srcOrder is MSB_FIRST) ? TYPE_GENERIC_32_MSB : TYPE_GENERIC_32_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3152 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3153 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3154 //throw new IllegalArgumentException("Invalid source type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3155 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3156 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3157 int spr = srcY * srcStride + srcX * sbpp; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3158 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3159 /*** Prepare destination-related data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3160 int dtype; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3161 switch (destDepth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3162 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3163 dtype = TYPE_INDEX_8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3164 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3165 case 4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3166 destStride <<= 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3167 dtype = TYPE_INDEX_4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3168 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3169 case 2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3170 destStride <<= 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3171 dtype = TYPE_INDEX_2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3172 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3173 case 1: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3174 destStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3175 dtype = (destOrder is MSB_FIRST) ? TYPE_INDEX_1_MSB : TYPE_INDEX_1_LSB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3176 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3177 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3178 //throw new IllegalArgumentException("Invalid source type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3179 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3180 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3181 int dpr = ((flipY) ? destY + dhm1 : destY) * destStride + ((flipX) ? destX + dwm1 : destX); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3182 int dprxi = (flipX) ? -1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3183 int dpryi = (flipY) ? -destStride : destStride; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3184 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3185 /*** Prepare special processing data ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3186 int apr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3187 if ((op & BLIT_ALPHA) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3188 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3189 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3190 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3191 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3192 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3193 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3194 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3195 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3196 alphaStride <<= 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3197 apr = alphaY * alphaStride + alphaX; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3198 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3199 case ALPHA_MASK_INDEX: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3200 //throw new IllegalArgumentException("Invalid alpha type"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3201 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3202 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3203 if (alphaData is null) alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3204 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3205 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3206 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3207 alphaMode = (alphaMode << 16) / 255; // prescale |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3208 case ALPHA_CHANNEL_SOURCE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3209 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3210 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3211 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3212 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3213 alphaMode = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3214 apr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3215 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3216 bool ditherEnabled = (op & BLIT_DITHER) !is 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3217 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3218 /*** Comprehensive blit (apply transformations) ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3219 int srcRedShift = getChannelShift(srcRedMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3220 byte[] srcReds = ANY_TO_EIGHT[getChannelWidth(srcRedMask, srcRedShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3221 int srcGreenShift = getChannelShift(srcGreenMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3222 byte[] srcGreens = ANY_TO_EIGHT[getChannelWidth(srcGreenMask, srcGreenShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3223 int srcBlueShift = getChannelShift(srcBlueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3224 byte[] srcBlues = ANY_TO_EIGHT[getChannelWidth(srcBlueMask, srcBlueShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3225 int srcAlphaShift = getChannelShift(srcAlphaMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3226 byte[] srcAlphas = ANY_TO_EIGHT[getChannelWidth(srcAlphaMask, srcAlphaShift)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3227 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3228 int dp = dpr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3229 int sp = spr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3230 int ap = apr, alpha = alphaMode; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3231 int r = 0, g = 0, b = 0, a = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3232 int indexq = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3233 int lastindex = 0, lastr = -1, lastg = -1, lastb = -1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3234 int[] rerr, gerr, berr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3235 int destPaletteSize = 1 << destDepth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3236 if ((destReds !is null) && (destReds.length < destPaletteSize)) destPaletteSize = destReds.length; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3237 if (ditherEnabled) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3238 rerr = new int[destWidth + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3239 gerr = new int[destWidth + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3240 berr = new int[destWidth + 2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3241 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3242 rerr = null; gerr = null; berr = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3243 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3244 for (int dy = destHeight, sfy = sfyi; dy > 0; --dy, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3245 sp = spr += (sfy >>> 16) * srcStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3246 ap = apr += (sfy >>> 16) * alphaStride, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3247 sfy = (sfy & 0xffff) + sfyi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3248 dp = dpr += dpryi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3249 int lrerr = 0, lgerr = 0, lberr = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3250 for (int dx = destWidth, sfx = sfxi; dx > 0; --dx, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3251 dp += dprxi, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3252 sfx = (sfx & 0xffff) + sfxi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3253 /*** READ NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3254 switch (stype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3255 case TYPE_GENERIC_8: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3256 int data = srcData[sp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3257 sp += (sfx >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3258 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3259 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3260 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3261 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3262 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3263 case TYPE_GENERIC_16_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3264 int data = ((srcData[sp] & 0xff) << 8) | (srcData[sp + 1] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3265 sp += (sfx >>> 16) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3266 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3267 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3268 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3269 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3270 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3271 case TYPE_GENERIC_16_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3272 int data = ((srcData[sp + 1] & 0xff) << 8) | (srcData[sp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3273 sp += (sfx >>> 16) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3274 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3275 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3276 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3277 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3278 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3279 case TYPE_GENERIC_24: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3280 int data = (( ((srcData[sp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3281 (srcData[sp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3282 (srcData[sp + 2] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3283 sp += (sfx >>> 16) * 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3284 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3285 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3286 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3287 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3288 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3289 case TYPE_GENERIC_32_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3290 int data = (( (( ((srcData[sp] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3291 (srcData[sp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3292 (srcData[sp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3293 (srcData[sp + 3] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3294 sp += (sfx >>> 16) * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3295 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3296 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3297 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3298 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3299 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3300 case TYPE_GENERIC_32_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3301 int data = (( (( ((srcData[sp + 3] & 0xff) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3302 (srcData[sp + 2] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3303 (srcData[sp + 1] & 0xff)) << 8) | |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3304 (srcData[sp] & 0xff); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3305 sp += (sfx >>> 16) * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3306 r = srcReds[(data & srcRedMask) >>> srcRedShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3307 g = srcGreens[(data & srcGreenMask) >>> srcGreenShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3308 b = srcBlues[(data & srcBlueMask) >>> srcBlueShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3309 a = srcAlphas[(data & srcAlphaMask) >>> srcAlphaShift] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3310 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3311 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3312 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3313 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3314 /*** DO SPECIAL PROCESSING IF REQUIRED ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3315 switch (alphaMode) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3316 case ALPHA_CHANNEL_SEPARATE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3317 alpha = ((alphaData[ap] & 0xff) << 16) / 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3318 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3319 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3320 case ALPHA_CHANNEL_SOURCE: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3321 alpha = (a << 16) / 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3322 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3323 case ALPHA_MASK_UNPACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3324 alpha = (alphaData[ap] !is 0) ? 0x10000 : 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3325 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3326 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3327 case ALPHA_MASK_PACKED: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3328 alpha = (alphaData[ap >> 3] << ((ap & 7) + 9)) & 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3329 ap += (sfx >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3330 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3331 case ALPHA_MASK_RGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3332 alpha = 0x10000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3333 for (int i = 0; i < alphaData.length; i += 3) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3334 if ((r is alphaData[i]) && (g is alphaData[i + 1]) && (b is alphaData[i + 2])) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3335 alpha = 0x0000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3336 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3337 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3338 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3339 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3340 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3341 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3342 if (alpha !is 0x10000) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3343 if (alpha is 0x0000) continue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3344 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3345 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3346 indexq = destData[dp] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3347 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3348 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3349 if ((dp & 1) !is 0) indexq = destData[dp >> 1] & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3350 else indexq = (destData[dp >> 1] >>> 4) & 0x0f; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3351 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3352 case TYPE_INDEX_2: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3353 indexq = (destData[dp >> 2] >>> (6 - (dp & 3) * 2)) & 0x03; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3354 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3355 case TYPE_INDEX_1_MSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3356 indexq = (destData[dp >> 3] >>> (7 - (dp & 7))) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3357 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3358 case TYPE_INDEX_1_LSB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3359 indexq = (destData[dp >> 3] >>> (dp & 7)) & 0x01; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3360 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3361 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3362 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3363 // Perform alpha blending |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3364 int rq = destReds[indexq] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3365 int gq = destGreens[indexq] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3366 int bq = destBlues[indexq] & 0xff; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3367 r = rq + ((r - rq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3368 g = gq + ((g - gq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3369 b = bq + ((b - bq) * alpha >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3370 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3371 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3372 /*** MAP COLOR TO THE PALETTE ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3373 if (ditherEnabled) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3374 // Floyd-Steinberg error diffusion |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3375 r += rerr[dx] >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3376 if (r < 0) r = 0; else if (r > 255) r = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3377 g += gerr[dx] >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3378 if (g < 0) g = 0; else if (g > 255) g = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3379 b += berr[dx] >> 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3380 if (b < 0) b = 0; else if (b > 255) b = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3381 rerr[dx] = lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3382 gerr[dx] = lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3383 berr[dx] = lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3384 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3385 if (r !is lastr || g !is lastg || b !is lastb) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3386 // moving the variable declarations out seems to make the JDK JIT happier... |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3387 for (int j = 0, dr, dg, db, distance, minDistance = 0x7fffffff; j < destPaletteSize; ++j) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3388 dr = (destReds[j] & 0xff) - r; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3389 dg = (destGreens[j] & 0xff) - g; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3390 db = (destBlues[j] & 0xff) - b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3391 distance = dr * dr + dg * dg + db * db; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3392 if (distance < minDistance) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3393 lastindex = j; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3394 if (distance is 0) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3395 minDistance = distance; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3396 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3397 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3398 lastr = r; lastg = g; lastb = b; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3399 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3400 if (ditherEnabled) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3401 // Floyd-Steinberg error diffusion, cont'd... |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3402 int dxm1 = dx - 1, dxp1 = dx + 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3403 int acc; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3404 rerr[dxp1] += acc = (lrerr = r - (destReds[lastindex] & 0xff)) + lrerr + lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3405 rerr[dx] += acc += lrerr + lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3406 rerr[dxm1] += acc + lrerr + lrerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3407 gerr[dxp1] += acc = (lgerr = g - (destGreens[lastindex] & 0xff)) + lgerr + lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3408 gerr[dx] += acc += lgerr + lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3409 gerr[dxm1] += acc + lgerr + lgerr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3410 berr[dxp1] += acc = (lberr = b - (destBlues[lastindex] & 0xff)) + lberr + lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3411 berr[dx] += acc += lberr + lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3412 berr[dxm1] += acc + lberr + lberr; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3413 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3414 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3415 /*** WRITE NEXT PIXEL ***/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3416 switch (dtype) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3417 case TYPE_INDEX_8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3418 destData[dp] = cast(byte) lastindex; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3419 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3420 case TYPE_INDEX_4: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3421 if ((dp & 1) !is 0) destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0xf0) | lastindex); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3422 else destData[dp >> 1] = cast(byte)((destData[dp >> 1] & 0x0f) | (lastindex << 4)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3423 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3424 case TYPE_INDEX_2: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3425 int shift = 6 - (dp & 3) * 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3426 destData[dp >> 2] = cast(byte)(destData[dp >> 2] & ~(0x03 << shift) | (lastindex << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3427 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3428 case TYPE_INDEX_1_MSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3429 int shift = 7 - (dp & 7); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3430 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (lastindex << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3431 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3432 case TYPE_INDEX_1_LSB: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3433 int shift = dp & 7; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3434 destData[dp >> 3] = cast(byte)(destData[dp >> 3] & ~(0x01 << shift) | (lastindex << shift)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3435 } break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3436 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3437 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3438 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3439 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3440 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3441 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3442 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3443 * Computes the required channel shift from a mask. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3444 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3445 static int getChannelShift(int mask) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3446 if (mask is 0) return 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3447 int i; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3448 for (i = 0; ((mask & 1) is 0) && (i < 32); ++i) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3449 mask >>>= 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3450 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3451 return i; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3452 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3453 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3454 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3455 * Computes the required channel width (depth) from a mask. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3456 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3457 static int getChannelWidth(int mask, int shift) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3458 if (mask is 0) return 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3459 int i; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3460 mask >>>= shift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3461 for (i = shift; ((mask & 1) !is 0) && (i < 32); ++i) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3462 mask >>>= 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3463 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3464 return i - shift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3465 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3466 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3467 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3468 * Extracts a field from packed RGB data given a mask for that field. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3469 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3470 static byte getChannelField(int data, int mask) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3471 static_this(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3472 int shift = getChannelShift(mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3473 return ANY_TO_EIGHT[getChannelWidth(mask, shift)][(data & mask) >>> shift]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3474 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3475 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3476 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3477 * Creates an ImageData containing one band's worth of a gradient filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3478 * block. If <code>vertical</code> is true, the band must be tiled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3479 * horizontally to fill a region, otherwise it must be tiled vertically. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3480 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3481 * @param width the width of the region to be filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3482 * @param height the height of the region to be filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3483 * @param vertical if true sweeps from top to bottom, else |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3484 * sweeps from left to right |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3485 * @param fromRGB the color to start with |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3486 * @param toRGB the color to end with |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3487 * @param redBits the number of significant red bits, 0 for palette modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3488 * @param greenBits the number of significant green bits, 0 for palette modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3489 * @param blueBits the number of significant blue bits, 0 for palette modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3490 * @return the new ImageData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3491 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3492 static ImageData createGradientBand( |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3493 int width, int height, bool vertical, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3494 RGB fromRGB, RGB toRGB, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3495 int redBits, int greenBits, int blueBits) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3496 /* Gradients are drawn as tiled bands */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3497 int bandWidth, bandHeight, bitmapDepth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3498 byte[] bitmapData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3499 PaletteData paletteData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3500 /* Select an algorithm depending on the depth of the screen */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3501 if (redBits !is 0 && greenBits !is 0 && blueBits !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3502 paletteData = new PaletteData(0x0000ff00, 0x00ff0000, 0xff000000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3503 bitmapDepth = 32; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3504 if (redBits >= 8 && greenBits >= 8 && blueBits >= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3505 /* Precise color */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3506 int steps; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3507 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3508 bandWidth = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3509 bandHeight = height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3510 steps = bandHeight > 1 ? bandHeight - 1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3511 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3512 bandWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3513 bandHeight = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3514 steps = bandWidth > 1 ? bandWidth - 1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3515 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3516 int bytesPerLine = bandWidth * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3517 bitmapData = new byte[bandHeight * bytesPerLine]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3518 buildPreciseGradientChannel(fromRGB.blue, toRGB.blue, steps, bandWidth, bandHeight, vertical, bitmapData, 0, bytesPerLine); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3519 buildPreciseGradientChannel(fromRGB.green, toRGB.green, steps, bandWidth, bandHeight, vertical, bitmapData, 1, bytesPerLine); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3520 buildPreciseGradientChannel(fromRGB.red, toRGB.red, steps, bandWidth, bandHeight, vertical, bitmapData, 2, bytesPerLine); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3521 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3522 /* Dithered color */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3523 int steps; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3524 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3525 bandWidth = (width < 8) ? width : 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3526 bandHeight = height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3527 steps = bandHeight > 1 ? bandHeight - 1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3528 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3529 bandWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3530 bandHeight = (height < 8) ? height : 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3531 steps = bandWidth > 1 ? bandWidth - 1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3532 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3533 int bytesPerLine = bandWidth * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3534 bitmapData = new byte[bandHeight * bytesPerLine]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3535 buildDitheredGradientChannel(fromRGB.blue, toRGB.blue, steps, bandWidth, bandHeight, vertical, bitmapData, 0, bytesPerLine, blueBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3536 buildDitheredGradientChannel(fromRGB.green, toRGB.green, steps, bandWidth, bandHeight, vertical, bitmapData, 1, bytesPerLine, greenBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3537 buildDitheredGradientChannel(fromRGB.red, toRGB.red, steps, bandWidth, bandHeight, vertical, bitmapData, 2, bytesPerLine, redBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3538 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3539 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3540 /* Dithered two tone */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3541 paletteData = new PaletteData([ fromRGB, toRGB ]); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3542 bitmapDepth = 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3543 int blendi; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3544 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3545 bandWidth = (width < 8) ? width : 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3546 bandHeight = height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3547 blendi = (bandHeight > 1) ? 0x1040000 / (bandHeight - 1) + 1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3548 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3549 bandWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3550 bandHeight = (height < 8) ? height : 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3551 blendi = (bandWidth > 1) ? 0x1040000 / (bandWidth - 1) + 1 : 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3552 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3553 int bytesPerLine = (bandWidth + 3) & -4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3554 bitmapData = new byte[bandHeight * bytesPerLine]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3555 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3556 for (int dy = 0, blend = 0, dp = 0; dy < bandHeight; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3557 ++dy, blend += blendi, dp += bytesPerLine) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3558 for (int dx = 0; dx < bandWidth; ++dx) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3559 bitmapData[dp + dx] = (blend + DITHER_MATRIX[dy & 7][dx]) < |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3560 0x1000000 ? cast(byte)0 : cast(byte)1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3561 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3562 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3563 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3564 for (int dx = 0, blend = 0; dx < bandWidth; ++dx, blend += blendi) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3565 for (int dy = 0, dptr = dx; dy < bandHeight; ++dy, dptr += bytesPerLine) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3566 bitmapData[dptr] = (blend + DITHER_MATRIX[dy][dx & 7]) < |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3567 0x1000000 ? cast(byte)0 : cast(byte)1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3568 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3569 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3570 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3571 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3572 return new ImageData(bandWidth, bandHeight, bitmapDepth, paletteData, 4, bitmapData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3573 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3574 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3575 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3576 * Fill in gradated values for a color channel |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3577 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3578 static final void buildPreciseGradientChannel(int from, int to, int steps, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3579 int bandWidth, int bandHeight, bool vertical, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3580 byte[] bitmapData, int dp, int bytesPerLine) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3581 int val = from << 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3582 int inc = ((to << 16) - val) / steps + 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3583 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3584 for (int dy = 0; dy < bandHeight; ++dy, dp += bytesPerLine) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3585 bitmapData[dp] = cast(byte)(val >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3586 val += inc; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3587 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3588 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3589 for (int dx = 0; dx < bandWidth; ++dx, dp += 4) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3590 bitmapData[dp] = cast(byte)(val >>> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3591 val += inc; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3592 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3593 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3594 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3595 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3596 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3597 * Fill in dithered gradated values for a color channel |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3598 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3599 static final void buildDitheredGradientChannel(int from, int to, int steps, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3600 int bandWidth, int bandHeight, bool vertical, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3601 byte[] bitmapData, int dp, int bytesPerLine, int bits) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3602 int mask = 0xff00 >>> bits; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3603 int val = from << 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3604 int inc = ((to << 16) - val) / steps + 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3605 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3606 for (int dy = 0; dy < bandHeight; ++dy, dp += bytesPerLine) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3607 for (int dx = 0, dptr = dp; dx < bandWidth; ++dx, dptr += 4) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3608 int thresh = DITHER_MATRIX[dy & 7][dx] >>> bits; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3609 int temp = val + thresh; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3610 if (temp > 0xffffff) bitmapData[dptr] = -1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3611 else bitmapData[dptr] = cast(byte)((temp >>> 16) & mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3612 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3613 val += inc; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3614 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3615 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3616 for (int dx = 0; dx < bandWidth; ++dx, dp += 4) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3617 for (int dy = 0, dptr = dp; dy < bandHeight; ++dy, dptr += bytesPerLine) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3618 int thresh = DITHER_MATRIX[dy][dx & 7] >>> bits; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3619 int temp = val + thresh; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3620 if (temp > 0xffffff) bitmapData[dptr] = -1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3621 else bitmapData[dptr] = cast(byte)((temp >>> 16) & mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3622 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3623 val += inc; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3624 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3625 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3626 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3627 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3628 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3629 * Renders a gradient onto a GC. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3630 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3631 * This is a GC helper. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3632 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3633 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3634 * @param gc the GC to render the gradient onto |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3635 * @param device the device the GC belongs to |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3636 * @param x the top-left x coordinate of the region to be filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3637 * @param y the top-left y coordinate of the region to be filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3638 * @param width the width of the region to be filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3639 * @param height the height of the region to be filled |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3640 * @param vertical if true sweeps from top to bottom, else |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3641 * sweeps from left to right |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3642 * @param fromRGB the color to start with |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3643 * @param toRGB the color to end with |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3644 * @param redBits the number of significant red bits, 0 for palette modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3645 * @param greenBits the number of significant green bits, 0 for palette modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3646 * @param blueBits the number of significant blue bits, 0 for palette modes |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3647 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3648 static void fillGradientRectangle(GC gc, Device device, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3649 int x, int y, int width, int height, bool vertical, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3650 RGB fromRGB, RGB toRGB, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3651 int redBits, int greenBits, int blueBits) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3652 /* Create the bitmap and tile it */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3653 ImageData band = createGradientBand(width, height, vertical, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3654 fromRGB, toRGB, redBits, greenBits, blueBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3655 Image image = new Image(device, band); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3656 if ((band.width is 1) || (band.height is 1)) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3657 gc.drawImage(image, 0, 0, band.width, band.height, x, y, width, height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3658 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3659 if (vertical) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3660 for (int dx = 0; dx < width; dx += band.width) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3661 int blitWidth = width - dx; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3662 if (blitWidth > band.width) blitWidth = band.width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3663 gc.drawImage(image, 0, 0, blitWidth, band.height, dx + x, y, blitWidth, band.height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3664 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3665 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3666 for (int dy = 0; dy < height; dy += band.height) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3667 int blitHeight = height - dy; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3668 if (blitHeight > band.height) blitHeight = band.height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3669 gc.drawImage(image, 0, 0, band.width, blitHeight, x, dy + y, band.width, blitHeight); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3670 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3671 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3672 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3673 image.dispose(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3674 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3675 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3676 } |