Mercurial > projects > dwt-win
annotate dwt/graphics/Image.d @ 22:5f2e72114476
Image in work, this revision does not compile
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 26 Jan 2008 19:05:32 +0100 |
parents | |
children | f5482da87ed8 |
rev | line source |
---|---|
22
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1 /******************************************************************************* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2 * Copyright (c) 2000, 2007 IBM Corporation and others. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
3 * All rights reserved. This program and the accompanying materials |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
4 * are made available under the terms of the Eclipse Public License v1.0 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
5 * which accompanies this distribution, and is available at |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
6 * http://www.eclipse.org/legal/epl-v10.html |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
7 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
8 * Contributors: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
9 * IBM Corporation - initial API and implementation |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
10 *******************************************************************************/ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
11 module dwt.graphics.Image; |
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 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
14 import dwt.DWT; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
15 import dwt.DWTError; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
16 import dwt.DWTException; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
17 import dwt.internal.gdip.Gdip; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
18 import dwt.internal.win32.OS; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
19 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
20 import dwt.graphics.Color; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
21 import dwt.graphics.Device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
22 import dwt.graphics.Drawable; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
23 import dwt.graphics.GC; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
24 import dwt.graphics.GCData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
25 import dwt.graphics.ImageData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
26 import dwt.graphics.PaletteData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
27 import dwt.graphics.RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
28 import dwt.graphics.Rectangle; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
29 import dwt.graphics.Resource; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
30 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
31 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
32 import dwt.dwthelper.InputStream; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
33 import dwt.dwthelper.utils; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
34 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
35 import tango.text.convert.Format; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
36 //import tango.stdc.string; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
37 //import tango.stdc.stringz; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
38 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
39 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
40 * 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
|
41 * 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
|
42 * 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
|
43 * 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
|
44 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
45 * 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
|
46 * <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
|
47 * 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
|
48 * 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
|
49 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
50 * 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
|
51 * 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
|
52 * <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
|
53 * constructor, for example: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
54 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
55 * 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
|
56 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
57 * 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
|
58 * 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
|
59 * 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
|
60 * 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
|
61 * 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
|
62 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
63 * ImageData data = new ImageData("C:\\graphic.bmp"); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
64 * RGB[] rgbs = data.getRGBs(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
65 * // 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
|
66 * // 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
|
67 * // 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
|
68 * // using the Color constructor Color(RGB), then |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
69 * // create the image: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
70 * Image i = new Image(device, data); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
71 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
72 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
73 * 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
|
74 * 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
|
75 * <code>ImageLoader</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
76 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
77 * 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
|
78 * 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
|
79 * when those instances are no longer required. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
80 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
81 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
82 * @see Color |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
83 * @see ImageData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
84 * @see ImageLoader |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
85 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
86 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
87 public final class Image : Resource, Drawable { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
88 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
89 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
90 * 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
|
91 * (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
|
92 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
93 * <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
|
94 * 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
|
95 * 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
|
96 * 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
|
97 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
98 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
99 public int type; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
100 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
101 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
102 * the handle to the OS image resource |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
103 * (Warning: This field is platform dependent) |
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 * <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
|
106 * 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
|
107 * 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
|
108 * 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
|
109 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
110 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
111 public HGDIOBJ handle; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
112 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
113 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
114 * specifies the transparent pixel |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
115 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
116 int transparentPixel = -1; |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
119 * 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
|
120 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
121 GC memGC; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
122 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
123 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
124 * the alpha data for the image |
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 byte[] alphaData; |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
129 * 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
|
130 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
131 int alpha = -1; |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
134 * 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
|
135 * icon. Used only in WinCE |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
136 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
137 ImageData data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
138 |
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 * width of the image |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
141 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
142 int width = -1; |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
145 * height of the image |
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 int height = -1; |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
150 * specifies the default scanline padding |
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 static const int DEFAULT_SCANLINE_PAD = 4; |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
155 * 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
|
156 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
157 this () { |
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 |
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 * 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
|
162 * 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
|
163 * 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
|
164 * as shown in the following example: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
165 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
166 * Image i = new Image(device, width, height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
167 * GC gc = new GC(i); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
168 * gc.drawRectangle(0, 0, 50, 50); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
169 * gc.dispose(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
170 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
171 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
172 * 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
|
173 * 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
|
174 * 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
|
175 * images larger than 16M. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
176 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
177 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
178 * @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
|
179 * @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
|
180 * @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
|
181 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
182 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
183 * <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
|
184 * <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
|
185 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
186 * @exception DWTError <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
187 * <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
|
188 * </ul> |
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 public this(Device device, int width, int height) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
191 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
192 if (device 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
|
193 init(device, width, height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
194 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
195 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
196 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
197 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
198 * 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
|
199 * 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
|
200 * 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
|
201 * <dl> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
202 * <dt><b>IMAGE_COPY</b></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
203 * <dd>the result is an identical copy of srcImage</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
204 * <dt><b>IMAGE_DISABLE</b></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
205 * <dd>the result is a copy of srcImage which has a <em>disabled</em> look</dd> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
206 * <dt><b>IMAGE_GRAY</b></dt> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
207 * <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
|
208 * </dl> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
209 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
210 * @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
|
211 * @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
|
212 * @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
|
213 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
214 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
215 * <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
|
216 * <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
|
217 * <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
|
218 * <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
|
219 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
220 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
221 * <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
|
222 * <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
|
223 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
224 * @exception DWTError <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
225 * <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
|
226 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
227 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
228 public this(Device device, Image srcImage, int flag) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
229 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
230 if (device 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
|
231 this.device = device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
232 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
|
233 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
|
234 Rectangle rect = srcImage.getBounds(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
235 switch (flag) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
236 case DWT.IMAGE_COPY: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
237 this.type = srcImage.type; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
238 switch (type) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
239 case DWT.BITMAP: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
240 /* Get the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
241 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
242 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
243 /* Copy the bitmap */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
244 auto hdcSource = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
245 auto hdcDest = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
246 auto hOldSrc = OS.SelectObject(hdcSource, srcImage.handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
247 BITMAP bm; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
248 OS.GetObject(srcImage.handle, BITMAP.sizeof, &bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
249 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
|
250 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
|
251 auto hOldDest = OS.SelectObject(hdcDest, handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
252 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
|
253 OS.SelectObject(hdcSource, hOldSrc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
254 OS.SelectObject(hdcDest, hOldDest); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
255 OS.DeleteDC(hdcSource); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
256 OS.DeleteDC(hdcDest); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
257 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
258 /* Release the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
259 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
260 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
261 transparentPixel = srcImage.transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
262 alpha = srcImage.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
263 if (srcImage.alphaData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
264 alphaData = new byte[srcImage.alphaData.length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
265 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
|
266 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
267 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
268 case DWT.ICON: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
269 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
270 init(device, srcImage.data); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
271 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
272 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
|
273 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
|
274 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
275 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
276 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
277 DWT.error(DWT.ERROR_INVALID_IMAGE); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
278 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
279 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
280 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
281 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
282 case DWT.IMAGE_DISABLE: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
283 ImageData data = srcImage.getImageData(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
284 PaletteData palette = data.palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
285 RGB[] rgbs = new RGB[3]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
286 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
|
287 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
|
288 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
|
289 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
|
290 newData.alpha = data.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
291 newData.alphaData = data.alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
292 newData.maskData = data.maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
293 newData.maskPad = data.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
294 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
|
295 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
296 /* Convert the pixels. */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
297 int[] scanline = new int[rect.width]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
298 int[] maskScanline = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
299 ImageData mask = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
300 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
|
301 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
|
302 int redMask = palette.redMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
303 int greenMask = palette.greenMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
304 int blueMask = palette.blueMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
305 int redShift = palette.redShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
306 int greenShift = palette.greenShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
307 int blueShift = palette.blueShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
308 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
|
309 int offset = y * newData.bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 int pixel = scanline[x]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
314 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
|
315 int red, green, blue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
316 if (palette.isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
317 red = pixel & redMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
318 red = (redShift < 0) ? red >>> -redShift : red << redShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
319 green = pixel & greenMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
320 green = (greenShift < 0) ? green >>> -greenShift : green << greenShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
321 blue = pixel & blueMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
322 blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
323 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
324 red = palette.colors[pixel].red; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
325 green = palette.colors[pixel].green; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
326 blue = palette.colors[pixel].blue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
327 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
328 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
|
329 if (intensity < 98304) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
330 newData.data[offset] = cast(byte)1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
331 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
332 newData.data[offset] = cast(byte)2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
333 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
334 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
335 offset++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
336 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
337 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
338 init (device, newData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
339 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
340 return; |
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 case DWT.IMAGE_GRAY: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
343 ImageData data = srcImage.getImageData(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
344 PaletteData palette = data.palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
345 ImageData newData = data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
346 if (!palette.isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
347 /* Convert the palette entries to gray. */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
348 RGB [] rgbs = palette.getRGBs(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
349 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
|
350 if (data.transparentPixel !is i) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
351 RGB color = rgbs [i]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
352 int red = color.red; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
353 int green = color.green; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
354 int blue = color.blue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
355 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
|
356 color.red = color.green = color.blue = intensity; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
357 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
358 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
359 newData.palette = new PaletteData(rgbs); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
360 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
361 /* 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
|
362 RGB[] rgbs = new RGB[256]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
363 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
|
364 rgbs[i] = new RGB(i, i, i); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
365 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
366 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
|
367 newData.alpha = data.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
368 newData.alphaData = data.alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
369 newData.maskData = data.maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
370 newData.maskPad = data.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
371 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
|
372 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
373 /* Convert the pixels. */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
374 int[] scanline = new int[rect.width]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
375 int redMask = palette.redMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
376 int greenMask = palette.greenMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
377 int blueMask = palette.blueMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
378 int redShift = palette.redShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
379 int greenShift = palette.greenShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
380 int blueShift = palette.blueShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
381 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
|
382 int offset = y * newData.bytesPerLine; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
383 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
|
384 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
|
385 int pixel = scanline[x]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
386 if (pixel !is data.transparentPixel) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
387 int red = pixel & redMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
388 red = (redShift < 0) ? red >>> -redShift : red << redShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
389 int green = pixel & greenMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
390 green = (greenShift < 0) ? green >>> -greenShift : green << greenShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
391 int blue = pixel & blueMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
392 blue = (blueShift < 0) ? blue >>> -blueShift : blue << blueShift; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
393 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
|
394 if (newData.transparentPixel is intensity) intensity = 255; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
395 newData.data[offset] = cast(byte)intensity; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
396 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
397 newData.data[offset] = cast(byte)254; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
398 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
399 offset++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
400 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
401 } |
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 init (device, newData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
404 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
405 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
406 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
407 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
408 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
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 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
411 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
412 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
413 * 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
|
414 * 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
|
415 * 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
|
416 * 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
|
417 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
418 * Image i = new Image(device, boundsRectangle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
419 * GC gc = new GC(i); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
420 * gc.drawRectangle(0, 0, 50, 50); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
421 * gc.dispose(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
422 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
423 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
424 * 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
|
425 * 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
|
426 * 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
|
427 * images larger than 16M. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
428 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
429 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
430 * @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
|
431 * @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
|
432 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
433 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
434 * <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
|
435 * <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
|
436 * <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
|
437 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
438 * @exception DWTError <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
439 * <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
|
440 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
441 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
442 public this(Device device, Rectangle bounds) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
443 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
444 if (device 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
|
445 if (bounds 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
|
446 init(device, bounds.width, bounds.height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
447 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
448 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
449 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
450 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
451 * 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
|
452 * <code>ImageData</code>. |
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 * @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
|
455 * @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
|
456 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
457 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
458 * <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
|
459 * <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
|
460 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
461 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
462 * <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
|
463 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
464 * @exception DWTError <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
465 * <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
|
466 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
467 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
468 public this(Device device, ImageData data) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
469 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
470 if (device 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
|
471 init(device, data); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
472 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
473 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
474 |
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 * 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
|
477 * <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
|
478 * 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
|
479 * in either image will be ignored. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
480 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
481 * 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
|
482 * 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
|
483 * 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
|
484 * transparent. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
485 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
486 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
487 * @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
|
488 * @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
|
489 * @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
|
490 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
491 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
492 * <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
|
493 * <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
|
494 * <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
|
495 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
496 * @exception DWTError <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
497 * <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
|
498 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
499 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
500 public this(Device device, ImageData source, ImageData mask) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
501 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
502 if (device 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
|
503 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
|
504 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
|
505 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
|
506 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
507 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
508 mask = ImageData.convertMask(mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
509 init(device, this, source, mask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
510 if (device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
511 } |
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 * 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
|
515 * 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
|
516 * 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
|
517 * 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
|
518 * for closing the input stream. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
519 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
520 * 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
|
521 * 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
|
522 * 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
|
523 * <code>ImageLoader.load()</code>. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
524 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
525 * 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
|
526 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
527 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
528 * 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
|
529 * InputStream stream = clazz.getResourceAsStream (string); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
530 * if (stream is null) return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
531 * Image image = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
532 * try { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
533 * image = new Image (display, stream); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
534 * } catch (DWTException ex) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
535 * } finally { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
536 * try { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
537 * stream.close (); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
538 * } catch (IOException ex) {} |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
539 * } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
540 * return image; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
541 * } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
542 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
543 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
544 * @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
|
545 * @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
|
546 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
547 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
548 * <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
|
549 * <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
|
550 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
551 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
552 * <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
|
553 * <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
|
554 * <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
|
555 * <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
|
556 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
557 * @exception DWTError <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
558 * <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
|
559 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
560 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
561 public this (Device device, InputStream stream) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
562 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
563 if (device 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
|
564 init(device, new ImageData(stream)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
565 if (device.tracking) device.new_Object(this); |
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 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
595 public this (Device device, char[] filename) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
596 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
597 if (device 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
|
598 if (filename 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
|
599 this.device = device; |
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(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
602 int length = filename.length; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
603 char[] chars = new char[length+1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
604 filename.getChars(0, length, chars, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
605 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
|
606 if (bitmap !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
607 int error = DWT.ERROR_NO_HANDLES; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
608 int status = Gdip.Image_GetLastStatus(cast(Gdip.Image*)bitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
609 if (status is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
610 if (filename.toLowerCase().endsWith(".ico")) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
611 this.type = DWT.ICON; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
612 HICON hicon; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
613 Gdip.Bitmap_GetHICON(bitmap, &hicon); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
614 this.handle = hicon; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
615 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
616 this.type = DWT.BITMAP; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
617 int width = Gdip.Image_GetWidth(cast(Gdip.Image*)bitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
618 int height = Gdip.Image_GetHeight(cast(Gdip.Image*)bitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
619 int pixelFormat = Gdip.Image_GetPixelFormat(cast(Gdip.Image*)bitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
620 switch (pixelFormat) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
621 case Gdip.PixelFormat16bppRGB555: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
622 case Gdip.PixelFormat16bppRGB565: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
623 this.handle = createDIB(width, height, 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
624 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
625 case Gdip.PixelFormat24bppRGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
626 this.handle = createDIB(width, height, 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
627 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
628 case Gdip.PixelFormat32bppRGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
629 // These will loose either precision or transparency |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
630 case Gdip.PixelFormat16bppGrayScale: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
631 case Gdip.PixelFormat48bppRGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
632 case Gdip.PixelFormat32bppPARGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
633 case Gdip.PixelFormat64bppARGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
634 case Gdip.PixelFormat64bppPARGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
635 this.handle = createDIB(width, height, 32); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
636 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
637 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
638 if (this.handle !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
639 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
640 * 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
|
641 * 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
|
642 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
643 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
644 auto srcHDC = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
645 auto oldSrcBitmap = OS.SelectObject(srcHDC, this.handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
646 auto graphics = Gdip.Graphics_new(srcHDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
647 if (graphics !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
648 Gdip.Rect rect; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
649 rect.Width = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
650 rect.Height = height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
651 status = Gdip.Graphics_DrawImage(graphics, cast(Gdip.Image*)bitmap, &rect, 0, 0, width, height, Gdip.UnitPixel, null, null, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
652 if (status !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
653 error = DWT.ERROR_INVALID_IMAGE; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
654 OS.DeleteObject(handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
655 this.handle = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
656 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
657 Gdip.Graphics_delete(graphics); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
658 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
659 OS.SelectObject(srcHDC, oldSrcBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
660 OS.DeleteDC(srcHDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
661 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
662 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
663 auto lockedBitmapData = Gdip.BitmapData_new(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
664 if (lockedBitmapData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
665 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
|
666 //BitmapData bitmapData = new BitmapData(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
667 //Gdip.MoveMemory(bitmapData, lockedBitmapData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
668 auto stride = lockedBitmapData.Stride; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
669 auto pixels = lockedBitmapData.Scan0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
670 int depth = 0, scanlinePad = 4, transparentPixel = -1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
671 switch (lockedBitmapData.PixelFormat) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
672 case Gdip.PixelFormat1bppIndexed: depth = 1; break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
673 case Gdip.PixelFormat4bppIndexed: depth = 4; break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
674 case Gdip.PixelFormat8bppIndexed: depth = 8; break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
675 case Gdip.PixelFormat16bppARGB1555: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
676 case Gdip.PixelFormat16bppRGB555: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
677 case Gdip.PixelFormat16bppRGB565: depth = 16; break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
678 case Gdip.PixelFormat24bppRGB: depth = 24; break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
679 case Gdip.PixelFormat32bppRGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
680 case Gdip.PixelFormat32bppARGB: depth = 32; break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
681 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
682 if (depth !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
683 PaletteData paletteData = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
684 switch (lockedBitmapData.PixelFormat) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
685 case Gdip.PixelFormat1bppIndexed: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
686 case Gdip.PixelFormat4bppIndexed: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
687 case Gdip.PixelFormat8bppIndexed: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
688 int paletteSize = Gdip.Image_GetPaletteSize(cast(Gdip.Image*)bitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
689 auto hHeap = OS.GetProcessHeap(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
690 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
|
691 if (palette 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
|
692 Gdip.Image_GetPalette(cast(Gdip.Image*)bitmap, palette, paletteSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
693 Gdip.ColorPalette* colorPalette = palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
694 //Gdip.MoveMemory(colorPalette, palette, ColorPalette.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
695 int[] entries = new int[colorPalette.Count]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
696 //OS.MoveMemory(entries, palette + 8, entries.length * 4); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
697 RGB[] rgbs = new RGB[colorPalette.Count]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
698 paletteData = new PaletteData(rgbs); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
699 for (int i = 0; i < entries.length; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
700 if (((palette.Entries[i] >> 24) & 0xFF) is 0 && (colorPalette.Flags & Gdip.PaletteFlagsHasAlpha) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
701 transparentPixel = i; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
702 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
703 rgbs[i] = new RGB(((palette.Entries[i] & 0xFF0000) >> 16), ((palette.Entries[i] & 0xFF00) >> 8), ((palette.Entries[i] & 0xFF) >> 0)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
704 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
705 OS.HeapFree(hHeap, 0, palette); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
706 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
707 case Gdip.PixelFormat16bppARGB1555: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
708 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
|
709 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
|
710 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
|
711 case Gdip.PixelFormat32bppRGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
712 case Gdip.PixelFormat32bppARGB: paletteData = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
713 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
714 byte[] data = (cast(byte*)data)[ 0 .. stride * height], alphaData = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
715 //OS.MoveMemory(data, pixels, data.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
716 switch (lockedBitmapData.PixelFormat) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
717 case Gdip.PixelFormat16bppARGB1555: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
718 alphaData = new byte[width * height]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
719 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
|
720 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
|
721 } |
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.PixelFormat32bppARGB: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
724 alphaData = new byte[width * height]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
725 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
|
726 alphaData[j] = data[i]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
727 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
728 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
729 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
730 Gdip.Bitmap_UnlockBits(bitmap, lockedBitmapData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
731 Gdip.BitmapData_delete(lockedBitmapData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
732 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
|
733 img.transparentPixel = transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
734 img.alphaData = alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
735 init(device, img); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
736 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
737 } |
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 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
740 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
741 Gdip.Bitmap_delete(bitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
742 if (status is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
743 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
|
744 return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
745 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
746 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
747 } catch (DWTException e) {} |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
748 init(device, new ImageData(filename)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
749 if(device.tracking) device.new_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
750 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
751 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
752 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
753 * 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
|
754 * 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
|
755 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
756 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
|
757 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
758 /* Determine the DDB depth */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
759 int bits = OS.GetDeviceCaps (hDC, OS.BITSPIXEL); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
760 int planes = OS.GetDeviceCaps (hDC, OS.PLANES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
761 int depth = bits * planes; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
762 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
763 /* Determine the DIB palette */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
764 bool isDirect = depth > 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
765 RGB[] rgbs = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
766 if (!isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
767 int numColors = 1 << depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
768 byte[] logPalette = new byte[4 * numColors]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
769 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
|
770 rgbs = new RGB[numColors]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
771 for (int i = 0; i < numColors; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
772 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
|
773 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
774 } |
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 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
|
777 BITMAPINFOHEADER bmiHeader; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
778 bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
779 bmiHeader.biWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
780 bmiHeader.biHeight = -height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
781 bmiHeader.biPlanes = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
782 bmiHeader.biBitCount = cast(short)depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
783 if (useBitfields) bmiHeader.biCompression = OS.BI_BITFIELDS; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
784 else bmiHeader.biCompression = OS.BI_RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
785 byte[] bmi; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
786 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
|
787 else bmi = new byte[BITMAPINFOHEADER.sizeof + rgbs.length * 4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
788 bmi[ 0 .. BITMAPINFOHEADER.sizeof ] = (cast(byte*)&bmiHeader)[ 0 .. BITMAPINFOHEADER.sizeof ]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
789 //OS.MoveMemory(bmi, bmiHeader, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
790 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
791 /* 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
|
792 int offset = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
793 if (isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
794 if (useBitfields) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
795 int redMask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
796 int greenMask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
797 int blueMask = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
798 switch (depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
799 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
800 redMask = 0x7C00; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
801 greenMask = 0x3E0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
802 blueMask = 0x1F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
803 /* little endian */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
804 bmi[offset] = cast(byte)((redMask & 0xFF) >> 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
805 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
|
806 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
|
807 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
|
808 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
|
809 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
|
810 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
|
811 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
|
812 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
|
813 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
|
814 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
|
815 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
|
816 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
817 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
818 redMask = 0xFF00; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
819 greenMask = 0xFF0000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
820 blueMask = 0xFF000000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
821 /* big endian */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
822 bmi[offset] = cast(byte)((redMask & 0xFF000000) >> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
823 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
|
824 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
|
825 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
|
826 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
|
827 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
|
828 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
|
829 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
|
830 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
|
831 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
|
832 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
|
833 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
|
834 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
835 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
836 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
837 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
838 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
839 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
840 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
|
841 bmi[offset] = cast(byte)rgbs[j].blue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
842 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
|
843 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
|
844 bmi[offset + 3] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
845 offset += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
846 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
847 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
848 int pBits; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
849 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
|
850 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
|
851 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
852 /* Bitblt DDB into DIB */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
853 auto hdcSource = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
854 auto hdcDest = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
855 auto hOldSrc = OS.SelectObject(hdcSource, hBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
856 auto hOldDest = OS.SelectObject(hdcDest, hDib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
857 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
|
858 OS.SelectObject(hdcSource, hOldSrc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
859 OS.SelectObject(hdcDest, hOldDest); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
860 OS.DeleteDC(hdcSource); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
861 OS.DeleteDC(hdcDest); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
862 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
863 return hDib; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
864 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
865 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
866 int[] createGdipImage() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
867 switch (type) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
868 case DWT.BITMAP: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
869 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
|
870 BITMAP bm; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
871 OS.GetObject(handle, BITMAP.sizeof, &bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
872 int imgWidth = bm.bmWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
873 int imgHeight = bm.bmHeight; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
874 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
875 auto srcHdc = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
876 auto oldSrcBitmap = OS.SelectObject(srcHdc, handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
877 auto memHdc = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
878 auto memDib = createDIB(imgWidth, imgHeight, 32); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
879 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
|
880 auto oldMemBitmap = OS.SelectObject(memHdc, memDib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
881 BITMAP dibBM; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
882 OS.GetObject(memDib, BITMAP.sizeof, &dibBM); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
883 int sizeInBytes = dibBM.bmWidthBytes * dibBM.bmHeight; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
884 OS.BitBlt(memHdc, 0, 0, imgWidth, imgHeight, srcHdc, 0, 0, OS.SRCCOPY); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
885 byte red = 0, green = 0, blue = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
886 if (transparentPixel !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
887 if (bm.bmBitsPixel <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
888 byte[] color = new byte[4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
889 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
|
890 blue = color[0]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
891 green = color[1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
892 red = color[2]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
893 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
894 switch (bm.bmBitsPixel) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
895 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
896 int blueMask = 0x1F; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
897 int blueShift = ImageData.getChannelShift(blueMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
898 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
|
899 blue = blues[(transparentPixel & blueMask) >> blueShift]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
900 int greenMask = 0x3E0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
901 int greenShift = ImageData.getChannelShift(greenMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
902 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
|
903 green = greens[(transparentPixel & greenMask) >> greenShift]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
904 int redMask = 0x7C00; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
905 int redShift = ImageData.getChannelShift(redMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
906 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
|
907 red = reds[(transparentPixel & redMask) >> redShift]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
908 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
909 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
910 blue = cast(byte)((transparentPixel & 0xFF0000) >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
911 green = cast(byte)((transparentPixel & 0xFF00) >> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
912 red = cast(byte)(transparentPixel & 0xFF); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
913 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
914 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
915 blue = cast(byte)((transparentPixel & 0xFF000000) >>> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
916 green = cast(byte)((transparentPixel & 0xFF0000) >> 16); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
917 red = cast(byte)((transparentPixel & 0xFF00) >> 8); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
918 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
919 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
920 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
921 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
922 OS.SelectObject(srcHdc, oldSrcBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
923 OS.SelectObject(memHdc, oldMemBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
924 OS.DeleteObject(srcHdc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
925 OS.DeleteObject(memHdc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
926 byte[] srcData = (cast(byte*)dibBM.bmBits)[ 0 .. sizeInBytes ].dup; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
927 OS.DeleteObject(memDib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
928 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
929 if (alpha !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
930 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
|
931 for (int x = 0; x < imgWidth; ++x) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
932 srcData[dp + 3] = cast(byte)alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
933 dp += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
934 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
935 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
936 } else if (alphaData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
937 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
|
938 for (int x = 0; x < imgWidth; ++x) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
939 srcData[dp + 3] = alphaData[ap++]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
940 dp += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
941 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
942 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
943 } else if (transparentPixel !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
944 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
|
945 for (int x = 0; x < imgWidth; ++x) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
946 if (srcData[dp] is blue && srcData[dp + 1] is green && srcData[dp + 2] is red) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
947 srcData[dp + 3] = cast(byte)0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
948 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
949 srcData[dp + 3] = cast(byte)0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
950 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
951 dp += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
952 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
953 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
954 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
955 auto hHeap = OS.GetProcessHeap(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
956 auto pixels = cast(byte*)OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, srcData.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
957 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
|
958 OS.MoveMemory(pixels, srcData.ptr, sizeInBytes); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
959 return [ cast(int)Gdip.Bitmap_new(imgWidth, imgHeight, dibBM.bmWidthBytes, Gdip.PixelFormat32bppARGB, pixels), cast(int) pixels]; |
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 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
|
962 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
963 case DWT.ICON: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
964 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
965 * 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
|
966 * 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
|
967 * 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
|
968 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
969 ICONINFO iconInfo; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
970 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
971 GetIconInfo(this, &iconInfo); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
972 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
973 OS.GetIconInfo(handle, &iconInfo); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
974 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
975 auto hBitmap = iconInfo.hbmColor; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
976 if (hBitmap is null) hBitmap = iconInfo.hbmMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
977 BITMAP bm; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
978 OS.GetObject(hBitmap, BITMAP.sizeof, &bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
979 int imgWidth = bm.bmWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
980 int imgHeight = hBitmap is iconInfo.hbmMask ? bm.bmHeight / 2 : bm.bmHeight; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
981 int img = 0, pixels = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
982 if (imgWidth > imgHeight) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
983 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
984 auto srcHdc = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
985 auto oldSrcBitmap = OS.SelectObject(srcHdc, hBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
986 auto memHdc = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
987 auto memDib = createDIB(imgWidth, imgHeight, 32); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
988 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
|
989 auto oldMemBitmap = OS.SelectObject(memHdc, memDib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
990 BITMAP dibBM; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
991 OS.GetObject(memDib, BITMAP.sizeof, &dibBM); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
992 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
|
993 OS.SelectObject(memHdc, oldMemBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
994 OS.DeleteObject(memHdc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
995 byte[] srcData = new byte[dibBM.bmWidthBytes * dibBM.bmHeight]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
996 OS.MoveMemory(srcData, dibBM.bmBits, srcData.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
997 OS.DeleteObject(memDib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
998 OS.SelectObject(srcHdc, iconInfo.hbmMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
999 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
|
1000 for (int x = 0; x < imgWidth; ++x) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1001 if (OS.GetPixel(srcHdc, x, y) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1002 srcData[dp + 3] = cast(byte)0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1003 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1004 srcData[dp + 3] = cast(byte)0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1005 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1006 dp += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1007 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1008 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1009 OS.SelectObject(srcHdc, oldSrcBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1010 OS.DeleteObject(srcHdc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1011 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1012 int hHeap = OS.GetProcessHeap(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1013 pixels = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, srcData.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1014 if (pixels is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1015 OS.MoveMemory(pixels, srcData, srcData.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1016 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
|
1017 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1018 img = Gdip.Bitmap_new(handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1019 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1020 if (iconInfo.hbmColor !is 0) OS.DeleteObject(iconInfo.hbmColor); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1021 if (iconInfo.hbmMask !is 0) OS.DeleteObject(iconInfo.hbmMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1022 return [img, pixels]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1023 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1024 default: DWT.error(DWT.ERROR_INVALID_IMAGE); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1025 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1026 return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1027 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1028 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1029 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1030 * Disposes of the operating system resources associated with |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1031 * the image. Applications must dispose of all images which |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1032 * they allocate. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1033 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1034 public void dispose () { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1035 if (handle is null) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1036 if (device.isDisposed()) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1037 if (memGC !is null) memGC.dispose(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1038 if (type is DWT.ICON) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1039 if (OS.IsWinCE) data = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1040 OS.DestroyIcon (handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1041 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1042 OS.DeleteObject (handle); |
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 handle = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1045 memGC = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1046 if (device.tracking) device.dispose_Object(this); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1047 device = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1048 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1049 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1050 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1051 * 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
|
1052 * 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
|
1053 * specific comparison. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1054 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1055 * @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
|
1056 * @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
|
1057 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1058 * @see #hashCode |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1059 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1060 public int opEquals (Object object) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1061 if (object is this) return true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1062 if (!(cast(Image)object)) return false; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1063 Image image = cast(Image) object; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1064 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
|
1065 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1066 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1067 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1068 * 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
|
1069 * the receiver has no transparent pixel. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1070 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1071 * 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
|
1072 * (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
|
1073 * 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
|
1074 * 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
|
1075 * 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
|
1076 * 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
|
1077 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1078 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1079 * @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
|
1080 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1081 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1082 * <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
|
1083 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1084 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1085 public Color getBackground() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1086 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
|
1087 if (transparentPixel is -1) return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1088 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1089 /* Get the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1090 auto hDC = device.internal_new_GC(null); |
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 /* Compute the background color */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1093 BITMAP bm = new BITMAP(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1094 OS.GetObject(handle, BITMAP.sizeof, bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1095 auto hdcMem = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1096 auto hOldObject = OS.SelectObject(hdcMem, handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1097 int red = 0, green = 0, blue = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1098 if (bm.bmBitsPixel <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1099 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1100 byte[] pBits = new byte[1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1101 OS.MoveMemory(pBits, bm.bmBits, 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1102 byte oldValue = pBits[0]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1103 int mask = (0xFF << (8 - bm.bmBitsPixel)) & 0x00FF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1104 pBits[0] = cast(byte)((transparentPixel << (8 - bm.bmBitsPixel)) | (pBits[0] & ~mask)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1105 OS.MoveMemory(bm.bmBits, pBits, 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1106 int color = OS.GetPixel(hdcMem, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1107 pBits[0] = oldValue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1108 OS.MoveMemory(bm.bmBits, pBits, 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1109 blue = (color & 0xFF0000) >> 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1110 green = (color & 0xFF00) >> 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1111 red = color & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1112 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1113 byte[] color = new byte[4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1114 OS.GetDIBColorTable(hdcMem, transparentPixel, 1, color); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1115 blue = color[0] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1116 green = color[1] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1117 red = color[2] & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1118 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1119 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1120 switch (bm.bmBitsPixel) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1121 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1122 blue = (transparentPixel & 0x1F) << 3; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1123 green = (transparentPixel & 0x3E0) >> 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1124 red = (transparentPixel & 0x7C00) >> 7; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1125 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1126 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1127 blue = (transparentPixel & 0xFF0000) >> 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1128 green = (transparentPixel & 0xFF00) >> 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1129 red = transparentPixel & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1130 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1131 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1132 blue = (transparentPixel & 0xFF000000) >>> 24; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1133 green = (transparentPixel & 0xFF0000) >> 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1134 red = (transparentPixel & 0xFF00) >> 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1135 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1136 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1137 return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1138 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1139 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1140 OS.SelectObject(hdcMem, hOldObject); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1141 OS.DeleteDC(hdcMem); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1142 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1143 /* Release the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1144 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1145 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
|
1146 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1147 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1148 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1149 * 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
|
1150 * 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
|
1151 * image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1152 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1153 * @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
|
1154 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1155 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1156 * <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
|
1157 * <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
|
1158 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1159 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1160 public Rectangle getBounds() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1161 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
|
1162 if (width !is -1 && height !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1163 return new Rectangle(0, 0, width, height); |
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 switch (type) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1166 case DWT.BITMAP: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1167 BITMAP bm = new BITMAP(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1168 OS.GetObject(handle, BITMAP.sizeof, bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1169 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
|
1170 case DWT.ICON: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1171 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1172 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
|
1173 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1174 ICONINFO info = new ICONINFO(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1175 OS.GetIconInfo(handle, info); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1176 int hBitmap = info.hbmColor; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1177 if (hBitmap is 0) hBitmap = info.hbmMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1178 bm = new BITMAP(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1179 OS.GetObject(hBitmap, BITMAP.sizeof, bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1180 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
|
1181 if (info.hbmColor !is 0) OS.DeleteObject(info.hbmColor); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1182 if (info.hbmMask !is 0) OS.DeleteObject(info.hbmMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1183 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
|
1184 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1185 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1186 DWT.error(DWT.ERROR_INVALID_IMAGE); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1187 return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1188 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1189 } |
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 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1192 * 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
|
1193 * 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
|
1194 * affect the Image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1195 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1196 * @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
|
1197 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1198 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1199 * <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
|
1200 * <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
|
1201 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1202 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1203 * @see ImageData |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1204 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1205 public ImageData getImageData() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1206 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
|
1207 BITMAP bm; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1208 int depth, width, height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1209 switch (type) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1210 case DWT.ICON: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1211 if (OS.IsWinCE) return data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1212 ICONINFO info = new ICONINFO(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1213 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1214 OS.GetIconInfo(handle, info); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1215 /* Get the basic BITMAP information */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1216 int hBitmap = info.hbmColor; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1217 if (hBitmap is 0) hBitmap = info.hbmMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1218 bm = new BITMAP(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1219 OS.GetObject(hBitmap, BITMAP.sizeof, bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1220 depth = bm.bmPlanes * bm.bmBitsPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1221 width = bm.bmWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1222 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
|
1223 height = bm.bmHeight; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1224 int numColors = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1225 if (depth <= 8) numColors = 1 << depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1226 /* Create the BITMAPINFO */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1227 BITMAPINFOHEADER bmiHeader = new BITMAPINFOHEADER(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1228 bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1229 bmiHeader.biWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1230 bmiHeader.biHeight = -height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1231 bmiHeader.biPlanes = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1232 bmiHeader.biBitCount = cast(short)depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1233 bmiHeader.biCompression = OS.BI_RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1234 byte[] bmi = new byte[BITMAPINFOHEADER.sizeof + numColors * 4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1235 OS.MoveMemory(bmi, bmiHeader, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1236 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1237 /* Get the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1238 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1239 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1240 /* Create the DC and select the bitmap */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1241 auto hBitmapDC = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1242 auto hOldBitmap = OS.SelectObject(hBitmapDC, hBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1243 /* Select the palette if necessary */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1244 int oldPalette = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1245 if (depth <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1246 int hPalette = device.hPalette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1247 if (hPalette !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1248 oldPalette = OS.SelectPalette(hBitmapDC, hPalette, false); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1249 OS.RealizePalette(hBitmapDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1250 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1251 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1252 /* 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
|
1253 int imageSize; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1254 /* Call with null lpBits to get the image size */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1255 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1256 OS.GetDIBits(hBitmapDC, hBitmap, 0, height, 0, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1257 OS.MoveMemory(bmiHeader, bmi, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1258 imageSize = bmiHeader.biSizeImage; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1259 byte[] data = new byte[imageSize]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1260 /* Get the bitmap data */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1261 int hHeap = OS.GetProcessHeap(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1262 int lpvBits = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1263 if (lpvBits is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1264 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1265 OS.GetDIBits(hBitmapDC, hBitmap, 0, height, lpvBits, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1266 OS.MoveMemory(data, lpvBits, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1267 /* Calculate the palette */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1268 PaletteData palette = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1269 if (depth <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1270 RGB[] rgbs = new RGB[numColors]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1271 int srcIndex = 40; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1272 for (int i = 0; i < numColors; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1273 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
|
1274 srcIndex += 4; |
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 palette = new PaletteData(rgbs); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1277 } else if (depth is 16) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1278 palette = new PaletteData(0x7C00, 0x3E0, 0x1F); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1279 } else if (depth is 24) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1280 palette = new PaletteData(0xFF, 0xFF00, 0xFF0000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1281 } else if (depth is 32) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1282 palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1283 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1284 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1285 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1286 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1287 /* Do the mask */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1288 byte [] maskData = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1289 if (info.hbmColor is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1290 /* Do the bottom half of the mask */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1291 maskData = new byte[imageSize]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1292 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1293 OS.GetDIBits(hBitmapDC, hBitmap, height, height, lpvBits, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1294 OS.MoveMemory(maskData, lpvBits, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1295 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1296 /* Do the entire mask */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1297 /* Create the BITMAPINFO */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1298 bmiHeader = new BITMAPINFOHEADER(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1299 bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1300 bmiHeader.biWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1301 bmiHeader.biHeight = -height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1302 bmiHeader.biPlanes = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1303 bmiHeader.biBitCount = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1304 bmiHeader.biCompression = OS.BI_RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1305 bmi = new byte[BITMAPINFOHEADER.sizeof + 8]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1306 OS.MoveMemory(bmi, bmiHeader, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1307 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1308 /* First color black, second color white */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1309 int offset = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1310 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
|
1311 bmi[offset + 7] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1312 OS.SelectObject(hBitmapDC, info.hbmMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1313 /* Call with null lpBits to get the image size */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1314 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1315 OS.GetDIBits(hBitmapDC, info.hbmMask, 0, height, 0, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1316 OS.MoveMemory(bmiHeader, bmi, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1317 imageSize = bmiHeader.biSizeImage; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1318 maskData = new byte[imageSize]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1319 int lpvMaskBits = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1320 if (lpvMaskBits is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1321 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1322 OS.GetDIBits(hBitmapDC, info.hbmMask, 0, height, lpvMaskBits, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1323 OS.MoveMemory(maskData, lpvMaskBits, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1324 OS.HeapFree(hHeap, 0, lpvMaskBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1325 /* Loop to invert the mask */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1326 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
|
1327 maskData[i] ^= -1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1328 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1329 /* Make sure mask scanlinePad is 2 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1330 int maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1331 int bpl = imageSize / height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1332 for (maskPad = 1; maskPad < 128; maskPad++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1333 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
|
1334 if (calcBpl is bpl) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1335 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1336 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
|
1337 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1338 /* Clean up */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1339 OS.HeapFree(hHeap, 0, lpvBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1340 OS.SelectObject(hBitmapDC, hOldBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1341 if (oldPalette !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1342 OS.SelectPalette(hBitmapDC, oldPalette, false); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1343 OS.RealizePalette(hBitmapDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1344 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1345 OS.DeleteDC(hBitmapDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1346 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1347 /* Release the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1348 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1349 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1350 if (info.hbmColor !is 0) OS.DeleteObject(info.hbmColor); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1351 if (info.hbmMask !is 0) OS.DeleteObject(info.hbmMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1352 /* Construct and return the ImageData */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1353 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
|
1354 imageData.maskData = maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1355 imageData.maskPad = 2; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1356 return imageData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1357 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1358 case DWT.BITMAP: { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1359 /* Get the basic BITMAP information */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1360 bm = new BITMAP(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1361 OS.GetObject(handle, BITMAP.sizeof, bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1362 depth = bm.bmPlanes * bm.bmBitsPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1363 width = bm.bmWidth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1364 height = bm.bmHeight; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1365 /* Find out whether this is a DIB or a DDB. */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1366 bool isDib = (bm.bmBits !is 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1367 /* Get the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1368 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1369 |
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 * 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
|
1372 * 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
|
1373 * 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
|
1374 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1375 int handle = this.handle; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1376 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1377 if (!isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1378 bool mustRestore = false; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1379 if (memGC !is null && !memGC.isDisposed()) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1380 memGC.flush (); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1381 mustRestore = true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1382 GCData data = memGC.data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1383 if (data.hNullBitmap !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1384 OS.SelectObject(memGC.handle, data.hNullBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1385 data.hNullBitmap = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1386 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1387 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1388 handle = createDIBFromDDB(hDC, this.handle, width, height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1389 if (mustRestore) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1390 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
|
1391 memGC.data.hNullBitmap = hOldBitmap; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1392 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1393 isDib = true; |
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 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1396 DIBSECTION dib = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1397 if (isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1398 dib = new DIBSECTION(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1399 OS.GetObject(handle, DIBSECTION.sizeof, dib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1400 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1401 /* Calculate number of colors */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1402 int numColors = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1403 if (depth <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1404 if (isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1405 numColors = dib.biClrUsed; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1406 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1407 numColors = 1 << depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1408 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1409 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1410 /* Create the BITMAPINFO */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1411 byte[] bmi = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1412 BITMAPINFOHEADER bmiHeader = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1413 if (!isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1414 bmiHeader = new BITMAPINFOHEADER(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1415 bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1416 bmiHeader.biWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1417 bmiHeader.biHeight = -height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1418 bmiHeader.biPlanes = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1419 bmiHeader.biBitCount = cast(short)depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1420 bmiHeader.biCompression = OS.BI_RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1421 bmi = new byte[BITMAPINFOHEADER.sizeof + numColors * 4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1422 OS.MoveMemory(bmi, bmiHeader, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1423 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1424 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1425 /* Create the DC and select the bitmap */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1426 auto hBitmapDC = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1427 auto hOldBitmap = OS.SelectObject(hBitmapDC, handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1428 /* Select the palette if necessary */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1429 int oldPalette = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1430 if (!isDib && depth <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1431 int hPalette = device.hPalette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1432 if (hPalette !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1433 oldPalette = OS.SelectPalette(hBitmapDC, hPalette, false); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1434 OS.RealizePalette(hBitmapDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1435 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1436 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1437 /* 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
|
1438 int imageSize; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1439 if (isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1440 imageSize = dib.biSizeImage; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1441 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1442 /* Call with null lpBits to get the image size */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1443 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1444 OS.GetDIBits(hBitmapDC, handle, 0, height, 0, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1445 OS.MoveMemory(bmiHeader, bmi, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1446 imageSize = bmiHeader.biSizeImage; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1447 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1448 byte[] data = new byte[imageSize]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1449 /* Get the bitmap data */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1450 if (isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1451 if (OS.IsWinCE && this.handle !is handle) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1452 /* get image data from the temporary DIB */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1453 OS.MoveMemory(data, dib.bmBits, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1454 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1455 OS.MoveMemory(data, bm.bmBits, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1456 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1457 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1458 int hHeap = OS.GetProcessHeap(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1459 int lpvBits = OS.HeapAlloc(hHeap, OS.HEAP_ZERO_MEMORY, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1460 if (lpvBits is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1461 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1462 OS.GetDIBits(hBitmapDC, handle, 0, height, lpvBits, bmi, OS.DIB_RGB_COLORS); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1463 OS.MoveMemory(data, lpvBits, imageSize); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1464 OS.HeapFree(hHeap, 0, lpvBits); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1465 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1466 /* Calculate the palette */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1467 PaletteData palette = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1468 if (depth <= 8) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1469 RGB[] rgbs = new RGB[numColors]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1470 if (isDib) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1471 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1472 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1473 * Feature on WinCE. GetDIBColorTable is not supported. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1474 * 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
|
1475 * 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
|
1476 * RGB value. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1477 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1478 int red = 0, green = 0, blue = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1479 byte[] pBits = new byte[1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1480 OS.MoveMemory(pBits, bm.bmBits, 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1481 byte oldValue = pBits[0]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1482 int mask = (0xFF << (8 - bm.bmBitsPixel)) & 0x00FF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1483 for (int i = 0; i < numColors; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1484 pBits[0] = cast(byte)((i << (8 - bm.bmBitsPixel)) | (pBits[0] & ~mask)); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1485 OS.MoveMemory(bm.bmBits, pBits, 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1486 int color = OS.GetPixel(hBitmapDC, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1487 blue = (color & 0xFF0000) >> 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1488 green = (color & 0xFF00) >> 8; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1489 red = color & 0xFF; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1490 rgbs[i] = new RGB(red, green, blue); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1491 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1492 pBits[0] = oldValue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1493 OS.MoveMemory(bm.bmBits, pBits, 1); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1494 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1495 byte[] colors = new byte[numColors * 4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1496 OS.GetDIBColorTable(hBitmapDC, 0, numColors, colors); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1497 int colorIndex = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1498 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
|
1499 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
|
1500 colorIndex += 4; |
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 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1503 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1504 int srcIndex = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1505 for (int i = 0; i < numColors; i++) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1506 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
|
1507 srcIndex += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1508 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1509 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1510 palette = new PaletteData(rgbs); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1511 } else if (depth is 16) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1512 palette = new PaletteData(0x7C00, 0x3E0, 0x1F); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1513 } else if (depth is 24) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1514 palette = new PaletteData(0xFF, 0xFF00, 0xFF0000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1515 } else if (depth is 32) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1516 palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1517 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1518 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1519 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1520 /* Clean up */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1521 OS.SelectObject(hBitmapDC, hOldBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1522 if (oldPalette !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1523 OS.SelectPalette(hBitmapDC, oldPalette, false); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1524 OS.RealizePalette(hBitmapDC); |
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 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1527 if (handle !is this.handle) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1528 /* free temporary DIB */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1529 OS.DeleteObject (handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1530 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1531 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1532 OS.DeleteDC(hBitmapDC); |
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 /* Release the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1535 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1536 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1537 /* Construct and return the ImageData */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1538 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
|
1539 imageData.transparentPixel = this.transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1540 imageData.alpha = alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1541 if (alpha is -1 && alphaData !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1542 imageData.alphaData = new byte[alphaData.length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1543 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
|
1544 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1545 return imageData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1546 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1547 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1548 DWT.error(DWT.ERROR_INVALID_IMAGE); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1549 return null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1550 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1551 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1552 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1553 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1554 * 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
|
1555 * 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
|
1556 * <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
|
1557 * method. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1558 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1559 * @return the receiver's hash |
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 * @see #equals |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1562 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1563 public hash_t toHash () { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1564 return cast(hash_t)handle; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1565 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1566 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1567 void init(Device device, int width, int height) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1568 if (width <= 0 || height <= 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1569 DWT.error (DWT.ERROR_INVALID_ARGUMENT); |
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 this.device = device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1572 type = DWT.BITMAP; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1573 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1574 handle = OS.CreateCompatibleBitmap(hDC, width, height); |
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 * Feature in Windows. CreateCompatibleBitmap() may fail |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1577 * 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
|
1578 * in that case. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1579 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1580 if (handle is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1581 int bits = OS.GetDeviceCaps(hDC, OS.BITSPIXEL); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1582 int planes = OS.GetDeviceCaps(hDC, OS.PLANES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1583 int depth = bits * planes; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1584 if (depth < 16) depth = 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1585 handle = createDIB(width, height, depth); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1586 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1587 if (handle !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1588 auto memDC = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1589 auto hOldBitmap = OS.SelectObject(memDC, handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1590 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
|
1591 OS.SelectObject(memDC, hOldBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1592 OS.DeleteDC(memDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1593 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1594 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1595 if (handle is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1596 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
|
1597 } |
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 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1600 static HGDIOBJ createDIB(int width, int height, int depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1601 BITMAPINFOHEADER bmiHeader = new BITMAPINFOHEADER(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1602 bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1603 bmiHeader.biWidth = width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1604 bmiHeader.biHeight = -height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1605 bmiHeader.biPlanes = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1606 bmiHeader.biBitCount = cast(short)depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1607 if (OS.IsWinCE) bmiHeader.biCompression = OS.BI_BITFIELDS; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1608 else bmiHeader.biCompression = OS.BI_RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1609 byte[] bmi = new byte[BITMAPINFOHEADER.sizeof + (OS.IsWinCE ? 12 : 0)]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1610 OS.MoveMemory(bmi, bmiHeader, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1611 /* 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
|
1612 if (OS.IsWinCE) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1613 int redMask = 0xFF00; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1614 int greenMask = 0xFF0000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1615 int blueMask = 0xFF000000; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1616 /* big endian */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1617 int offset = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1618 bmi[offset] = cast(byte)((redMask & 0xFF000000) >> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1619 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
|
1620 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
|
1621 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
|
1622 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
|
1623 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
|
1624 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
|
1625 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
|
1626 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
|
1627 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
|
1628 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
|
1629 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
|
1630 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1631 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1632 int[] pBits = new int[1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1633 return OS.CreateDIBSection(0, bmi, OS.DIB_RGB_COLORS, pBits, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1634 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1635 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1636 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1637 * 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
|
1638 * 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
|
1639 * 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
|
1640 * 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
|
1641 * 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
|
1642 * 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
|
1643 * created. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1644 * 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
|
1645 * if the regular GetIconInfo had been used. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1646 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1647 static void GetIconInfo(Image image, ICONINFO* info) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1648 int[] result = init(image.device, null, image.data); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1649 info.hbmColor = result[0]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1650 info.hbmMask = result[1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1651 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1652 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1653 static int[] init(Device device, Image image, ImageData i) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1654 if (image !is null) image.device = device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1655 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1656 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1657 * BUG in Windows 98: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1658 * 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
|
1659 * 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
|
1660 * 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
|
1661 * 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
|
1662 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1663 /* 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
|
1664 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
|
1665 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
|
1666 ImageData.blit(ImageData.BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1667 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
|
1668 ImageData.ALPHA_OPAQUE, null, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1669 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
|
1670 false, false); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1671 img.transparentPixel = i.transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1672 img.maskPad = i.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1673 img.maskData = i.maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1674 img.alpha = i.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1675 img.alphaData = i.alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1676 i = img; |
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 * 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
|
1680 * 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
|
1681 * (0x00FF0000, 0x0000FF00, 0x000000FF) as documented in |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1682 * MSDN BITMAPINFOHEADER. Make sure the image is |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1683 * Windows-supported. |
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 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1686 * Note on WinCE. CreateDIBSection requires the biCompression |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1687 * 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
|
1688 * 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
|
1689 * 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
|
1690 * 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
|
1691 * platforms in BI_RGB mode. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1692 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1693 if (i.palette.isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1694 final PaletteData palette = i.palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1695 final int redMask = palette.redMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1696 final int greenMask = palette.greenMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1697 final int blueMask = palette.blueMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1698 int newDepth = i.depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1699 int newOrder = ImageData.MSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1700 PaletteData newPalette = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1701 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1702 switch (i.depth) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1703 case 8: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1704 newDepth = 16; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1705 newOrder = ImageData.LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1706 newPalette = new PaletteData(0x7C00, 0x3E0, 0x1F); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1707 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1708 case 16: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1709 newOrder = ImageData.LSB_FIRST; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1710 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
|
1711 newPalette = new PaletteData(0x7C00, 0x3E0, 0x1F); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1712 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1713 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1714 case 24: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1715 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
|
1716 newPalette = new PaletteData(0xFF, 0xFF00, 0xFF0000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1717 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1718 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1719 case 32: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1720 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
|
1721 newPalette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1722 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1723 break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1724 default: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1725 DWT.error(DWT.ERROR_UNSUPPORTED_DEPTH); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1726 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1727 if (newPalette !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1728 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
|
1729 ImageData.blit(ImageData.BLIT_SRC, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1730 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
|
1731 ImageData.ALPHA_OPAQUE, null, 0, 0, 0, |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1732 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
|
1733 false, false); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1734 if (i.transparentPixel !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1735 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
|
1736 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1737 img.maskPad = i.maskPad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1738 img.maskData = i.maskData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1739 img.alpha = i.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1740 img.alphaData = i.alphaData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1741 i = img; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1742 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1743 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1744 /* Construct bitmap info header by hand */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1745 RGB[] rgbs = i.palette.getRGBs(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1746 bool useBitfields = OS.IsWinCE && (i.depth is 16 || i.depth is 32); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1747 BITMAPINFOHEADER bmiHeader = new BITMAPINFOHEADER(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1748 bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1749 bmiHeader.biWidth = i.width; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1750 bmiHeader.biHeight = -i.height; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1751 bmiHeader.biPlanes = 1; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1752 bmiHeader.biBitCount = cast(short)i.depth; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1753 if (useBitfields) bmiHeader.biCompression = OS.BI_BITFIELDS; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1754 else bmiHeader.biCompression = OS.BI_RGB; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1755 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
|
1756 byte[] bmi; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1757 if (i.palette.isDirect) |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1758 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
|
1759 else |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1760 bmi = new byte[BITMAPINFOHEADER.sizeof + rgbs.length * 4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1761 OS.MoveMemory(bmi, bmiHeader, BITMAPINFOHEADER.sizeof); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1762 /* 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
|
1763 int offset = BITMAPINFOHEADER.sizeof; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1764 if (i.palette.isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1765 if (useBitfields) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1766 PaletteData palette = i.palette; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1767 int redMask = palette.redMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1768 int greenMask = palette.greenMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1769 int blueMask = palette.blueMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1770 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1771 * 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
|
1772 * endianness of the ImageData. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1773 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1774 if (i.getByteOrder() is ImageData.LSB_FIRST) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1775 bmi[offset] = cast(byte)((redMask & 0xFF) >> 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1776 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
|
1777 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
|
1778 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
|
1779 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
|
1780 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
|
1781 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
|
1782 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
|
1783 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
|
1784 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
|
1785 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
|
1786 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
|
1787 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1788 bmi[offset] = cast(byte)((redMask & 0xFF000000) >> 24); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1789 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
|
1790 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
|
1791 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
|
1792 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
|
1793 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
|
1794 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
|
1795 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
|
1796 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
|
1797 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
|
1798 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
|
1799 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
|
1800 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1801 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1802 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1803 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
|
1804 bmi[offset] = cast(byte)rgbs[j].blue; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1805 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
|
1806 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
|
1807 bmi[offset + 3] = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1808 offset += 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1809 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1810 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1811 int[] pBits = new int[1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1812 int hDib = OS.CreateDIBSection(0, bmi, OS.DIB_RGB_COLORS, pBits, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1813 if (hDib is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1814 /* 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
|
1815 byte[] data = i.data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1816 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
|
1817 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
|
1818 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1819 OS.MoveMemory(pBits[0], data, data.length); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1820 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1821 int[] result = null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1822 if (i.getTransparencyType() is DWT.TRANSPARENCY_MASK) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1823 /* Get the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1824 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1825 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1826 /* Create the color bitmap */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1827 auto hdcSrc = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1828 OS.SelectObject(hdcSrc, hDib); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1829 int hBitmap = OS.CreateCompatibleBitmap(hDC, i.width, i.height); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1830 if (hBitmap is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1831 auto hdcDest = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1832 OS.SelectObject(hdcDest, hBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1833 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
|
1834 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1835 /* Release the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1836 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1837 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1838 /* 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
|
1839 byte[] maskData = ImageData.convertPad(i.maskData, i.width, i.height, 1, i.maskPad, 2); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1840 int hMask = OS.CreateBitmap(i.width, i.height, 1, 1, maskData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1841 if (hMask is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1842 OS.SelectObject(hdcSrc, hMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1843 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
|
1844 OS.DeleteDC(hdcSrc); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1845 OS.DeleteDC(hdcDest); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1846 OS.DeleteObject(hDib); |
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 if (image is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1849 result = [hBitmap, hMask]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1850 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1851 /* Create the icon */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1852 ICONINFO info = new ICONINFO(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1853 info.fIcon = true; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1854 info.hbmColor = hBitmap; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1855 info.hbmMask = hMask; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1856 int hIcon = OS.CreateIconIndirect(info); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1857 if (hIcon is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1858 OS.DeleteObject(hBitmap); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1859 OS.DeleteObject(hMask); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1860 image.handle = hIcon; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1861 image.type = DWT.ICON; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1862 if (OS.IsWinCE) image.data = i; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1863 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1864 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1865 if (image is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1866 result = [hDib]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1867 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1868 image.handle = hDib; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1869 image.type = DWT.BITMAP; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1870 image.transparentPixel = i.transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1871 if (image.transparentPixel is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1872 image.alpha = i.alpha; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1873 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
|
1874 int length = i.alphaData.length; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1875 image.alphaData = new byte[length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1876 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
|
1877 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1878 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1879 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1880 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1881 return result; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1882 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1883 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1884 static int[] init(Device device, Image image, ImageData source, ImageData mask) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1885 /* 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
|
1886 ImageData imageData; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1887 int blackIndex = 0; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1888 if (source.palette.isDirect) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1889 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
|
1890 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1891 RGB black = new RGB(0, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1892 RGB[] rgbs = source.getRGBs(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1893 if (source.transparentPixel !is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1894 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1895 * 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
|
1896 * for black. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1897 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1898 RGB[] newRGBs = new RGB[rgbs.length]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1899 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
|
1900 if (source.transparentPixel >= newRGBs.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1901 /* Grow the palette with black */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1902 rgbs = new RGB[source.transparentPixel + 1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1903 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
|
1904 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
|
1905 rgbs[i] = new RGB(0, 0, 0); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1906 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1907 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1908 newRGBs[source.transparentPixel] = black; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1909 rgbs = newRGBs; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1910 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1911 blackIndex = source.transparentPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1912 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
|
1913 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1914 while (blackIndex < rgbs.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1915 if (rgbs[blackIndex].equals(black)) break; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1916 blackIndex++; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1917 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1918 if (blackIndex is rgbs.length) { |
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 * 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
|
1921 * pixel we can use. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1922 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1923 if ((1 << source.depth) > rgbs.length) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1924 /* 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
|
1925 RGB[] newRGBs = new RGB[rgbs.length + 1]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1926 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
|
1927 newRGBs[rgbs.length] = black; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1928 rgbs = newRGBs; |
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 /* No room to grow the palette */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1931 blackIndex = -1; |
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 } |
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 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1936 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1937 if (blackIndex is -1) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1938 /* 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
|
1939 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
|
1940 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1941 /* 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
|
1942 int[] imagePixels = new int[imageData.width]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1943 int[] maskPixels = new int[mask.width]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1944 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
|
1945 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
|
1946 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
|
1947 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
|
1948 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
|
1949 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1950 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
|
1951 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1952 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1953 imageData.maskPad = mask.scanlinePad; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1954 imageData.maskData = mask.data; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1955 return init(device, image, imageData); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1956 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1957 void init(Device device, ImageData i) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1958 if (i 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
|
1959 init(device, this, i); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1960 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1961 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1962 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1963 * 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
|
1964 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1965 * <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
|
1966 * 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
|
1967 * 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
|
1968 * 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
|
1969 * application code. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1970 * </p> |
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 * @param data the platform specific GC data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1973 * @return the platform specific GC handle |
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 public HDC internal_new_GC (GCData data) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1976 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
|
1977 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1978 * 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
|
1979 * Only supported for bitmaps. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1980 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1981 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
|
1982 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
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 /* Create a compatible HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1986 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1987 auto imageDC = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1988 device.internal_dispose_GC(hDC, null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1989 if (imageDC is 0) DWT.error(DWT.ERROR_NO_HANDLES); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1990 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1991 if (data !is null) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1992 /* Set the GCData fields */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1993 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
|
1994 if ((data.style & mask) !is 0) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1995 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
|
1996 } else { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1997 data.style |= DWT.LEFT_TO_RIGHT; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1998 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
1999 data.device = device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2000 data.image = this; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2001 data.hFont = device.systemFont; |
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 return imageDC; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2004 } |
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 * 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
|
2008 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2009 * <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
|
2010 * 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
|
2011 * 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
|
2012 * 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
|
2013 * application code. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2014 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2015 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2016 * @param hDC the platform specific GC handle |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2017 * @param data the platform specific GC data |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2018 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2019 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
|
2020 OS.DeleteDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2021 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2022 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2023 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2024 * 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
|
2025 * and <code>false</code> otherwise. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2026 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2027 * 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
|
2028 * 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
|
2029 * invoke any other method using the image. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2030 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2031 * @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
|
2032 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2033 public bool isDisposed() { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2034 return handle is null; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2035 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2036 |
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 * 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
|
2039 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2040 * 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
|
2041 * 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
|
2042 * 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
|
2043 * 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
|
2044 * 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
|
2045 * these cases. For example: |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2046 * <pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2047 * Button b = new Button(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2048 * image.setBackground(b.getBackground()); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2049 * b.setImage(image); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2050 * </pre> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2051 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2052 * 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
|
2053 * 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
|
2054 * 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
|
2055 * 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
|
2056 * </p><p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2057 * 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
|
2058 * pixel value. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2059 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2060 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2061 * @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
|
2062 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2063 * @exception IllegalArgumentException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2064 * <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
|
2065 * <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
|
2066 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2067 * @exception DWTException <ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2068 * <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
|
2069 * </ul> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2070 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2071 public void setBackground(Color color) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2072 /* |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2073 * Note. Not implemented on WinCE. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2074 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2075 if (OS.IsWinCE) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2076 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
|
2077 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
|
2078 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
|
2079 if (transparentPixel is -1) return; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2080 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2081 /* Get the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2082 auto hDC = device.internal_new_GC(null); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2083 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2084 /* Change the background color in the image */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2085 BITMAP bm = new BITMAP(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2086 OS.GetObject(handle, BITMAP.sizeof, bm); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2087 auto hdcMem = OS.CreateCompatibleDC(hDC); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2088 OS.SelectObject(hdcMem, handle); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2089 int maxColors = 1 << bm.bmBitsPixel; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2090 byte[] colors = new byte[maxColors * 4]; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2091 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2092 int numColors = OS.GetDIBColorTable(hdcMem, 0, maxColors, colors); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2093 int offset = transparentPixel * 4; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2094 colors[offset] = cast(byte)color.getBlue(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2095 colors[offset + 1] = cast(byte)color.getGreen(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2096 colors[offset + 2] = cast(byte)color.getRed(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2097 if (OS.IsWinCE) DWT.error(DWT.ERROR_NOT_IMPLEMENTED); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2098 OS.SetDIBColorTable(hdcMem, 0, numColors, colors); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2099 OS.DeleteDC(hdcMem); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2100 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2101 /* Release the HDC for the device */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2102 device.internal_dispose_GC(hDC, null); |
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 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2105 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2106 * 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
|
2107 * description of the receiver. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2108 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2109 * @return a string representation of the receiver |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2110 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2111 public char[] toString () { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2112 if (isDisposed()) return "Image {*DISPOSED*}"; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2113 return Format( "Image {{{}}", handle ); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2114 } |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2115 |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2116 /** |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2117 * 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
|
2118 * <p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2119 * <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
|
2120 * 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
|
2121 * 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
|
2122 * 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
|
2123 * application code. |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2124 * </p> |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2125 * |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2126 * @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
|
2127 * @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
|
2128 * @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
|
2129 * @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
|
2130 */ |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2131 public static Image win32_new(Device device, int type, HGDIOBJ handle) { |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2132 if (device is null) device = Device.getDevice(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2133 Image image = new Image(); |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2134 image.type = type; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2135 image.handle = handle; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2136 image.device = device; |
5f2e72114476
Image in work, this revision does not compile
Frank Benoit <benoit@tionex.de>
parents:
diff
changeset
|
2137 return image; |
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 } |