annotate dwt/graphics/Image.d @ 302:555d58850cd9

Omit array bounds checking on dynamic struct length.
author Frank Benoit <benoit@tionex.de>
date Fri, 29 Aug 2008 04:26:26 +0200
parents fd9c62a2998e
children eddc0e013cb8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
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
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
10 * Port to the D programming language:
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
11 * Frank Benoit <benoit@tionex.de>
22
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.Image;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
302
555d58850cd9 Omit array bounds checking on dynamic struct length.
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
15 import tango.util.log.Trace;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.DWT;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.DWTError;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.DWTException;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import dwt.internal.gdip.Gdip;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.internal.win32.OS;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.graphics.Color;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.graphics.Device;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.graphics.Drawable;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwt.graphics.GC;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwt.graphics.GCData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwt.graphics.ImageData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwt.graphics.PaletteData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwt.graphics.RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwt.graphics.Rectangle;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwt.graphics.Resource;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 import dwt.dwthelper.InputStream;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 import dwt.dwthelper.utils;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 import tango.text.convert.Format;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 //import tango.stdc.string;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 //import tango.stdc.stringz;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40
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 * Instances of this class are graphics which have been prepared
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 * for display on a specific device. That is, they are ready
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 * to paint using methods such as <code>GC.drawImage()</code>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 * and display on widgets with, for example, <code>Button.setImage()</code>.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 * If loaded from a file format that supports it, an
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 * <code>Image</code> may have transparency, meaning that certain
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49 * pixels are specified as being transparent when drawn. Examples
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 * of file formats that support transparency are GIF and PNG.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 * </p><p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * There are two primary ways to use <code>Images</code>.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 * The first is to load a graphic file from disk and create an
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * <code>Image</code> from it. This is done using an <code>Image</code>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 * constructor, for example:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 * <pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 * Image i = new Image(device, "C:\\graphic.bmp");
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 * </pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * A graphic file may contain a color table specifying which
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 * colors the image was intended to possess. In the above example,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 * these colors will be mapped to the closest available color in
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 * DWT. It is possible to get more control over the mapping of
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 * colors as the image is being created, using code of the form:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64 * <pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 * ImageData data = new ImageData("C:\\graphic.bmp");
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * RGB[] rgbs = data.getRGBs();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * // At this point, rgbs contains specifications of all
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 * // the colors contained within this image. You may
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * // allocate as many of these colors as you wish by
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * // using the Color constructor Color(RGB), then
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * // create the image:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * Image i = new Image(device, data);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * </pre>
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 * Applications which require even greater control over the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 * loading process should use the support provided in class
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * <code>ImageLoader</code>.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * </p><p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 * Application code must explicitly invoke the <code>Image.dispose()</code>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 * method to release the operating system resources managed by each instance
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 * when those instances are no longer required.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 * @see Color
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 * @see ImageData
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 * @see ImageLoader
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
87 * @see <a href="http://www.eclipse.org/swt/snippets/#image">Image snippets</a>
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
88 * @see <a href="http://www.eclipse.org/swt/examples.php">DWT Examples: GraphicsExample, ImageAnalyzer</a>
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
89 * @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
90 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 public final class Image : Resource, Drawable {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
94 alias Resource.init_ init_;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
95
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 * specifies whether the receiver is a bitmap or an icon
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 * (one of <code>DWT.BITMAP</code>, <code>DWT.ICON</code>)
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100 * <b>IMPORTANT:</b> This field is <em>not</em> part of the DWT
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 * public API. It is marked public only so that it can be shared
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * within the packages provided by DWT. It is not available on all
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * platforms and should never be accessed from application code.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * </p>
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 public int type;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 * the handle to the OS image resource
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 * (Warning: This field is platform dependent)
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 * <b>IMPORTANT:</b> This field is <em>not</em> part of the DWT
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 * public API. It is marked public only so that it can be shared
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 * within the packages provided by DWT. It is not available on all
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 * platforms and should never be accessed from application code.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 public HGDIOBJ handle;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 * specifies the transparent pixel
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 */
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
123 int transparentPixel = -1, transparentColor = -1;
22
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 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 * the GC which is drawing on the image
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 GC memGC;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 * the alpha data for the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 byte[] alphaData;
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 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 * 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
137 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 int alpha = -1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 * the image data used to create this image if it is a
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 * icon. Used only in WinCE
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 ImageData data;
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 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 * width of the image
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 int width = -1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 * height of the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 int height = -1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 * specifies the default scanline padding
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 static const int DEFAULT_SCANLINE_PAD = 4;
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 * 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
163 */
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
164 this (Device device) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
165 super(device);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 * Constructs an empty instance of this class with the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 * specified width and height. The result may be drawn upon
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 * by creating a GC and using any of its drawing operations,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 * as shown in the following example:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * <pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * Image i = new Image(device, width, height);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 * GC gc = new GC(i);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 * gc.drawRectangle(0, 0, 50, 50);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 * gc.dispose();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 * </pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 * Note: Some platforms may have a limitation on the size
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 * of image that can be created (size depends on width, height,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 * and depth). For example, Windows 95, 98, and ME do not allow
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 * images larger than 16M.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 * @param device the device on which to create the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 * @param width the width of the new image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 * @param height the height of the new image
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 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 * <li>ERROR_INVALID_ARGUMENT - if either the width or height is negative or zero</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 public this(Device device, int width, int height) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
199 super(device);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
200 init_(width, height);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
201 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 * Constructs a new instance of this class based on the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 * provided image, with an appearance that varies depending
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 * on the value of the flag. The possible flag values are:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 * <dl>
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
209 * <dt><b>{@link DWT#IMAGE_COPY}</b></dt>
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 * <dd>the result is an identical copy of srcImage</dd>
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
211 * <dt><b>{@link DWT#IMAGE_DISABLE}</b></dt>
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 * <dd>the result is a copy of srcImage which has a <em>disabled</em> look</dd>
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
213 * <dt><b>{@link DWT#IMAGE_GRAY}</b></dt>
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 * <dd>the result is a copy of srcImage which has a <em>gray scale</em> look</dd>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 * </dl>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 * @param device the device on which to create the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 * @param srcImage the image to use as the source
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 * @param flag the style, either <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 * <li>ERROR_NULL_ARGUMENT - if srcImage is null</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 * <li>ERROR_INVALID_ARGUMENT - if the flag is not one of <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code></li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon, or is otherwise in an invalid state</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the image is not supported</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 public this(Device device, Image srcImage, int flag) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
236 super(device);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
237 device = this.device;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238 if (srcImage 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
239 if (srcImage.isDisposed()) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 Rectangle rect = srcImage.getBounds();
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
241 this.type = srcImage.type;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 switch (flag) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 case DWT.IMAGE_COPY: {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 switch (type) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 case DWT.BITMAP:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 /* Get the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 auto hDC = device.internal_new_GC(null);
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 /* Copy the bitmap */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 auto hdcSource = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 auto hdcDest = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 auto hOldSrc = OS.SelectObject(hdcSource, srcImage.handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 BITMAP bm;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 OS.GetObject(srcImage.handle, BITMAP.sizeof, &bm);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 handle = OS.CreateCompatibleBitmap(hdcSource, rect.width, bm.bmBits !is null ? -rect.height : rect.height);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 if (handle is null) DWT.error(DWT.ERROR_NO_HANDLES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 auto hOldDest = OS.SelectObject(hdcDest, handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 OS.BitBlt(hdcDest, 0, 0, rect.width, rect.height, hdcSource, 0, 0, OS.SRCCOPY);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 OS.SelectObject(hdcSource, hOldSrc);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 OS.SelectObject(hdcDest, hOldDest);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 OS.DeleteDC(hdcSource);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 OS.DeleteDC(hdcDest);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 /* Release the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 transparentPixel = srcImage.transparentPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 alpha = srcImage.alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 if (srcImage.alphaData !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 alphaData = new byte[srcImage.alphaData.length];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 System.arraycopy(srcImage.alphaData, 0, alphaData, 0, alphaData.length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 case DWT.ICON:
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
275 static if (OS.IsWinCE) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
276 init_(srcImage.data);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 handle = OS.CopyImage(srcImage.handle, OS.IMAGE_ICON, rect.width, rect.height, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 if (handle is null) DWT.error(DWT.ERROR_NO_HANDLES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 DWT.error(DWT.ERROR_INVALID_IMAGE);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
285 break;
22
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 case DWT.IMAGE_DISABLE: {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 ImageData data = srcImage.getImageData();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289 PaletteData palette = data.palette;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 RGB[] rgbs = new RGB[3];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 rgbs[0] = device.getSystemColor(DWT.COLOR_BLACK).getRGB();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 rgbs[1] = device.getSystemColor(DWT.COLOR_WIDGET_NORMAL_SHADOW).getRGB();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 rgbs[2] = device.getSystemColor(DWT.COLOR_WIDGET_BACKGROUND).getRGB();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 ImageData newData = new ImageData(rect.width, rect.height, 8, new PaletteData(rgbs));
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 newData.alpha = data.alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 newData.alphaData = data.alphaData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 newData.maskData = data.maskData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 newData.maskPad = data.maskPad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 if (data.transparentPixel !is -1) newData.transparentPixel = 0;
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 /* Convert the pixels. */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 int[] scanline = new int[rect.width];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 int[] maskScanline = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 ImageData mask = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 if (data.maskData !is null) mask = data.getTransparencyMask();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 if (mask !is null) maskScanline = new int[rect.width];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 int redMask = palette.redMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 int greenMask = palette.greenMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 int blueMask = palette.blueMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 int redShift = palette.redShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 int greenShift = palette.greenShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 int blueShift = palette.blueShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 for (int y=0; y<rect.height; y++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 int offset = y * newData.bytesPerLine;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 data.getPixels(0, y, rect.width, scanline, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 if (mask !is null) mask.getPixels(0, y, rect.width, maskScanline, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 for (int x=0; x<rect.width; x++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 int pixel = scanline[x];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 if (!((data.transparentPixel !is -1 && pixel is data.transparentPixel) || (mask !is null && maskScanline[x] is 0))) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 int red, green, blue;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 if (palette.isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 red = pixel & redMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 red = (redShift < 0) ? red >>> -redShift : red << redShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 green = pixel & greenMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 green = (greenShift < 0) ? green >>> -greenShift : green << greenShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 blue = pixel & blueMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 red = palette.colors[pixel].red;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 green = palette.colors[pixel].green;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 blue = palette.colors[pixel].blue;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 int intensity = red * red + green * green + blue * blue;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 if (intensity < 98304) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 newData.data[offset] = cast(byte)1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 newData.data[offset] = cast(byte)2;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 }
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 offset++;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
343 init_ (newData);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
344 break;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 case DWT.IMAGE_GRAY: {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 ImageData data = srcImage.getImageData();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
348 PaletteData palette = data.palette;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
349 ImageData newData = data;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 if (!palette.isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 /* Convert the palette entries to gray. */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 RGB [] rgbs = palette.getRGBs();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
353 for (int i=0; i<rgbs.length; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
354 if (data.transparentPixel !is i) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 RGB color = rgbs [i];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 int red = color.red;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 int green = color.green;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
358 int blue = color.blue;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
359 int intensity = (red+red+green+green+green+green+green+blue) >> 3;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 color.red = color.green = color.blue = intensity;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
361 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
362 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 newData.palette = new PaletteData(rgbs);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
365 /* Create a 8 bit depth image data with a gray palette. */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 RGB[] rgbs = new RGB[256];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 for (int i=0; i<rgbs.length; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 rgbs[i] = new RGB(i, i, i);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 newData = new ImageData(rect.width, rect.height, 8, new PaletteData(rgbs));
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 newData.alpha = data.alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 newData.alphaData = data.alphaData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 newData.maskData = data.maskData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
374 newData.maskPad = data.maskPad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
375 if (data.transparentPixel !is -1) newData.transparentPixel = 254;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 /* Convert the pixels. */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 int[] scanline = new int[rect.width];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 int redMask = palette.redMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 int greenMask = palette.greenMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 int blueMask = palette.blueMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
382 int redShift = palette.redShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 int greenShift = palette.greenShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 int blueShift = palette.blueShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 for (int y=0; y<rect.height; y++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 int offset = y * newData.bytesPerLine;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 data.getPixels(0, y, rect.width, scanline, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 for (int x=0; x<rect.width; x++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 int pixel = scanline[x];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 if (pixel !is data.transparentPixel) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
391 int red = pixel & redMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 red = (redShift < 0) ? red >>> -redShift : red << redShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 int green = pixel & greenMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394 green = (greenShift < 0) ? green >>> -greenShift : green << greenShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 int blue = pixel & blueMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 int intensity = (red+red+green+green+green+green+green+blue) >> 3;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
398 if (newData.transparentPixel is intensity) intensity = 255;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 newData.data[offset] = cast(byte)intensity;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
400 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401 newData.data[offset] = cast(byte)254;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
403 offset++;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
404 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
406 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
407 init_ (newData);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
408 break;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
410 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 DWT.error(DWT.ERROR_INVALID_ARGUMENT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
412 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
413 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417 * Constructs an empty instance of this class with the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
418 * width and height of the specified rectangle. The result
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419 * may be drawn upon by creating a GC and using any of its
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 * drawing operations, as shown in the following example:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 * <pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 * Image i = new Image(device, boundsRectangle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 * GC gc = new GC(i);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 * gc.drawRectangle(0, 0, 50, 50);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 * gc.dispose();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 * </pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
428 * Note: Some platforms may have a limitation on the size
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
429 * of image that can be created (size depends on width, height,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
430 * and depth). For example, Windows 95, 98, and ME do not allow
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 * images larger than 16M.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 * @param device the device on which to create the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435 * @param bounds a rectangle specifying the image's width and height (must not be null)
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
437 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
439 * <li>ERROR_NULL_ARGUMENT - if the bounds rectangle is null</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
440 * <li>ERROR_INVALID_ARGUMENT - if either the rectangle's width or height is negative</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
443 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
445 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
446 public this(Device device, Rectangle bounds) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
447 super(device);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
448 if (bounds is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
449 init_(bounds.width, bounds.height);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
450 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
452
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 * Constructs an instance of this class from the given
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
455 * <code>ImageData</code>.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
456 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
457 * @param device the device on which to create the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
458 * @param data the image data to create the image from (must not be null)
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 * <li>ERROR_NULL_ARGUMENT - if the image data is null</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the ImageData is not supported</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 public this(Device device, ImageData data) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
472 super(device);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
473 init_(data);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
474 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 * Constructs an instance of this class, whose type is
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 * <code>DWT.ICON</code>, from the two given <code>ImageData</code>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 * objects. The two images must be the same size. Pixel transparency
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 * in either image will be ignored.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
482 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
483 * The mask image should contain white wherever the icon is to be visible,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
484 * and black wherever the icon is to be transparent. In addition,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
485 * the source image should contain black wherever the icon is to be
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
486 * transparent.
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 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
489 * @param device the device on which to create the icon
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 * @param source the color data for the icon
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
491 * @param mask the mask data for the icon
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
492 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
493 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 * <li>ERROR_NULL_ARGUMENT - if either the source or mask is null </li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 * <li>ERROR_INVALID_ARGUMENT - if source and mask are different sizes</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 public this(Device device, ImageData source, ImageData mask) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
503 super(device);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 if (source 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
505 if (mask 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
506 if (source.width !is mask.width || source.height !is mask.height) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 DWT.error(DWT.ERROR_INVALID_ARGUMENT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 mask = ImageData.convertMask(mask);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
510 init_(this.device, this, source, mask);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
511 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 }
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 * Constructs an instance of this class by loading its representation
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 * from the specified input stream. Throws an error if an error
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 * occurs while loading the image, or if the result is an image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 * of an unsupported type. Application code is still responsible
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 * for closing the input stream.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 * 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
522 * 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
523 * 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
524 * <code>ImageLoader.load()</code>.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 * </p><p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 * 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
527 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 * <pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 * static Image loadImage (Display display, Class clazz, String string) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
530 * InputStream stream = clazz.getResourceAsStream (string);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 * if (stream is null) return null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 * Image image = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 * try {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534 * image = new Image (display, stream);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 * } catch (DWTException ex) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
536 * } finally {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
537 * try {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
538 * stream.close ();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539 * } catch (IOException ex) {}
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 * }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 * return image;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 * }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 * </pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 * @param device the device on which to create the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 * @param stream the input stream to load the image from
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * <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
551 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 * <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
554 * <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
555 * <li>ERROR_UNSUPPORTED_DEPTH - if the image stream describes an image with an unsupported depth</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 * <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
557 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
562 public this (Device device, InputStream stream) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
563 super(device);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
564 init_(new ImageData(stream));
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
565 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
569 * Constructs an instance of this class by loading its representation
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
570 * from the file with the specified name. Throws an error if an error
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
571 * occurs while loading the image, or if the result is an image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
572 * of an unsupported type.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
573 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
574 * This constructor is provided for convenience when loading
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 * a single image only. If the specified file contains
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
576 * multiple images, only the first one will be used.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
577 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
578 * @param device the device on which to create the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 * @param filename the name of the file to load the image from
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
581 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
583 * <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
584 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
586 * <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
587 * <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
588 * <li>ERROR_UNSUPPORTED_DEPTH - if the image file describes an image with an unsupported depth</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
589 * <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
590 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591 * @exception DWTError <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
595 public this (Device device, String filename) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
596 super(device);
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
597 device = this.device;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
598 if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
599 bool gdip = true;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
600 try {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 device.checkGDIP();
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
602 } catch (DWTException e) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
603 gdip = false;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
604 }
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
605 /*
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
606 * Bug in GDI+. For some reason, Bitmap.LockBits() segment faults
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
607 * when loading GIF files in 64-bit Windows. The fix is to not use
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
608 * GDI+ image loading in this case.
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
609 */
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
610 if (gdip && (void*).sizeof is 8 && filename.toLowerCase().endsWith(".gif")) gdip = false;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
611 if (gdip) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 int length = filename.length;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 char[] chars = new char[length+1];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 filename.getChars(0, length, chars, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
615 auto bitmap = Gdip.Bitmap_new( .StrToWCHARz( filename ), false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
616 if (bitmap !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 int error = DWT.ERROR_NO_HANDLES;
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
618 int status = Gdip.Image_GetLastStatus(cast(Gdip.Image)bitmap);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 if (status is 0) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 if (filename.toLowerCase().endsWith(".ico")) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
621 this.type = DWT.ICON;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
622 HICON hicon;
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
623 Gdip.Bitmap_GetHICON(bitmap, hicon);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 this.handle = hicon;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
625 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
626 this.type = DWT.BITMAP;
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
627 int width = Gdip.Image_GetWidth(cast(Gdip.Image)bitmap);
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
628 int height = Gdip.Image_GetHeight(cast(Gdip.Image)bitmap);
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
629 int pixelFormat = Gdip.Image_GetPixelFormat(cast(Gdip.Image)bitmap);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
630 switch (pixelFormat) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 case Gdip.PixelFormat16bppRGB555:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 case Gdip.PixelFormat16bppRGB565:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 this.handle = createDIB(width, height, 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 case Gdip.PixelFormat24bppRGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 this.handle = createDIB(width, height, 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
638 case Gdip.PixelFormat32bppRGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
639 // These will loose either precision or transparency
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
640 case Gdip.PixelFormat16bppGrayScale:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
641 case Gdip.PixelFormat48bppRGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
642 case Gdip.PixelFormat32bppPARGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
643 case Gdip.PixelFormat64bppARGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
644 case Gdip.PixelFormat64bppPARGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
645 this.handle = createDIB(width, height, 32);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 break;
81
e10cbfc977d2 switch default cases
Frank Benoit <benoit@tionex.de>
parents: 53
diff changeset
647 default:
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 if (this.handle !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 * This performs better than getting the bits with Bitmap.LockBits(),
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 * but it cannot be used when there is transparency.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
654 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 auto srcHDC = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
656 auto oldSrcBitmap = OS.SelectObject(srcHDC, this.handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
657 auto graphics = Gdip.Graphics_new(srcHDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 if (graphics !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
659 Gdip.Rect rect;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
660 rect.Width = width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
661 rect.Height = height;
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
662 status = Gdip.Graphics_DrawImage(graphics, cast(Gdip.Image)bitmap, rect, 0, 0, width, height, Gdip.UnitPixel, null, null, null);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 if (status !is 0) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664 error = DWT.ERROR_INVALID_IMAGE;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
665 OS.DeleteObject(handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 this.handle = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
667 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
668 Gdip.Graphics_delete(graphics);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 OS.SelectObject(srcHDC, oldSrcBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 OS.DeleteDC(srcHDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
673 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
674 auto lockedBitmapData = Gdip.BitmapData_new();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
675 if (lockedBitmapData !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
676 Gdip.Bitmap_LockBits(bitmap, null, 0, pixelFormat, lockedBitmapData);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
677 //BitmapData bitmapData = new BitmapData();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
678 //Gdip.MoveMemory(bitmapData, lockedBitmapData);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 auto stride = lockedBitmapData.Stride;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
680 auto pixels = lockedBitmapData.Scan0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
681 int depth = 0, scanlinePad = 4, transparentPixel = -1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
682 switch (lockedBitmapData.PixelFormat) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
683 case Gdip.PixelFormat1bppIndexed: depth = 1; break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
684 case Gdip.PixelFormat4bppIndexed: depth = 4; break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 case Gdip.PixelFormat8bppIndexed: depth = 8; break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
686 case Gdip.PixelFormat16bppARGB1555:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
687 case Gdip.PixelFormat16bppRGB555:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688 case Gdip.PixelFormat16bppRGB565: depth = 16; break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
689 case Gdip.PixelFormat24bppRGB: depth = 24; break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
690 case Gdip.PixelFormat32bppRGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
691 case Gdip.PixelFormat32bppARGB: depth = 32; break;
81
e10cbfc977d2 switch default cases
Frank Benoit <benoit@tionex.de>
parents: 53
diff changeset
692 default:
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
693 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
694 if (depth !is 0) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
695 PaletteData paletteData = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
696 switch (lockedBitmapData.PixelFormat) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
697 case Gdip.PixelFormat1bppIndexed:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
698 case Gdip.PixelFormat4bppIndexed:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
699 case Gdip.PixelFormat8bppIndexed:
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
700 int paletteSize = Gdip.Image_GetPaletteSize(cast(Gdip.Image)bitmap);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
701 auto hHeap = OS.GetProcessHeap();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
702 auto palette = cast(Gdip.ColorPalette*) OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, paletteSize);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
703 if (palette is null) DWT.error(DWT.ERROR_NO_HANDLES);
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
704 Gdip.Image_GetPalette(cast(Gdip.Image)bitmap, palette, paletteSize);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
705 Gdip.ColorPalette* colorPalette = palette;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
706 //Gdip.MoveMemory(colorPalette, palette, ColorPalette.sizeof);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
707 //int[] entries = new int[colorPalette.Count];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
708 //OS.MoveMemory(entries, palette + 8, entries.length * 4);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
709
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
710 //PORTING_COMMENT: moved down
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
711 //OS.HeapFree(hHeap, 0, palette);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
712 RGB[] rgbs = new RGB[colorPalette.Count];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
713 paletteData = new PaletteData(rgbs);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
714 for (int i = 0; i < colorPalette.Count; i++) {
302
555d58850cd9 Omit array bounds checking on dynamic struct length.
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
715 // DWT: access palette.Entries without array bounds checking
555d58850cd9 Omit array bounds checking on dynamic struct length.
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
716 if (((*(palette.Entries.ptr + i) >> 24) & 0xFF) is 0 && (colorPalette.Flags & Gdip.PaletteFlagsHasAlpha) !is 0) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
717 transparentPixel = i;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
718 }
302
555d58850cd9 Omit array bounds checking on dynamic struct length.
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
719 rgbs[i] = new RGB(((*(palette.Entries.ptr + i) & 0xFF0000) >> 16), ((*(palette.Entries.ptr + i) & 0xFF00) >> 8), ((*(palette.Entries.ptr + i) & 0xFF) >> 0));
22
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 OS.HeapFree(hHeap, 0, palette);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
722 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
723 case Gdip.PixelFormat16bppARGB1555:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
724 case Gdip.PixelFormat16bppRGB555: paletteData = new PaletteData(0x7C00, 0x3E0, 0x1F); break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
725 case Gdip.PixelFormat16bppRGB565: paletteData = new PaletteData(0xF800, 0x7E0, 0x1F); break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
726 case Gdip.PixelFormat24bppRGB: paletteData = new PaletteData(0xFF, 0xFF00, 0xFF0000); break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
727 case Gdip.PixelFormat32bppRGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
728 case Gdip.PixelFormat32bppARGB: paletteData = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); break;
81
e10cbfc977d2 switch default cases
Frank Benoit <benoit@tionex.de>
parents: 53
diff changeset
729 default:
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
730 }
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
731 byte[] data = new byte[ stride * height ], alphaData = null;
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
732 OS.MoveMemory(data.ptr, pixels, data.length);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
733 switch (lockedBitmapData.PixelFormat) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
734 case Gdip.PixelFormat16bppARGB1555:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
735 alphaData = new byte[width * height];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
736 for (int i = 1, j = 0; i < data.length; i += 2, j++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
737 alphaData[j] = cast(byte)((data[i] & 0x80) !is 0 ? 255 : 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
738 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
739 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
740 case Gdip.PixelFormat32bppARGB:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
741 alphaData = new byte[width * height];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
742 for (int i = 3, j = 0; i < data.length; i += 4, j++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
743 alphaData[j] = data[i];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
744 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
745 break;
81
e10cbfc977d2 switch default cases
Frank Benoit <benoit@tionex.de>
parents: 53
diff changeset
746 default:
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
747 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
748 Gdip.Bitmap_UnlockBits(bitmap, lockedBitmapData);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
749 Gdip.BitmapData_delete(lockedBitmapData);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
750 ImageData img = new ImageData(width, height, depth, paletteData, scanlinePad, data);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
751 img.transparentPixel = transparentPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
752 img.alphaData = alphaData;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
753 init_(img);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
754 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
755 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
756 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
757 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
758 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
759 Gdip.Bitmap_delete(bitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
760 if (status is 0) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
761 if (this.handle is null) DWT.error(error);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
762 return;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
763 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
764 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
765 }
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
766 init_(new ImageData(filename));
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
767 init_();
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
768 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
769
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 * Create a DIB from a DDB without using GetDIBits. Note that
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
772 * the DDB should not be selected into a HDC.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
773 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
774 HBITMAP createDIBFromDDB(HDC hDC, HBITMAP hBitmap, int width, int height) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
775
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
776 /* Determine the DDB depth */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
777 int bits = OS.GetDeviceCaps (hDC, OS.BITSPIXEL);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
778 int planes = OS.GetDeviceCaps (hDC, OS.PLANES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
779 int depth = bits * planes;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
780
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
781 /* Determine the DIB palette */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
782 bool isDirect = depth > 8;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
783 RGB[] rgbs = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
784 if (!isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
785 int numColors = 1 << depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
786 byte[] logPalette = new byte[4 * numColors];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
787 OS.GetPaletteEntries(device.hPalette, 0, numColors, cast(PALETTEENTRY*)logPalette.ptr);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
788 rgbs = new RGB[numColors];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
789 for (int i = 0; i < numColors; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
790 rgbs[i] = new RGB(logPalette[i] & 0xFF, logPalette[i + 1] & 0xFF, logPalette[i + 2] & 0xFF);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
791 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
792 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
793
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
794 bool useBitfields = OS.IsWinCE && (depth is 16 || depth is 32);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
795 BITMAPINFOHEADER bmiHeader;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
796 bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
797 bmiHeader.biWidth = width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
798 bmiHeader.biHeight = -height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
799 bmiHeader.biPlanes = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
800 bmiHeader.biBitCount = cast(short)depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
801 if (useBitfields) bmiHeader.biCompression = OS.BI_BITFIELDS;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
802 else bmiHeader.biCompression = OS.BI_RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
803 byte[] bmi;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
804 if (isDirect) bmi = new byte[BITMAPINFOHEADER.sizeof + (useBitfields ? 12 : 0)];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
805 else bmi = new byte[BITMAPINFOHEADER.sizeof + rgbs.length * 4];
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
806 OS.MoveMemory(bmi.ptr, &bmiHeader, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
807
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
808 /* Set the rgb colors into the bitmap info */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
809 int offset = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
810 if (isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
811 if (useBitfields) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
812 int redMask = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
813 int greenMask = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
814 int blueMask = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
815 switch (depth) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
816 case 16:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
817 redMask = 0x7C00;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
818 greenMask = 0x3E0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
819 blueMask = 0x1F;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
820 /* little endian */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
821 bmi[offset] = cast(byte)((redMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
822 bmi[offset + 1] = cast(byte)((redMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
823 bmi[offset + 2] = cast(byte)((redMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
824 bmi[offset + 3] = cast(byte)((redMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
825 bmi[offset + 4] = cast(byte)((greenMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
826 bmi[offset + 5] = cast(byte)((greenMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
827 bmi[offset + 6] = cast(byte)((greenMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
828 bmi[offset + 7] = cast(byte)((greenMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
829 bmi[offset + 8] = cast(byte)((blueMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
830 bmi[offset + 9] = cast(byte)((blueMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
831 bmi[offset + 10] = cast(byte)((blueMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
832 bmi[offset + 11] = cast(byte)((blueMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
833 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
834 case 32:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
835 redMask = 0xFF00;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
836 greenMask = 0xFF0000;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
837 blueMask = 0xFF000000;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
838 /* big endian */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
839 bmi[offset] = cast(byte)((redMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
840 bmi[offset + 1] = cast(byte)((redMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
841 bmi[offset + 2] = cast(byte)((redMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
842 bmi[offset + 3] = cast(byte)((redMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
843 bmi[offset + 4] = cast(byte)((greenMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
844 bmi[offset + 5] = cast(byte)((greenMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
845 bmi[offset + 6] = cast(byte)((greenMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
846 bmi[offset + 7] = cast(byte)((greenMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
847 bmi[offset + 8] = cast(byte)((blueMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
848 bmi[offset + 9] = cast(byte)((blueMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
849 bmi[offset + 10] = cast(byte)((blueMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
850 bmi[offset + 11] = cast(byte)((blueMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
851 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
852 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
853 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
854 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
855 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
856 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
857 for (int j = 0; j < rgbs.length; j++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
858 bmi[offset] = cast(byte)rgbs[j].blue;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
859 bmi[offset + 1] = cast(byte)rgbs[j].green;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
860 bmi[offset + 2] = cast(byte)rgbs[j].red;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
861 bmi[offset + 3] = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
862 offset += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
863 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
864 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
865 void* pBits;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
866 HBITMAP hDib = OS.CreateDIBSection(null, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS, &pBits, null, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
867 if (hDib is null) DWT.error(DWT.ERROR_NO_HANDLES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
868
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
869 /* Bitblt DDB into DIB */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
870 auto hdcSource = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
871 auto hdcDest = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
872 auto hOldSrc = OS.SelectObject(hdcSource, hBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
873 auto hOldDest = OS.SelectObject(hdcDest, hDib);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
874 OS.BitBlt(hdcDest, 0, 0, width, height, hdcSource, 0, 0, OS.SRCCOPY);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
875 OS.SelectObject(hdcSource, hOldSrc);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
876 OS.SelectObject(hdcDest, hOldDest);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
877 OS.DeleteDC(hdcSource);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
878 OS.DeleteDC(hdcDest);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
879
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
880 return hDib;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
881 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
882
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
883 // FIXME: Potential crash site in D: createGdipImage casts pointers to int before
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
884 // returning them in an int[]. Since the D GC does not and cannot scan int's for
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
885 // pointers, there is potential that the pointer's object could be collected while still
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
886 // active, even though it might be unlikely given the short span of time that the
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
887 // function has them stored in the int array.
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
888
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
889 int /*long*/ [] createGdipImage() {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
890 switch (type) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
891 case DWT.BITMAP: {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
892 if (alpha !is -1 || alphaData !is null || transparentPixel !is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
893 BITMAP bm;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
894 OS.GetObject(handle, BITMAP.sizeof, &bm);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
895 int imgWidth = bm.bmWidth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
896 int imgHeight = bm.bmHeight;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
897 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
898 auto srcHdc = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
899 auto oldSrcBitmap = OS.SelectObject(srcHdc, handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
900 auto memHdc = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
901 auto memDib = createDIB(imgWidth, imgHeight, 32);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
902 if (memDib is null) DWT.error(DWT.ERROR_NO_HANDLES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
903 auto oldMemBitmap = OS.SelectObject(memHdc, memDib);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
904 BITMAP dibBM;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
905 OS.GetObject(memDib, BITMAP.sizeof, &dibBM);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
906 int sizeInBytes = dibBM.bmWidthBytes * dibBM.bmHeight;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
907 OS.BitBlt(memHdc, 0, 0, imgWidth, imgHeight, srcHdc, 0, 0, OS.SRCCOPY);
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
908 ubyte red = 0, green = 0, blue = 0;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
909 if (transparentPixel !is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
910 if (bm.bmBitsPixel <= 8) {
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
911 ubyte[] color = new ubyte[4];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
912 OS.GetDIBColorTable(srcHdc, transparentPixel, 1, cast(RGBQUAD*)color.ptr);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
913 blue = color[0];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
914 green = color[1];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
915 red = color[2];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
916 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
917 switch (bm.bmBitsPixel) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
918 case 16:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
919 int blueMask = 0x1F;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
920 int blueShift = ImageData.getChannelShift(blueMask);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
921 byte[] blues = ImageData.ANY_TO_EIGHT[ImageData.getChannelWidth(blueMask, blueShift)];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
922 blue = blues[(transparentPixel & blueMask) >> blueShift];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
923 int greenMask = 0x3E0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
924 int greenShift = ImageData.getChannelShift(greenMask);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
925 byte[] greens = ImageData.ANY_TO_EIGHT[ImageData.getChannelWidth(greenMask, greenShift)];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
926 green = greens[(transparentPixel & greenMask) >> greenShift];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
927 int redMask = 0x7C00;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
928 int redShift = ImageData.getChannelShift(redMask);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
929 byte[] reds = ImageData.ANY_TO_EIGHT[ImageData.getChannelWidth(redMask, redShift)];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
930 red = reds[(transparentPixel & redMask) >> redShift];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
931 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
932 case 24:
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
933 blue = cast(ubyte)((transparentPixel & 0xFF0000) >> 16);
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
934 green = cast(ubyte)((transparentPixel & 0xFF00) >> 8);
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
935 red = cast(ubyte)(transparentPixel & 0xFF);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
936 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
937 case 32:
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
938 blue = cast(ubyte)((transparentPixel & 0xFF000000) >>> 24);
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
939 green = cast(ubyte)((transparentPixel & 0xFF0000) >> 16);
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
940 red = cast(ubyte)((transparentPixel & 0xFF00) >> 8);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
941 break;
81
e10cbfc977d2 switch default cases
Frank Benoit <benoit@tionex.de>
parents: 53
diff changeset
942 default:
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
943 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
944 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
945 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
946 OS.SelectObject(srcHdc, oldSrcBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
947 OS.SelectObject(memHdc, oldMemBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
948 OS.DeleteObject(srcHdc);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
949 OS.DeleteObject(memHdc);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
950 ubyte[] srcData = new ubyte[sizeInBytes];
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
951 OS.MoveMemory(srcData.ptr, dibBM.bmBits, sizeInBytes);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
952 OS.DeleteObject(memDib);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
953 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
954 if (alpha !is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
955 for (int y = 0, dp = 0; y < imgHeight; ++y) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
956 for (int x = 0; x < imgWidth; ++x) {
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
957 srcData[dp + 3] = cast(ubyte)alpha;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
958 dp += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
959 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
960 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
961 } else if (alphaData !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
962 for (int y = 0, dp = 0, ap = 0; y < imgHeight; ++y) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
963 for (int x = 0; x < imgWidth; ++x) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
964 srcData[dp + 3] = alphaData[ap++];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
965 dp += 4;
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 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
968 } else if (transparentPixel !is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
969 for (int y = 0, dp = 0; y < imgHeight; ++y) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
970 for (int x = 0; x < imgWidth; ++x) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
971 if (srcData[dp] is blue && srcData[dp + 1] is green && srcData[dp + 2] is red) {
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
972 srcData[dp + 3] = cast(ubyte)0;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
973 } else {
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
974 srcData[dp + 3] = cast(ubyte)0xFF;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
975 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
976 dp += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
977 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
978 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
979 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
980 auto hHeap = OS.GetProcessHeap();
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
981 auto pixels = cast(ubyte*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, srcData.length);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
982 if (pixels is null) DWT.error(DWT.ERROR_NO_HANDLES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
983 OS.MoveMemory(pixels, srcData.ptr, sizeInBytes);
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
984 return [ cast(int)(Gdip.Bitmap_new(imgWidth, imgHeight, dibBM.bmWidthBytes, Gdip.PixelFormat32bppARGB, pixels)), cast(int) pixels];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
985 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
986 return [cast(int)Gdip.Bitmap_new(handle, null), 0];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
987 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
988 case DWT.ICON: {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
989 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
990 * Bug in GDI+. Creating a new GDI+ Bitmap from a HICON segment faults
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
991 * when the icon width is bigger than the icon height. The fix is to
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
992 * detect this and create a PixelFormat32bppARGB image instead.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
993 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
994 ICONINFO iconInfo;
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
995 static if (OS.IsWinCE) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
996 GetIconInfo(this, &iconInfo);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
997 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
998 OS.GetIconInfo(handle, &iconInfo);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
999 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1000 auto hBitmap = iconInfo.hbmColor;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1001 if (hBitmap is null) hBitmap = iconInfo.hbmMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1002 BITMAP bm;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1003 OS.GetObject(hBitmap, BITMAP.sizeof, &bm);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1004 int imgWidth = bm.bmWidth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1005 int imgHeight = hBitmap is iconInfo.hbmMask ? bm.bmHeight / 2 : bm.bmHeight;
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
1006 Gdip.Bitmap img;
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
1007 ubyte* pixels;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1008 /*
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1009 * Bug in GDI+. Bitmap_new() segments fault if the image width
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1010 * is greater than the image height.
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1011 *
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1012 * Note that it also fails to generated an appropriate alpha
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1013 * channel when the icon depth is 32.
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1014 */
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1015 if (imgWidth > imgHeight || bm.bmBitsPixel is 32) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1016 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1017 auto srcHdc = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1018 auto oldSrcBitmap = OS.SelectObject(srcHdc, hBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1019 auto memHdc = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1020 auto memDib = createDIB(imgWidth, imgHeight, 32);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1021 if (memDib is null) DWT.error(DWT.ERROR_NO_HANDLES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1022 auto oldMemBitmap = OS.SelectObject(memHdc, memDib);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1023 BITMAP dibBM;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1024 OS.GetObject(memDib, BITMAP.sizeof, &dibBM);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1025 OS.BitBlt(memHdc, 0, 0, imgWidth, imgHeight, srcHdc, 0, hBitmap is iconInfo.hbmMask ? imgHeight : 0, OS.SRCCOPY);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1026 OS.SelectObject(memHdc, oldMemBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1027 OS.DeleteObject(memHdc);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1028 ubyte[] srcData = new ubyte[dibBM.bmWidthBytes * dibBM.bmHeight];
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1029 OS.MoveMemory(srcData.ptr, dibBM.bmBits, srcData.length);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1030 OS.DeleteObject(memDib);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1031 OS.SelectObject(srcHdc, iconInfo.hbmMask);
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1032 for (int y = 0, dp = 3; y < imgHeight; ++y) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1033 for (int x = 0; x < imgWidth; ++x) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1034 if (srcData[dp] is 0) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1035 if (OS.GetPixel(srcHdc, x, y) !is 0) {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1036 srcData[dp] = cast(ubyte)0;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1037 } else {
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1038 srcData[dp] = cast(ubyte)0xFF;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1039 }
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1040 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1041 dp += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1042 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1043 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1044 OS.SelectObject(srcHdc, oldSrcBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1045 OS.DeleteObject(srcHdc);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1046 device.internal_dispose_GC(hDC, null);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1047 auto hHeap = OS.GetProcessHeap();
53
0405e18fec7f Gdiplus implemented - test build of dwt.lib successful; updated graphics package as necessary
John Reimer <terminal.node@gmail.com
parents: 48
diff changeset
1048 pixels = cast(ubyte*) OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, srcData.length);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1049 if (pixels is null) DWT.error(DWT.ERROR_NO_HANDLES);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1050 OS.MoveMemory(pixels, srcData.ptr, srcData.length);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1051 img = Gdip.Bitmap_new(imgWidth, imgHeight, dibBM.bmWidthBytes, Gdip.PixelFormat32bppARGB, pixels);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1052 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1053 img = Gdip.Bitmap_new(handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1054 }
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1055 if (iconInfo.hbmColor !is null) OS.DeleteObject(iconInfo.hbmColor);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1056 if (iconInfo.hbmMask !is null) OS.DeleteObject(iconInfo.hbmMask);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1057 return [ cast(int)img, cast(int) pixels ];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1058 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1059 default: DWT.error(DWT.ERROR_INVALID_IMAGE);
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 return null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1062 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1063
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1064 void destroy () {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1065 if (memGC !is null) memGC.dispose();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1066 if (type is DWT.ICON) {
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1067 static if (OS.IsWinCE) data = null;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1068 OS.DestroyIcon (handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1069 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1070 OS.DeleteObject (handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1071 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1072 handle = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1073 memGC = null;
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
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 * Compares the argument to the receiver, and returns true
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1078 * if they represent the <em>same</em> object using a class
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1079 * specific comparison.
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 * @param object the object to compare with this object
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1082 * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1083 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1084 * @see #hashCode
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1085 */
48
9a64a7781bab Added override and alias, first chunk. Thanks torhu for doing this patch.
Frank Benoit <benoit@tionex.de>
parents: 23
diff changeset
1086 override public int opEquals (Object object) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1087 if (object is this) return true;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1088 if (!(cast(Image)object)) return false;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1089 Image image = cast(Image) object;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1090 return device is image.device && handle is image.handle;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1091 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1092
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1093 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1094 * Returns the color to which to map the transparent pixel, or null if
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1095 * the receiver has no transparent pixel.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1096 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1097 * There are certain uses of Images that do not support transparency
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1098 * (for example, setting an image into a button or label). In these cases,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1099 * it may be desired to simulate transparency by using the background
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1100 * color of the widget to paint the transparent pixels of the image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1101 * Use this method to check which color will be used in these cases
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1102 * in place of transparency. This value may be set with setBackground().
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1103 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1104 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1105 * @return the background color of the image, or null if there is no transparency in the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1106 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1107 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1108 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1109 * </ul>
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 public Color getBackground() {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1112 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1113 if (transparentPixel is -1) return null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1114
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1115 /* Get the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1116 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1117
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1118 /* Compute the background color */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1119 BITMAP bm;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1120 OS.GetObject(handle, BITMAP.sizeof, &bm);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1121 auto hdcMem = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1122 auto hOldObject = OS.SelectObject(hdcMem, handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1123 int red = 0, green = 0, blue = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1124 if (bm.bmBitsPixel <= 8) {
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1125 static if (OS.IsWinCE) {
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1126 byte[1] pBits;
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1127 OS.MoveMemory(pBits.ptr, bm.bmBits, 1);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1128 byte oldValue = pBits[0];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1129 int mask = (0xFF << (8 - bm.bmBitsPixel)) & 0x00FF;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1130 pBits[0] = cast(byte)((transparentPixel << (8 - bm.bmBitsPixel)) | (pBits[0] & ~mask));
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1131 OS.MoveMemory(bm.bmBits, pBits.ptr, 1);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1132 int color = OS.GetPixel(hdcMem, 0, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1133 pBits[0] = oldValue;
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1134 OS.MoveMemory(bm.bmBits, pBits.ptr, 1);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1135 blue = (color & 0xFF0000) >> 16;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1136 green = (color & 0xFF00) >> 8;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1137 red = color & 0xFF;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1138 } else {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1139 RGBQUAD color;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1140 OS.GetDIBColorTable(hdcMem, transparentPixel, 1, &color);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1141 blue = color.rgbBlue;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1142 green = color.rgbGreen;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1143 red = color.rgbRed;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1144 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1145 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1146 switch (bm.bmBitsPixel) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1147 case 16:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1148 blue = (transparentPixel & 0x1F) << 3;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1149 green = (transparentPixel & 0x3E0) >> 2;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1150 red = (transparentPixel & 0x7C00) >> 7;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1151 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1152 case 24:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1153 blue = (transparentPixel & 0xFF0000) >> 16;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1154 green = (transparentPixel & 0xFF00) >> 8;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1155 red = transparentPixel & 0xFF;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1156 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1157 case 32:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1158 blue = (transparentPixel & 0xFF000000) >>> 24;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1159 green = (transparentPixel & 0xFF0000) >> 16;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1160 red = (transparentPixel & 0xFF00) >> 8;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1161 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1162 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1163 return null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1164 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1165 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1166 OS.SelectObject(hdcMem, hOldObject);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1167 OS.DeleteDC(hdcMem);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1168
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1169 /* Release the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1170 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1171 return Color.win32_new(device, (blue << 16) | (green << 8) | red);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1172 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1173
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1174 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1175 * Returns the bounds of the receiver. The rectangle will always
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1176 * have x and y values of 0, and the width and height of the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1177 * image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1178 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1179 * @return a rectangle specifying the image's bounds
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 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1182 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1183 * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1184 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1185 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1186 public Rectangle getBounds() {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1187 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1188 if (width !is -1 && height !is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1189 return new Rectangle(0, 0, width, height);
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 switch (type) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1192 case DWT.BITMAP:
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1193 BITMAP bm;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1194 OS.GetObject(handle, BITMAP.sizeof, &bm);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1195 return new Rectangle(0, 0, width = bm.bmWidth, height = bm.bmHeight);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1196 case DWT.ICON:
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1197 static if (OS.IsWinCE) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1198 return new Rectangle(0, 0, width = data.width, height = data.height);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1199 } else {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1200 ICONINFO info;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1201 OS.GetIconInfo(handle, &info);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1202 auto hBitmap = info.hbmColor;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1203 if (hBitmap is null) hBitmap = info.hbmMask;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1204 BITMAP bm;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1205 OS.GetObject(hBitmap, BITMAP.sizeof, &bm);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1206 if (hBitmap is info.hbmMask) bm.bmHeight /= 2;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1207 if (info.hbmColor !is null) OS.DeleteObject(info.hbmColor);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1208 if (info.hbmMask !is null) OS.DeleteObject(info.hbmMask);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1209 return new Rectangle(0, 0, width = bm.bmWidth, height = bm.bmHeight);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1210 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1211 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1212 DWT.error(DWT.ERROR_INVALID_IMAGE);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1213 return null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1214 }
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
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1217 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1218 * Returns an <code>ImageData</code> based on the receiver
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1219 * Modifications made to this <code>ImageData</code> will not
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1220 * affect the Image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1221 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1222 * @return an <code>ImageData</code> containing the image's data and attributes
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1223 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1224 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1225 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1226 * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1227 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1228 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1229 * @see ImageData
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1230 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1231 public ImageData getImageData() {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1232 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1233 BITMAP bm;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1234 int depth, width, height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1235 switch (type) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1236 case DWT.ICON: {
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1237 static if (OS.IsWinCE) return data;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1238 ICONINFO info;
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1239 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1240 OS.GetIconInfo(handle, &info);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1241 /* Get the basic BITMAP information */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1242 auto hBitmap = info.hbmColor;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1243 if (hBitmap is null) hBitmap = info.hbmMask;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1244 OS.GetObject(hBitmap, BITMAP.sizeof, &bm);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1245 depth = bm.bmPlanes * bm.bmBitsPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1246 width = bm.bmWidth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1247 if (hBitmap is info.hbmMask) bm.bmHeight /= 2;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1248 height = bm.bmHeight;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1249 int numColors = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1250 if (depth <= 8) numColors = 1 << depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1251 /* Create the BITMAPINFO */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1252 BITMAPINFOHEADER bmiHeader;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1253 bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1254 bmiHeader.biWidth = width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1255 bmiHeader.biHeight = -height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1256 bmiHeader.biPlanes = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1257 bmiHeader.biBitCount = cast(short)depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1258 bmiHeader.biCompression = OS.BI_RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1259 byte[] bmi = new byte[BITMAPINFOHEADER.sizeof + numColors * 4];
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1260 OS.MoveMemory(bmi.ptr, &bmiHeader, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1261
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1262 /* Get the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1263 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1264
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1265 /* Create the DC and select the bitmap */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1266 auto hBitmapDC = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1267 auto hOldBitmap = OS.SelectObject(hBitmapDC, hBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1268 /* Select the palette if necessary */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1269 HPALETTE oldPalette;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1270 if (depth <= 8) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1271 auto hPalette = device.hPalette;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1272 if (hPalette !is null) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1273 oldPalette = OS.SelectPalette(hBitmapDC, hPalette, false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1274 OS.RealizePalette(hBitmapDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1275 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1276 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1277 /* Find the size of the image and allocate data */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1278 int imageSize;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1279 /* Call with null lpBits to get the image size */
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1280 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1281 OS.GetDIBits(hBitmapDC, hBitmap, 0, height, null, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1282 OS.MoveMemory(&bmiHeader, bmi.ptr, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1283 imageSize = bmiHeader.biSizeImage;
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1284 byte[] data = new byte[imageSize];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1285 /* Get the bitmap data */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1286 auto hHeap = OS.GetProcessHeap();
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1287 auto lpvBits = cast(byte*) OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, imageSize);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1288 if (lpvBits is null) DWT.error(DWT.ERROR_NO_HANDLES);
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1289 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1290 OS.GetDIBits(hBitmapDC, hBitmap, 0, height, lpvBits, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1291 OS.MoveMemory(data.ptr, lpvBits, imageSize);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1292 /* Calculate the palette */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1293 PaletteData palette = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1294 if (depth <= 8) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1295 RGB[] rgbs = new RGB[numColors];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1296 int srcIndex = 40;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1297 for (int i = 0; i < numColors; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1298 rgbs[i] = new RGB(bmi[srcIndex + 2] & 0xFF, bmi[srcIndex + 1] & 0xFF, bmi[srcIndex] & 0xFF);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1299 srcIndex += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1300 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1301 palette = new PaletteData(rgbs);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1302 } else if (depth is 16) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1303 palette = new PaletteData(0x7C00, 0x3E0, 0x1F);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1304 } else if (depth is 24) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1305 palette = new PaletteData(0xFF, 0xFF00, 0xFF0000);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1306 } else if (depth is 32) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1307 palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1308 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1309 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1310 }
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 /* Do the mask */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1313 byte [] maskData = null;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1314 if (info.hbmColor is null) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1315 /* Do the bottom half of the mask */
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1316 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1317 OS.GetDIBits(hBitmapDC, hBitmap, height, height, lpvBits, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1318 OS.MoveMemory(maskData.ptr, lpvBits, imageSize);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1319 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1320 /* Do the entire mask */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1321 /* Create the BITMAPINFO */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1322 bmiHeader = BITMAPINFOHEADER.init;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1323 bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1324 bmiHeader.biWidth = width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1325 bmiHeader.biHeight = -height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1326 bmiHeader.biPlanes = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1327 bmiHeader.biBitCount = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1328 bmiHeader.biCompression = OS.BI_RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1329 bmi = new byte[BITMAPINFOHEADER.sizeof + 8];
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1330 OS.MoveMemory(bmi.ptr, &bmiHeader, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1331
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1332 /* First color black, second color white */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1333 int offset = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1334 bmi[offset + 4] = bmi[offset + 5] = bmi[offset + 6] = cast(byte)0xFF;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1335 bmi[offset + 7] = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1336 OS.SelectObject(hBitmapDC, info.hbmMask);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1337 /* Call with null lpBits to get the image size */
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1338 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1339 OS.GetDIBits(hBitmapDC, info.hbmMask, 0, height, null, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1340 OS.MoveMemory(&bmiHeader, bmi.ptr, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1341 imageSize = bmiHeader.biSizeImage;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1342 maskData = new byte[imageSize];
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1343 auto lpvMaskBits = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, imageSize);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1344 if (lpvMaskBits is null) DWT.error(DWT.ERROR_NO_HANDLES);
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1345 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1346 OS.GetDIBits(hBitmapDC, info.hbmMask, 0, height, lpvMaskBits, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1347 OS.MoveMemory(maskData.ptr, lpvMaskBits, imageSize);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1348 OS.HeapFree(hHeap, 0, lpvMaskBits);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1349 /* Loop to invert the mask */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1350 for (int i = 0; i < maskData.length; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1351 maskData[i] ^= -1;
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 /* Make sure mask scanlinePad is 2 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1354 int maskPad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1355 int bpl = imageSize / height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1356 for (maskPad = 1; maskPad < 128; maskPad++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1357 int calcBpl = (((width + 7) / 8) + (maskPad - 1)) / maskPad * maskPad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1358 if (calcBpl is bpl) break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1359 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1360 maskData = ImageData.convertPad(maskData, width, height, 1, maskPad, 2);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1361 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1362 /* Clean up */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1363 OS.HeapFree(hHeap, 0, lpvBits);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1364 OS.SelectObject(hBitmapDC, hOldBitmap);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1365 if (oldPalette !is null) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1366 OS.SelectPalette(hBitmapDC, oldPalette, false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1367 OS.RealizePalette(hBitmapDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1368 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1369 OS.DeleteDC(hBitmapDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1370
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1371 /* Release the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1372 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1373
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1374 if (info.hbmColor !is null) OS.DeleteObject(info.hbmColor);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1375 if (info.hbmMask !is null) OS.DeleteObject(info.hbmMask);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1376 /* Construct and return the ImageData */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1377 ImageData imageData = new ImageData(width, height, depth, palette, 4, data);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1378 imageData.maskData = maskData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1379 imageData.maskPad = 2;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1380 return imageData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1381 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1382 case DWT.BITMAP: {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1383 /* Get the basic BITMAP information */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1384 bm = BITMAP.init;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1385 OS.GetObject(handle, BITMAP.sizeof, &bm);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1386 depth = bm.bmPlanes * bm.bmBitsPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1387 width = bm.bmWidth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1388 height = bm.bmHeight;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1389 /* Find out whether this is a DIB or a DDB. */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1390 bool isDib = (bm.bmBits !is null);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1391 /* Get the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1392 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1393
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1394 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1395 * Feature in WinCE. GetDIBits is not available in WinCE. The
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1396 * workaround is to create a temporary DIB from the DDB and use
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1397 * the bmBits field of DIBSECTION to retrieve the image data.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1398 */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1399 auto handle = this.handle;
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1400 static if (OS.IsWinCE) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1401 if (!isDib) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1402 bool mustRestore = false;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1403 if (memGC !is null && !memGC.isDisposed()) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1404 memGC.flush ();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1405 mustRestore = true;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1406 GCData data = memGC.data;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1407 if (data.hNullBitmap !is null) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1408 OS.SelectObject(memGC.handle, data.hNullBitmap);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1409 data.hNullBitmap = null;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1410 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1411 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1412 handle = createDIBFromDDB(hDC, this.handle, width, height);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1413 if (mustRestore) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1414 auto hOldBitmap = OS.SelectObject(memGC.handle, this.handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1415 memGC.data.hNullBitmap = hOldBitmap;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1416 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1417 isDib = true;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1418 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1419 }
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1420 DIBSECTION dib;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1421 if (isDib) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1422 OS.GetObject(handle, DIBSECTION.sizeof, &dib);
22
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 /* Calculate number of colors */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1425 int numColors = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1426 if (depth <= 8) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1427 if (isDib) {
237
e2affbeb686d Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
1428 numColors = dib.dsBmih.biClrUsed;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1429 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1430 numColors = 1 << depth;
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 /* Create the BITMAPINFO */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1434 byte[] bmi = null;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1435 BITMAPINFOHEADER bmiHeader;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1436 if (!isDib) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1437 bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1438 bmiHeader.biWidth = width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1439 bmiHeader.biHeight = -height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1440 bmiHeader.biPlanes = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1441 bmiHeader.biBitCount = cast(short)depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1442 bmiHeader.biCompression = OS.BI_RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1443 bmi = new byte[BITMAPINFOHEADER.sizeof + numColors * 4];
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1444 OS.MoveMemory(bmi.ptr, &bmiHeader, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1445 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1446
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1447 /* Create the DC and select the bitmap */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1448 auto hBitmapDC = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1449 auto hOldBitmap = OS.SelectObject(hBitmapDC, handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1450 /* Select the palette if necessary */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1451 HPALETTE oldPalette;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1452 if (!isDib && depth <= 8) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1453 auto hPalette = device.hPalette;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1454 if (hPalette !is null) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1455 oldPalette = OS.SelectPalette(hBitmapDC, hPalette, false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1456 OS.RealizePalette(hBitmapDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1457 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1458 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1459 /* Find the size of the image and allocate data */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1460 int imageSize;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1461 if (isDib) {
237
e2affbeb686d Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
1462 imageSize = dib.dsBmih.biSizeImage;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1463 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1464 /* Call with null lpBits to get the image size */
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1465 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1466 OS.GetDIBits(hBitmapDC, handle, 0, height, null, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1467 OS.MoveMemory(&bmiHeader, bmi.ptr, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1468 imageSize = bmiHeader.biSizeImage;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1469 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1470 byte[] data = new byte[imageSize];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1471 /* Get the bitmap data */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1472 if (isDib) {
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1473 if (OS.IsWinCE) {
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1474 if (this.handle !is handle) {
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1475 /* get image data from the temporary DIB */
237
e2affbeb686d Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
Frank Benoit <benoit@tionex.de>
parents: 213
diff changeset
1476 OS.MoveMemory(data.ptr, dib.dsBm.bmBits, imageSize);
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1477 }
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1478 } else {
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1479 OS.MoveMemory(data.ptr, bm.bmBits, imageSize);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1480 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1481 } else {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1482 auto hHeap = OS.GetProcessHeap();
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1483 auto lpvBits = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, imageSize);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1484 if (lpvBits is null) DWT.error(DWT.ERROR_NO_HANDLES);
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1485 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1486 OS.GetDIBits(hBitmapDC, handle, 0, height, lpvBits, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS);
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1487 OS.MoveMemory(data.ptr, lpvBits, imageSize);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1488 OS.HeapFree(hHeap, 0, lpvBits);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1489 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1490 /* Calculate the palette */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1491 PaletteData palette = null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1492 if (depth <= 8) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1493 RGB[] rgbs = new RGB[numColors];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1494 if (isDib) {
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1495 static if (OS.IsWinCE) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1496 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1497 * Feature on WinCE. GetDIBColorTable is not supported.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1498 * The workaround is to set a pixel to the desired
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1499 * palette index and use getPixel to get the corresponding
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1500 * RGB value.
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 int red = 0, green = 0, blue = 0;
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1503 byte[1] pBits;
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1504 OS.MoveMemory(pBits.ptr, bm.bmBits, 1);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1505 byte oldValue = pBits[0];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1506 int mask = (0xFF << (8 - bm.bmBitsPixel)) & 0x00FF;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1507 for (int i = 0; i < numColors; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1508 pBits[0] = cast(byte)((i << (8 - bm.bmBitsPixel)) | (pBits[0] & ~mask));
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1509 OS.MoveMemory(bm.bmBits, pBits.ptr, 1);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1510 int color = OS.GetPixel(hBitmapDC, 0, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1511 blue = (color & 0xFF0000) >> 16;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1512 green = (color & 0xFF00) >> 8;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1513 red = color & 0xFF;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1514 rgbs[i] = new RGB(red, green, blue);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1515 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1516 pBits[0] = oldValue;
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1517 OS.MoveMemory(bm.bmBits, pBits.ptr, 1);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1518 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1519 byte[] colors = new byte[numColors * 4];
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1520 OS.GetDIBColorTable(hBitmapDC, 0, numColors, cast(RGBQUAD*)colors.ptr);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1521 int colorIndex = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1522 for (int i = 0; i < rgbs.length; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1523 rgbs[i] = new RGB(colors[colorIndex + 2] & 0xFF, colors[colorIndex + 1] & 0xFF, colors[colorIndex] & 0xFF);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1524 colorIndex += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1525 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1526 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1527 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1528 int srcIndex = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1529 for (int i = 0; i < numColors; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1530 rgbs[i] = new RGB(bmi[srcIndex + 2] & 0xFF, bmi[srcIndex + 1] & 0xFF, bmi[srcIndex] & 0xFF);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1531 srcIndex += 4;
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 palette = new PaletteData(rgbs);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1535 } else if (depth is 16) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1536 palette = new PaletteData(0x7C00, 0x3E0, 0x1F);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1537 } else if (depth is 24) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1538 palette = new PaletteData(0xFF, 0xFF00, 0xFF0000);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1539 } else if (depth is 32) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1540 palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1541 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1542 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1543 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1544 /* Clean up */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1545 OS.SelectObject(hBitmapDC, hOldBitmap);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1546 if (oldPalette !is null) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1547 OS.SelectPalette(hBitmapDC, oldPalette, false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1548 OS.RealizePalette(hBitmapDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1549 }
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1550 static if (OS.IsWinCE) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1551 if (handle !is this.handle) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1552 /* free temporary DIB */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1553 OS.DeleteObject (handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1554 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1555 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1556 OS.DeleteDC(hBitmapDC);
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 /* Release the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1559 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1560
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1561 /* Construct and return the ImageData */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1562 ImageData imageData = new ImageData(width, height, depth, palette, 4, data);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1563 imageData.transparentPixel = this.transparentPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1564 imageData.alpha = alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1565 if (alpha is -1 && alphaData !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1566 imageData.alphaData = new byte[alphaData.length];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1567 System.arraycopy(alphaData, 0, imageData.alphaData, 0, alphaData.length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1568 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1569 return imageData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1570 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1571 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1572 DWT.error(DWT.ERROR_INVALID_IMAGE);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1573 return null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1574 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1575 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1576
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1577 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1578 * Returns an integer hash code for the receiver. Any two
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1579 * objects that return <code>true</code> when passed to
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1580 * <code>equals</code> must return the same value for this
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1581 * method.
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 the receiver's hash
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1584 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1585 * @see #equals
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1586 */
48
9a64a7781bab Added override and alias, first chunk. Thanks torhu for doing this patch.
Frank Benoit <benoit@tionex.de>
parents: 23
diff changeset
1587 override public hash_t toHash () {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1588 return cast(hash_t)handle;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1589 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1590
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1591 void init_(int width, int height) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1592 if (width <= 0 || height <= 0) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1593 DWT.error (DWT.ERROR_INVALID_ARGUMENT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1594 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1595 type = DWT.BITMAP;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1596 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1597 handle = OS.CreateCompatibleBitmap(hDC, width, height);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1598 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1599 * Feature in Windows. CreateCompatibleBitmap() may fail
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1600 * for large images. The fix is to create a DIB section
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1601 * in that case.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1602 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1603 if (handle is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1604 int bits = OS.GetDeviceCaps(hDC, OS.BITSPIXEL);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1605 int planes = OS.GetDeviceCaps(hDC, OS.PLANES);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1606 int depth = bits * planes;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1607 if (depth < 16) depth = 16;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1608 handle = createDIB(width, height, depth);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1609 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1610 if (handle !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1611 auto memDC = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1612 auto hOldBitmap = OS.SelectObject(memDC, handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1613 OS.PatBlt(memDC, 0, 0, width, height, OS.PATCOPY);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1614 OS.SelectObject(memDC, hOldBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1615 OS.DeleteDC(memDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1616 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1617 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1618 if (handle is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1619 DWT.error(DWT.ERROR_NO_HANDLES, null, device.getLastError());
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1620 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1621 }
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 HGDIOBJ createDIB(int width, int height, int depth) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1624 BITMAPINFOHEADER bmiHeader;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1625 bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1626 bmiHeader.biWidth = width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1627 bmiHeader.biHeight = -height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1628 bmiHeader.biPlanes = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1629 bmiHeader.biBitCount = cast(short)depth;
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1630 static if (OS.IsWinCE) bmiHeader.biCompression = OS.BI_BITFIELDS;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1631 else bmiHeader.biCompression = OS.BI_RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1632 byte[] bmi = new byte[BITMAPINFOHEADER.sizeof + (OS.IsWinCE ? 12 : 0)];
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1633 OS.MoveMemory(bmi.ptr, &bmiHeader, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1634 /* Set the rgb colors into the bitmap info */
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1635 static if (OS.IsWinCE) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1636 int redMask = 0xFF00;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1637 int greenMask = 0xFF0000;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1638 int blueMask = 0xFF000000;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1639 /* big endian */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1640 int offset = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1641 bmi[offset] = cast(byte)((redMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1642 bmi[offset + 1] = cast(byte)((redMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1643 bmi[offset + 2] = cast(byte)((redMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1644 bmi[offset + 3] = cast(byte)((redMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1645 bmi[offset + 4] = cast(byte)((greenMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1646 bmi[offset + 5] = cast(byte)((greenMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1647 bmi[offset + 6] = cast(byte)((greenMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1648 bmi[offset + 7] = cast(byte)((greenMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1649 bmi[offset + 8] = cast(byte)((blueMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1650 bmi[offset + 9] = cast(byte)((blueMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1651 bmi[offset + 10] = cast(byte)((blueMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1652 bmi[offset + 11] = cast(byte)((blueMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1653 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1654
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1655 void* pBits;
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1656 return OS.CreateDIBSection(null, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS, &pBits, null, 0);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1657 }
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 * Feature in WinCE. GetIconInfo is not available in WinCE.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1661 * The workaround is to cache the object ImageData for images
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1662 * of type DWT.ICON. The bitmaps hbmMask and hbmColor can then
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1663 * be reconstructed by using our version of getIconInfo.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1664 * This function takes an ICONINFO object and sets the fields
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1665 * hbmMask and hbmColor with the corresponding bitmaps it has
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1666 * created.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1667 * Note. These bitmaps must be freed - as they would have to be
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1668 * if the regular GetIconInfo had been used.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1669 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1670 static void GetIconInfo(Image image, ICONINFO* info) {
197
184ab53b7785 Changes and fixes for jface
Frank Benoit <benoit@tionex.de>
parents: 117
diff changeset
1671 int[] result = init_(image.device, null, image.data);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1672 info.hbmColor = cast(HBITMAP)result[0];
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1673 info.hbmMask = cast(HBITMAP)result[1];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1674 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1675
197
184ab53b7785 Changes and fixes for jface
Frank Benoit <benoit@tionex.de>
parents: 117
diff changeset
1676 static int[] init_(Device device, Image image, ImageData i) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1677
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1678 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1679 * BUG in Windows 98:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1680 * A monochrome DIBSection will display as solid black
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1681 * on Windows 98 machines, even though it contains the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1682 * correct data. The fix is to convert 1-bit ImageData
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1683 * into 4-bit ImageData before creating the image.
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 /* Windows does not support 2-bit images. Convert to 4-bit image. */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1686 if ((OS.IsWin95 && i.depth is 1 && i.getTransparencyType() !is DWT.TRANSPARENCY_MASK) || i.depth is 2) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1687 ImageData img = new ImageData(i.width, i.height, 4, i.palette);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1688 ImageData.blit(ImageData.BLIT_SRC,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1689 i.data, i.depth, i.bytesPerLine, i.getByteOrder(), 0, 0, i.width, i.height, null, null, null,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1690 ImageData.ALPHA_OPAQUE, null, 0, 0, 0,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1691 img.data, img.depth, img.bytesPerLine, i.getByteOrder(), 0, 0, img.width, img.height, null, null, null,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1692 false, false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1693 img.transparentPixel = i.transparentPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1694 img.maskPad = i.maskPad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1695 img.maskData = i.maskData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1696 img.alpha = i.alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1697 img.alphaData = i.alphaData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1698 i = img;
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 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1701 * Windows supports 16-bit mask of (0x7C00, 0x3E0, 0x1F),
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1702 * 24-bit mask of (0xFF0000, 0xFF00, 0xFF) and 32-bit mask
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1703 * (0x00FF0000, 0x0000FF00, 0x000000FF) as documented in
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1704 * MSDN BITMAPINFOHEADER. Make sure the image is
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1705 * Windows-supported.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1706 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1707 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1708 * Note on WinCE. CreateDIBSection requires the biCompression
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1709 * field of the BITMAPINFOHEADER to be set to BI_BITFIELDS for
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1710 * 16 and 32 bit direct images (see MSDN for CreateDIBSection).
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1711 * In this case, the color mask can be set to any value. For
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1712 * consistency, it is set to the same mask used by non WinCE
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1713 * platforms in BI_RGB mode.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1714 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1715 if (i.palette.isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1716 final PaletteData palette = i.palette;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1717 final int redMask = palette.redMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1718 final int greenMask = palette.greenMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1719 final int blueMask = palette.blueMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1720 int newDepth = i.depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1721 int newOrder = ImageData.MSB_FIRST;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1722 PaletteData newPalette = null;
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 switch (i.depth) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1725 case 8:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1726 newDepth = 16;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1727 newOrder = ImageData.LSB_FIRST;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1728 newPalette = new PaletteData(0x7C00, 0x3E0, 0x1F);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1729 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1730 case 16:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1731 newOrder = ImageData.LSB_FIRST;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1732 if (!(redMask is 0x7C00 && greenMask is 0x3E0 && blueMask is 0x1F)) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1733 newPalette = new PaletteData(0x7C00, 0x3E0, 0x1F);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1734 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1735 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1736 case 24:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1737 if (!(redMask is 0xFF && greenMask is 0xFF00 && blueMask is 0xFF0000)) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1738 newPalette = new PaletteData(0xFF, 0xFF00, 0xFF0000);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1739 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1740 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1741 case 32:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1742 if (!(redMask is 0xFF00 && greenMask is 0xFF0000 && blueMask is 0xFF000000)) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1743 newPalette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1744 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1745 break;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1746 default:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1747 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH);
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 if (newPalette !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1750 ImageData img = new ImageData(i.width, i.height, newDepth, newPalette);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1751 ImageData.blit(ImageData.BLIT_SRC,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1752 i.data, i.depth, i.bytesPerLine, i.getByteOrder(), 0, 0, i.width, i.height, redMask, greenMask, blueMask,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1753 ImageData.ALPHA_OPAQUE, null, 0, 0, 0,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1754 img.data, img.depth, img.bytesPerLine, newOrder, 0, 0, img.width, img.height, newPalette.redMask, newPalette.greenMask, newPalette.blueMask,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1755 false, false);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1756 if (i.transparentPixel !is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1757 img.transparentPixel = newPalette.getPixel(palette.getRGB(i.transparentPixel));
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1758 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1759 img.maskPad = i.maskPad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1760 img.maskData = i.maskData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1761 img.alpha = i.alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1762 img.alphaData = i.alphaData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1763 i = img;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1764 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1765 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1766 /* Construct bitmap info header by hand */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1767 RGB[] rgbs = i.palette.getRGBs();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1768 bool useBitfields = OS.IsWinCE && (i.depth is 16 || i.depth is 32);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1769 BITMAPINFOHEADER bmiHeader;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1770 bmiHeader.biSize = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1771 bmiHeader.biWidth = i.width;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1772 bmiHeader.biHeight = -i.height;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1773 bmiHeader.biPlanes = 1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1774 bmiHeader.biBitCount = cast(short)i.depth;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1775 if (useBitfields) bmiHeader.biCompression = OS.BI_BITFIELDS;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1776 else bmiHeader.biCompression = OS.BI_RGB;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1777 bmiHeader.biClrUsed = rgbs is null ? 0 : rgbs.length;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1778 byte[] bmi;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1779 if (i.palette.isDirect)
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1780 bmi = new byte[BITMAPINFOHEADER.sizeof + (useBitfields ? 12 : 0)];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1781 else
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1782 bmi = new byte[BITMAPINFOHEADER.sizeof + rgbs.length * 4];
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1783 OS.MoveMemory(bmi.ptr, &bmiHeader, BITMAPINFOHEADER.sizeof);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1784 /* Set the rgb colors into the bitmap info */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1785 int offset = BITMAPINFOHEADER.sizeof;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1786 if (i.palette.isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1787 if (useBitfields) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1788 PaletteData palette = i.palette;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1789 int redMask = palette.redMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1790 int greenMask = palette.greenMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1791 int blueMask = palette.blueMask;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1792 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1793 * The color masks must be written based on the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1794 * endianness of the ImageData.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1795 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1796 if (i.getByteOrder() is ImageData.LSB_FIRST) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1797 bmi[offset] = cast(byte)((redMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1798 bmi[offset + 1] = cast(byte)((redMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1799 bmi[offset + 2] = cast(byte)((redMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1800 bmi[offset + 3] = cast(byte)((redMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1801 bmi[offset + 4] = cast(byte)((greenMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1802 bmi[offset + 5] = cast(byte)((greenMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1803 bmi[offset + 6] = cast(byte)((greenMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1804 bmi[offset + 7] = cast(byte)((greenMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1805 bmi[offset + 8] = cast(byte)((blueMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1806 bmi[offset + 9] = cast(byte)((blueMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1807 bmi[offset + 10] = cast(byte)((blueMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1808 bmi[offset + 11] = cast(byte)((blueMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1809 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1810 bmi[offset] = cast(byte)((redMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1811 bmi[offset + 1] = cast(byte)((redMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1812 bmi[offset + 2] = cast(byte)((redMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1813 bmi[offset + 3] = cast(byte)((redMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1814 bmi[offset + 4] = cast(byte)((greenMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1815 bmi[offset + 5] = cast(byte)((greenMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1816 bmi[offset + 6] = cast(byte)((greenMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1817 bmi[offset + 7] = cast(byte)((greenMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1818 bmi[offset + 8] = cast(byte)((blueMask & 0xFF000000) >> 24);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1819 bmi[offset + 9] = cast(byte)((blueMask & 0xFF0000) >> 16);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1820 bmi[offset + 10] = cast(byte)((blueMask & 0xFF00) >> 8);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1821 bmi[offset + 11] = cast(byte)((blueMask & 0xFF) >> 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1822 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1823 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1824 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1825 for (int j = 0; j < rgbs.length; j++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1826 bmi[offset] = cast(byte)rgbs[j].blue;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1827 bmi[offset + 1] = cast(byte)rgbs[j].green;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1828 bmi[offset + 2] = cast(byte)rgbs[j].red;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1829 bmi[offset + 3] = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1830 offset += 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1831 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1832 }
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1833 void* pBits;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1834 auto hDib = OS.CreateDIBSection(null, cast(BITMAPINFO*)bmi.ptr, OS.DIB_RGB_COLORS, &pBits, null, 0);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1835 if (hDib is null) DWT.error(DWT.ERROR_NO_HANDLES);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1836 /* In case of a scanline pad other than 4, do the work to convert it */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1837 byte[] data = i.data;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1838 if (i.scanlinePad !is 4 && (i.bytesPerLine % 4 !is 0)) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1839 data = ImageData.convertPad(data, i.width, i.height, i.depth, i.scanlinePad, 4);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1840 }
95
04d34191e2e9 Fix: MoveMemory, Images are now colored
Frank Benoit <benoit@tionex.de>
parents: 81
diff changeset
1841 OS.MoveMemory(pBits, data.ptr, data.length);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1842
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1843 int /*long*/ [] result = null;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1844 if (i.getTransparencyType() is DWT.TRANSPARENCY_MASK) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1845 /* Get the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1846 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1847
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1848 /* Create the color bitmap */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1849 auto hdcSrc = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1850 OS.SelectObject(hdcSrc, hDib);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1851 auto hBitmap = OS.CreateCompatibleBitmap(hDC, i.width, i.height);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1852 if (hBitmap is null) DWT.error(DWT.ERROR_NO_HANDLES);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1853 auto hdcDest = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1854 OS.SelectObject(hdcDest, hBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1855 OS.BitBlt(hdcDest, 0, 0, i.width, i.height, hdcSrc, 0, 0, OS.SRCCOPY);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1856
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1857 /* Release the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1858 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1859
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1860 /* Create the mask. Windows requires icon masks to have a scanline pad of 2. */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1861 byte[] maskData = ImageData.convertPad(i.maskData, i.width, i.height, 1, i.maskPad, 2);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1862 auto hMask = OS.CreateBitmap(i.width, i.height, 1, 1, maskData.ptr);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1863 if (hMask is null) DWT.error(DWT.ERROR_NO_HANDLES);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1864 OS.SelectObject(hdcSrc, hMask);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1865 OS.PatBlt(hdcSrc, 0, 0, i.width, i.height, OS.DSTINVERT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1866 OS.DeleteDC(hdcSrc);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1867 OS.DeleteDC(hdcDest);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1868 OS.DeleteObject(hDib);
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 if (image is null) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1871 result = [ cast(int) hBitmap, cast(int) hMask];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1872 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1873 /* Create the icon */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1874 ICONINFO info;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1875 info.fIcon = true;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1876 info.hbmColor = hBitmap;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1877 info.hbmMask = hMask;
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1878 auto hIcon = OS.CreateIconIndirect(&info);
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1879 if (hIcon is null) DWT.error(DWT.ERROR_NO_HANDLES);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1880 OS.DeleteObject(hBitmap);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1881 OS.DeleteObject(hMask);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1882 image.handle = hIcon;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1883 image.type = DWT.ICON;
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
1884 static if (OS.IsWinCE) image.data = i;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1885 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1886 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1887 if (image is null) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1888 result = [ cast(int) hDib];
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1889 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1890 image.handle = hDib;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1891 image.type = DWT.BITMAP;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1892 image.transparentPixel = i.transparentPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1893 if (image.transparentPixel is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1894 image.alpha = i.alpha;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1895 if (i.alpha is -1 && i.alphaData !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1896 int length = i.alphaData.length;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1897 image.alphaData = new byte[length];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1898 System.arraycopy(i.alphaData, 0, image.alphaData, 0, length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1899 }
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 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1903 return result;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1904 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1905
197
184ab53b7785 Changes and fixes for jface
Frank Benoit <benoit@tionex.de>
parents: 117
diff changeset
1906 static int[] init_(Device device, Image image, ImageData source, ImageData mask) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1907 /* Create a temporary image and locate the black pixel */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1908 ImageData imageData;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1909 int blackIndex = 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1910 if (source.palette.isDirect) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1911 imageData = new ImageData(source.width, source.height, source.depth, source.palette);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1912 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1913 RGB black = new RGB(0, 0, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1914 RGB[] rgbs = source.getRGBs();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1915 if (source.transparentPixel !is -1) {
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 * The source had transparency, so we can use the transparent pixel
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1918 * for black.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1919 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1920 RGB[] newRGBs = new RGB[rgbs.length];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1921 System.arraycopy(rgbs, 0, newRGBs, 0, rgbs.length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1922 if (source.transparentPixel >= newRGBs.length) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1923 /* Grow the palette with black */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1924 rgbs = new RGB[source.transparentPixel + 1];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1925 System.arraycopy(newRGBs, 0, rgbs, 0, newRGBs.length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1926 for (int i = newRGBs.length; i <= source.transparentPixel; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1927 rgbs[i] = new RGB(0, 0, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1928 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1929 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1930 newRGBs[source.transparentPixel] = black;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1931 rgbs = newRGBs;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1932 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1933 blackIndex = source.transparentPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1934 imageData = new ImageData(source.width, source.height, source.depth, new PaletteData(rgbs));
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1935 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1936 while (blackIndex < rgbs.length) {
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
1937 if (rgbs[blackIndex] ==/*eq*/ black) break;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1938 blackIndex++;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1939 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1940 if (blackIndex is rgbs.length) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1941 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1942 * We didn't find black in the palette, and there is no transparent
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1943 * pixel we can use.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1944 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1945 if ((1 << source.depth) > rgbs.length) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1946 /* We can grow the palette and add black */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1947 RGB[] newRGBs = new RGB[rgbs.length + 1];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1948 System.arraycopy(rgbs, 0, newRGBs, 0, rgbs.length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1949 newRGBs[rgbs.length] = black;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1950 rgbs = newRGBs;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1951 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1952 /* No room to grow the palette */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1953 blackIndex = -1;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1954 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1955 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1956 imageData = new ImageData(source.width, source.height, source.depth, new PaletteData(rgbs));
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1957 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1958 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1959 if (blackIndex is -1) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1960 /* There was no black in the palette, so just copy the data over */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1961 System.arraycopy(source.data, 0, imageData.data, 0, imageData.data.length);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1962 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1963 /* Modify the source image to contain black wherever the mask is 0 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1964 int[] imagePixels = new int[imageData.width];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1965 int[] maskPixels = new int[mask.width];
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1966 for (int y = 0; y < imageData.height; y++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1967 source.getPixels(0, y, imageData.width, imagePixels, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1968 mask.getPixels(0, y, mask.width, maskPixels, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1969 for (int i = 0; i < imagePixels.length; i++) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1970 if (maskPixels[i] is 0) imagePixels[i] = blackIndex;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1971 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1972 imageData.setPixels(0, y, source.width, imagePixels, 0);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1973 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1974 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1975 imageData.maskPad = mask.scanlinePad;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1976 imageData.maskData = mask.data;
197
184ab53b7785 Changes and fixes for jface
Frank Benoit <benoit@tionex.de>
parents: 117
diff changeset
1977 return init_(device, image, imageData);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1978 }
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1979 void init_(ImageData i) {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1980 if (i is null) DWT.error(DWT.ERROR_NULL_ARGUMENT);
197
184ab53b7785 Changes and fixes for jface
Frank Benoit <benoit@tionex.de>
parents: 117
diff changeset
1981 init_(device, this, i);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1982 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1983
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1984 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1985 * Invokes platform specific functionality to allocate a new GC handle.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1986 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1987 * <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
1988 * API for <code>Image</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
1989 * can be shared within the packages provided by DWT. It is not
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1990 * available on all platforms, and should never be called from
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1991 * application code.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1992 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1993 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1994 * @param data the platform specific GC data
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1995 * @return the platform specific GC handle
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1996 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1997 public HDC internal_new_GC (GCData data) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1998 if (handle is null) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1999 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2000 * Create a new GC that can draw into the image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2001 * Only supported for bitmaps.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2002 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2003 if (type !is DWT.BITMAP || memGC !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2004 DWT.error(DWT.ERROR_INVALID_ARGUMENT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2005 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2006
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2007 /* Create a compatible HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2008 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2009 auto imageDC = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2010 device.internal_dispose_GC(hDC, null);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
2011 if (imageDC is null) DWT.error(DWT.ERROR_NO_HANDLES);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2012
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2013 if (data !is null) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2014 /* Set the GCData fields */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2015 int mask = DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2016 if ((data.style & mask) !is 0) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2017 data.layout = (data.style & DWT.RIGHT_TO_LEFT) !is 0 ? OS.LAYOUT_RTL : 0;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2018 } else {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2019 data.style |= DWT.LEFT_TO_RIGHT;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2020 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2021 data.device = device;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2022 data.image = this;
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
2023 data.font = device.systemFont;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2024 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2025 return imageDC;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2026 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2027
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2028 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2029 * Invokes platform specific functionality to dispose a GC handle.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2030 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2031 * <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
2032 * API for <code>Image</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
2033 * can be shared within the packages provided by DWT. It is not
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2034 * available on all platforms, and should never be called from
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2035 * application code.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2036 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2037 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2038 * @param hDC the platform specific GC handle
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2039 * @param data the platform specific GC data
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2040 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2041 public void internal_dispose_GC (HDC hDC, GCData data) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2042 OS.DeleteDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2043 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2044
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2045 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2046 * Returns <code>true</code> if the image has been disposed,
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2047 * and <code>false</code> otherwise.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2048 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2049 * This method gets the dispose state for the image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2050 * When an image has been disposed, it is an error to
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2051 * invoke any other method using the image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2052 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2053 * @return <code>true</code> when the image is disposed and <code>false</code> otherwise
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2054 */
48
9a64a7781bab Added override and alias, first chunk. Thanks torhu for doing this patch.
Frank Benoit <benoit@tionex.de>
parents: 23
diff changeset
2055 override public bool isDisposed() {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2056 return handle is null;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2057 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2058
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2059 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2060 * Sets the color to which to map the transparent pixel.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2061 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2062 * There are certain uses of <code>Images</code> that do not support
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2063 * transparency (for example, setting an image into a button or label).
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2064 * In these cases, it may be desired to simulate transparency by using
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2065 * the background color of the widget to paint the transparent pixels
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2066 * of the image. This method specifies the color that will be used in
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2067 * these cases. For example:
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2068 * <pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2069 * Button b = new Button();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2070 * image.setBackground(b.getBackground());
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2071 * b.setImage(image);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2072 * </pre>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2073 * </p><p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2074 * The image may be modified by this operation (in effect, the
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2075 * transparent regions may be filled with the supplied color). Hence
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2076 * this operation is not reversible and it is not legal to call
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2077 * this function twice or with a null argument.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2078 * </p><p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2079 * This method has no effect if the receiver does not have a transparent
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2080 * pixel value.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2081 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2082 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2083 * @param color the color to use when a transparent pixel is specified
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2084 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2085 * @exception IllegalArgumentException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2086 * <li>ERROR_NULL_ARGUMENT - if the color is null</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2087 * <li>ERROR_INVALID_ARGUMENT - if the color has been disposed</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2088 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2089 * @exception DWTException <ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2090 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2091 * </ul>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2092 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2093 public void setBackground(Color color) {
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2094 /*
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2095 * Note. Not implemented on WinCE.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2096 */
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
2097 static if (OS.IsWinCE) return;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2098 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2099 if (color 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
2100 if (color.isDisposed()) DWT.error(DWT.ERROR_INVALID_ARGUMENT);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2101 if (transparentPixel is -1) return;
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 237
diff changeset
2102 transparentColor = -1;
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2103
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2104 /* Get the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2105 auto hDC = device.internal_new_GC(null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2106
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2107 /* Change the background color in the image */
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
2108 BITMAP bm;
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
2109 OS.GetObject(handle, BITMAP.sizeof, &bm);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2110 auto hdcMem = OS.CreateCompatibleDC(hDC);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2111 OS.SelectObject(hdcMem, handle);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2112 int maxColors = 1 << bm.bmBitsPixel;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2113 byte[] colors = new byte[maxColors * 4];
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
2114 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
2115 int numColors = OS.GetDIBColorTable(hdcMem, 0, maxColors, cast(RGBQUAD*)colors.ptr);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2116 int offset = transparentPixel * 4;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2117 colors[offset] = cast(byte)color.getBlue();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2118 colors[offset + 1] = cast(byte)color.getGreen();
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2119 colors[offset + 2] = cast(byte)color.getRed();
117
25f88bf5a6df Only one file was damaged
Frank Benoit <benoit@tionex.de>
parents: 115
diff changeset
2120 static if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED);
23
f5482da87ed8 Image, ImageData
Frank Benoit <benoit@tionex.de>
parents: 22
diff changeset
2121 OS.SetDIBColorTable(hdcMem, 0, numColors, cast(RGBQUAD*)colors.ptr);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2122 OS.DeleteDC(hdcMem);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2123
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2124 /* Release the HDC for the device */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2125 device.internal_dispose_GC(hDC, null);
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2126 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2127
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2128 /**
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2129 * Returns a string containing a concise, human-readable
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2130 * description of the receiver.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2131 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2132 * @return a string representation of the receiver
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2133 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 197
diff changeset
2134 override public String toString () {
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2135 if (isDisposed()) return "Image {*DISPOSED*}";
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2136 return Format( "Image {{{}}", handle );
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2137 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2138
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 * Invokes platform specific functionality to allocate a new image.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2141 * <p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2142 * <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
2143 * API for <code>Image</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
2144 * can be shared within the packages provided by DWT. It is not
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2145 * available on all platforms, and should never be called from
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2146 * application code.
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2147 * </p>
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2148 *
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2149 * @param device the device on which to allocate the color
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2150 * @param type the type of the image (<code>DWT.BITMAP</code> or <code>DWT.ICON</code>)
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2151 * @param handle the OS handle for the image
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2152 * @return a new image object containing the specified device, type and handle
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2153 */
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2154 public static Image win32_new(Device device, int type, HGDIOBJ handle) {
213
36f5cb12e1a2 Update to SWT 3.4M7
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
2155 Image image = new Image(device);
22
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2156 image.type = type;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2157 image.handle = handle;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2158 return image;
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2159 }
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2160
5f2e72114476 Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2161 }