Mercurial > projects > dwt-linux
annotate dwt/graphics/Image.d @ 255:5a30aa9820f3
removed tango.stdc.stringz imports and allow null for arrays and string arguments.
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sun, 15 Jun 2008 22:32:20 +0200 |
parents | ce446666f5a2 |
children | c0d810de7093 |
rev | line source |
---|---|
72 | 1 /******************************************************************************* |
18 | 2 * Copyright (c) 2000, 2007 IBM Corporation and others. |
3 * All rights reserved. This program and the accompanying materials | |
4 * are made available under the terms of the Eclipse Public License v1.0 | |
5 * which accompanies this distribution, and is available at | |
6 * http://www.eclipse.org/legal/epl-v10.html | |
7 * | |
8 * Contributors: | |
9 * IBM Corporation - initial API and implementation | |
72 | 10 * Port to the D programming language: |
11 * Frank Benoit <benoit@tionex.de> | |
18 | 12 *******************************************************************************/ |
13 module dwt.graphics.Image; | |
14 | |
15 import dwt.internal.Converter; | |
19 | 16 import dwt.internal.cairo.Cairo; |
18 | 17 import dwt.internal.gtk.OS; |
71 | 18 import dwt.DWT; |
19 import dwt.DWTException; | |
18 | 20 import dwt.graphics.Color; |
21 import dwt.graphics.Device; | |
22 import dwt.graphics.Drawable; | |
23 import dwt.graphics.GC; | |
24 import dwt.graphics.GCData; | |
25 import dwt.graphics.ImageData; | |
26 import dwt.graphics.PaletteData; | |
27 import dwt.graphics.RGB; | |
28 import dwt.graphics.Rectangle; | |
29 import dwt.graphics.Resource; | |
30 | |
31 import dwt.dwthelper.InputStream; | |
200
08789b28bdf3
import dwt.dwthelper.utils now explicit
Frank Benoit <benoit@tionex.de>
parents:
150
diff
changeset
|
32 import dwt.dwthelper.utils; |
18 | 33 |
34 import tango.text.convert.Format; | |
35 import tango.stdc.string; | |
36 | |
37 /** | |
38 * Instances of this class are graphics which have been prepared | |
39 * for display on a specific device. That is, they are ready | |
40 * to paint using methods such as <code>GC.drawImage()</code> | |
41 * and display on widgets with, for example, <code>Button.setImage()</code>. | |
42 * <p> | |
43 * If loaded from a file format that supports it, an | |
44 * <code>Image</code> may have transparency, meaning that certain | |
45 * pixels are specified as being transparent when drawn. Examples | |
46 * of file formats that support transparency are GIF and PNG. | |
47 * </p><p> | |
48 * There are two primary ways to use <code>Images</code>. | |
49 * The first is to load a graphic file from disk and create an | |
50 * <code>Image</code> from it. This is done using an <code>Image</code> | |
51 * constructor, for example: | |
52 * <pre> | |
53 * Image i = new Image(device, "C:\\graphic.bmp"); | |
54 * </pre> | |
55 * A graphic file may contain a color table specifying which | |
56 * colors the image was intended to possess. In the above example, | |
57 * these colors will be mapped to the closest available color in | |
71 | 58 * DWT. It is possible to get more control over the mapping of |
18 | 59 * colors as the image is being created, using code of the form: |
60 * <pre> | |
61 * ImageData data = new ImageData("C:\\graphic.bmp"); | |
62 * RGB[] rgbs = data.getRGBs(); | |
63 * // At this point, rgbs contains specifications of all | |
64 * // the colors contained within this image. You may | |
65 * // allocate as many of these colors as you wish by | |
66 * // using the Color constructor Color(RGB), then | |
67 * // create the image: | |
68 * Image i = new Image(device, data); | |
69 * </pre> | |
70 * <p> | |
71 * Applications which require even greater control over the image | |
72 * loading process should use the support provided in class | |
73 * <code>ImageLoader</code>. | |
74 * </p><p> | |
75 * Application code must explicitly invoke the <code>Image.dispose()</code> | |
76 * method to release the operating system resources managed by each instance | |
77 * when those instances are no longer required. | |
78 * </p> | |
79 * | |
80 * @see Color | |
81 * @see ImageData | |
82 * @see ImageLoader | |
83 */ | |
84 public final class Image : Resource, Drawable { | |
240 | 85 alias Resource.init_ init_; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
86 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
87 * specifies whether the receiver is a bitmap or an icon |
71 | 88 * (one of <code>DWT.BITMAP</code>, <code>DWT.ICON</code>) |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
89 * <p> |
71 | 90 * <b>IMPORTANT:</b> This field is <em>not</em> part of the DWT |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
91 * public API. It is marked public only so that it can be shared |
71 | 92 * within the packages provided by DWT. It is not available on all |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
93 * platforms and should never be accessed from application code. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
94 * </p> |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
95 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
96 public int type; |
18 | 97 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
98 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
99 * The handle to the OS pixmap resource. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
100 * (Warning: This field is platform dependent) |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
101 * <p> |
71 | 102 * <b>IMPORTANT:</b> This field is <em>not</em> part of the DWT |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
103 * public API. It is marked public only so that it can be shared |
71 | 104 * within the packages provided by DWT. It is not available on all |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
105 * platforms and should never be accessed from application code. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
106 * </p> |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
107 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
108 public GdkDrawable* pixmap; |
18 | 109 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
110 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
111 * The handle to the OS mask resource. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
112 * (Warning: This field is platform dependent) |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
113 * <p> |
71 | 114 * <b>IMPORTANT:</b> This field is <em>not</em> part of the DWT |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
115 * public API. It is marked public only so that it can be shared |
71 | 116 * within the packages provided by DWT. It is not available on all |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
117 * platforms and should never be accessed from application code. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
118 * </p> |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
119 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
120 public GdkDrawable* mask; |
18 | 121 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
122 cairo_surface_t* surface; |
18 | 123 cairo_surface_t* surfaceData; |
124 | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
125 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
126 * specifies the transparent pixel |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
127 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
128 int transparentPixel = -1; |
18 | 129 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
130 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
131 * The GC the image is currently selected in. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
132 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
133 GC memGC; |
18 | 134 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
135 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
136 * The alpha data of the image. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
137 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
138 byte[] alphaData; |
18 | 139 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
140 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
141 * The global alpha value to be used for every pixel. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
142 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
143 int alpha = -1; |
18 | 144 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
145 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
146 * The width of the image. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
147 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
148 int width = -1; |
18 | 149 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
150 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
151 * The height of the image. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
152 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
153 int height = -1; |
18 | 154 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
155 /** |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
156 * Specifies the default scanline padding. |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
157 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
158 static const int DEFAULT_SCANLINE_PAD = 4; |
18 | 159 |
240 | 160 this(Device device) { |
161 super(device); | |
18 | 162 } |
163 | |
164 /** | |
165 * Constructs an empty instance of this class with the | |
166 * specified width and height. The result may be drawn upon | |
167 * by creating a GC and using any of its drawing operations, | |
168 * as shown in the following example: | |
169 * <pre> | |
170 * Image i = new Image(device, width, height); | |
171 * GC gc = new GC(i); | |
172 * gc.drawRectangle(0, 0, 50, 50); | |
173 * gc.dispose(); | |
174 * </pre> | |
175 * <p> | |
176 * Note: Some platforms may have a limitation on the size | |
177 * of image that can be created (size depends on width, height, | |
178 * and depth). For example, Windows 95, 98, and ME do not allow | |
179 * images larger than 16M. | |
180 * </p> | |
181 * | |
182 * @param device the device on which to create the image | |
183 * @param width the width of the new image | |
184 * @param height the height of the new image | |
185 * | |
186 * @exception IllegalArgumentException <ul> | |
187 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
188 * <li>ERROR_INVALID_ARGUMENT - if either the width or height is negative or zero</li> | |
189 * </ul> | |
71 | 190 * @exception DWTError <ul> |
18 | 191 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
192 * </ul> | |
193 */ | |
194 public this(Device device, int width, int height) { | |
240 | 195 super(device); |
196 init_(width, height); | |
197 init_(); | |
18 | 198 } |
199 | |
200 /** | |
201 * Constructs a new instance of this class based on the | |
202 * provided image, with an appearance that varies depending | |
203 * on the value of the flag. The possible flag values are: | |
204 * <dl> | |
205 * <dt><b>IMAGE_COPY</b></dt> | |
206 * <dd>the result is an identical copy of srcImage</dd> | |
207 * <dt><b>IMAGE_DISABLE</b></dt> | |
208 * <dd>the result is a copy of srcImage which has a <em>disabled</em> look</dd> | |
209 * <dt><b>IMAGE_GRAY</b></dt> | |
210 * <dd>the result is a copy of srcImage which has a <em>gray scale</em> look</dd> | |
211 * </dl> | |
212 * | |
213 * @param device the device on which to create the image | |
214 * @param srcImage the image to use as the source | |
215 * @param flag the style, either <code>IMAGE_COPY</code>, <code>IMAGE_DISABLE</code> or <code>IMAGE_GRAY</code> | |
216 * | |
217 * @exception IllegalArgumentException <ul> | |
218 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
219 * <li>ERROR_NULL_ARGUMENT - if srcImage is null</li> | |
220 * <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> | |
221 * <li>ERROR_INVALID_ARGUMENT - if the image has been disposed</li> | |
222 * </ul> | |
71 | 223 * @exception DWTException <ul> |
18 | 224 * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon, or is otherwise in an invalid state</li> |
225 * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the image is not supported</li> | |
226 * </ul> | |
71 | 227 * @exception DWTError <ul> |
18 | 228 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
229 * </ul> | |
230 */ | |
231 public this(Device device, Image srcImage, int flag) { | |
240 | 232 super(device); |
71 | 233 if (srcImage is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
234 if (srcImage.isDisposed()) DWT.error(DWT.ERROR_INVALID_ARGUMENT); | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
235 switch (flag) { |
71 | 236 case DWT.IMAGE_COPY: |
237 case DWT.IMAGE_DISABLE: | |
238 case DWT.IMAGE_GRAY: | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
239 break; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
240 default: |
71 | 241 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
242 } |
240 | 243 device = this.device; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
244 this.type = srcImage.type; |
18 | 245 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
246 /* Get source image size */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
247 int w, h; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
248 OS.gdk_drawable_get_size(srcImage.pixmap, &w, &h); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
249 int width = w; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
250 int height = h; |
18 | 251 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
252 /* Copy the mask */ |
131 | 253 if ((srcImage.type is DWT.ICON && srcImage.mask !is null ) || srcImage.transparentPixel !is -1) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
254 /* Generate the mask if necessary. */ |
131 | 255 if (srcImage.transparentPixel !is -1) srcImage.createMask(); |
18 | 256 //PORTING_FIXME cast |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
257 GdkDrawable* mask = cast(GdkDrawable*) OS.gdk_pixmap_new( null, width, height, 1); |
71 | 258 if (mask is null ) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
259 auto gdkGC = OS.gdk_gc_new(mask); |
71 | 260 if (gdkGC is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
261 OS.gdk_draw_drawable(mask, gdkGC, srcImage.mask, 0, 0, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
262 OS.g_object_unref(gdkGC); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
263 this.mask = mask; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
264 /* Destroy the image mask if the there is a GC created on the image */ |
131 | 265 if (srcImage.transparentPixel !is -1 && srcImage.memGC !is null) srcImage.destroyMask(); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
266 } |
18 | 267 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
268 /* Copy transparent pixel and alpha data */ |
131 | 269 if (flag !is DWT.IMAGE_DISABLE) transparentPixel = srcImage.transparentPixel; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
270 alpha = srcImage.alpha; |
131 | 271 if (srcImage.alphaData !is null) { |
25
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
272 alphaData = new byte[srcImage.alphaData.length]; |
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
273 System.arraycopy(srcImage.alphaData, 0, alphaData, 0, alphaData.length); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
274 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
275 createAlphaMask(width, height); |
18 | 276 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
277 /* Create the new pixmap */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
278 auto pixmap = cast(GdkDrawable*) OS.gdk_pixmap_new (cast(GdkDrawable*)OS.GDK_ROOT_PARENT(), width, height, -1); |
71 | 279 if (pixmap is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
280 auto gdkGC = OS.gdk_gc_new(pixmap); |
71 | 281 if (gdkGC is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
282 this.pixmap = pixmap; |
18 | 283 |
131 | 284 if (flag is DWT.IMAGE_COPY) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
285 OS.gdk_draw_drawable(pixmap, gdkGC, srcImage.pixmap, 0, 0, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
286 OS.g_object_unref(gdkGC); |
240 | 287 } else { |
18 | 288 |
240 | 289 /* Retrieve the source pixmap data */ |
290 auto pixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, false, 8, width, height); | |
291 if (pixbuf is null) DWT.error(DWT.ERROR_NO_HANDLES); | |
292 auto colormap = OS.gdk_colormap_get_system(); | |
293 OS.gdk_pixbuf_get_from_drawable(pixbuf, srcImage.pixmap, colormap, 0, 0, 0, 0, width, height); | |
294 int stride = OS.gdk_pixbuf_get_rowstride(pixbuf); | |
295 auto pixels = OS.gdk_pixbuf_get_pixels(pixbuf); | |
18 | 296 |
240 | 297 /* Apply transformation */ |
298 switch (flag) { | |
299 case DWT.IMAGE_DISABLE: { | |
300 Color zeroColor = device.getSystemColor(DWT.COLOR_WIDGET_NORMAL_SHADOW); | |
301 RGB zeroRGB = zeroColor.getRGB(); | |
302 byte zeroRed = cast(byte)zeroRGB.red; | |
303 byte zeroGreen = cast(byte)zeroRGB.green; | |
304 byte zeroBlue = cast(byte)zeroRGB.blue; | |
305 Color oneColor = device.getSystemColor(DWT.COLOR_WIDGET_BACKGROUND); | |
306 RGB oneRGB = oneColor.getRGB(); | |
307 byte oneRed = cast(byte)oneRGB.red; | |
308 byte oneGreen = cast(byte)oneRGB.green; | |
309 byte oneBlue = cast(byte)oneRGB.blue; | |
310 byte[] line = new byte[stride]; | |
311 for (int y=0; y<height; y++) { | |
312 memmove(line.ptr, pixels + (y * stride), stride); | |
313 for (int x=0; x<width; x++) { | |
314 int offset = x*3; | |
315 int red = line[offset] & 0xFF; | |
316 int green = line[offset+1] & 0xFF; | |
317 int blue = line[offset+2] & 0xFF; | |
318 int intensity = red * red + green * green + blue * blue; | |
319 if (intensity < 98304) { | |
320 line[offset] = zeroRed; | |
321 line[offset+1] = zeroGreen; | |
322 line[offset+2] = zeroBlue; | |
323 } else { | |
324 line[offset] = oneRed; | |
325 line[offset+1] = oneGreen; | |
326 line[offset+2] = oneBlue; | |
327 } | |
328 } | |
329 memmove(pixels + (y * stride), line.ptr, stride); | |
330 } | |
331 break; | |
332 } | |
333 case DWT.IMAGE_GRAY: { | |
334 byte[] line = new byte[stride]; | |
335 for (int y=0; y<height; y++) { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
336 memmove(line.ptr, pixels + (y * stride), stride); |
240 | 337 for (int x=0; x<width; x++) { |
338 int offset = x*3; | |
339 int red = line[offset] & 0xFF; | |
340 int green = line[offset+1] & 0xFF; | |
341 int blue = line[offset+2] & 0xFF; | |
342 byte intensity = cast(byte)((red+red+green+green+green+green+green+blue) >> 3); | |
343 line[offset] = line[offset+1] = line[offset+2] = intensity; | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
344 } |
240 | 345 memmove(pixels + (y * stride), line.ptr, stride); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
346 } |
240 | 347 break; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
348 } |
240 | 349 default: |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
350 } |
240 | 351 |
352 /* Copy data back to destination pixmap */ | |
353 OS.gdk_pixbuf_render_to_drawable(pixbuf, pixmap, gdkGC, 0, 0, 0, 0, width, height, OS.GDK_RGB_DITHER_NORMAL, 0, 0); | |
354 | |
355 /* Free resources */ | |
356 OS.g_object_unref(pixbuf); | |
357 OS.g_object_unref(gdkGC); | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
358 } |
240 | 359 init_(); |
18 | 360 } |
361 | |
362 /** | |
363 * Constructs an empty instance of this class with the | |
364 * width and height of the specified rectangle. The result | |
365 * may be drawn upon by creating a GC and using any of its | |
366 * drawing operations, as shown in the following example: | |
367 * <pre> | |
368 * Image i = new Image(device, boundsRectangle); | |
369 * GC gc = new GC(i); | |
370 * gc.drawRectangle(0, 0, 50, 50); | |
371 * gc.dispose(); | |
372 * </pre> | |
373 * <p> | |
374 * Note: Some platforms may have a limitation on the size | |
375 * of image that can be created (size depends on width, height, | |
376 * and depth). For example, Windows 95, 98, and ME do not allow | |
377 * images larger than 16M. | |
378 * </p> | |
379 * | |
380 * @param device the device on which to create the image | |
381 * @param bounds a rectangle specifying the image's width and height (must not be null) | |
382 * | |
383 * @exception IllegalArgumentException <ul> | |
384 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
385 * <li>ERROR_NULL_ARGUMENT - if the bounds rectangle is null</li> | |
386 * <li>ERROR_INVALID_ARGUMENT - if either the rectangle's width or height is negative</li> | |
387 * </ul> | |
71 | 388 * @exception DWTError <ul> |
18 | 389 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
390 * </ul> | |
391 */ | |
392 public this(Device device, Rectangle bounds) { | |
240 | 393 super(device); |
71 | 394 if (bounds is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
240 | 395 init_(bounds.width, bounds.height); |
396 init_(); | |
18 | 397 } |
398 | |
399 /** | |
400 * Constructs an instance of this class from the given | |
401 * <code>ImageData</code>. | |
402 * | |
403 * @param device the device on which to create the image | |
404 * @param data the image data to create the image from (must not be null) | |
405 * | |
406 * @exception IllegalArgumentException <ul> | |
407 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
408 * <li>ERROR_NULL_ARGUMENT - if the image data is null</li> | |
409 * </ul> | |
71 | 410 * @exception DWTException <ul> |
18 | 411 * <li>ERROR_UNSUPPORTED_DEPTH - if the depth of the ImageData is not supported</li> |
412 * </ul> | |
71 | 413 * @exception DWTError <ul> |
18 | 414 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
415 * </ul> | |
416 */ | |
417 public this(Device device, ImageData data) { | |
240 | 418 super(device); |
419 init_(data); | |
420 init_(); | |
18 | 421 } |
422 | |
423 /** | |
424 * Constructs an instance of this class, whose type is | |
71 | 425 * <code>DWT.ICON</code>, from the two given <code>ImageData</code> |
18 | 426 * objects. The two images must be the same size. Pixel transparency |
427 * in either image will be ignored. | |
428 * <p> | |
429 * The mask image should contain white wherever the icon is to be visible, | |
430 * and black wherever the icon is to be transparent. In addition, | |
431 * the source image should contain black wherever the icon is to be | |
432 * transparent. | |
433 * </p> | |
434 * | |
435 * @param device the device on which to create the icon | |
436 * @param source the color data for the icon | |
437 * @param mask the mask data for the icon | |
438 * | |
439 * @exception IllegalArgumentException <ul> | |
440 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
441 * <li>ERROR_NULL_ARGUMENT - if either the source or mask is null </li> | |
442 * <li>ERROR_INVALID_ARGUMENT - if source and mask are different sizes</li> | |
443 * </ul> | |
71 | 444 * @exception DWTError <ul> |
18 | 445 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
446 * </ul> | |
447 */ | |
448 public this(Device device, ImageData source, ImageData mask) { | |
240 | 449 super(device); |
71 | 450 if (source is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
451 if (mask is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); | |
131 | 452 if (source.width !is mask.width || source.height !is mask.height) { |
71 | 453 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
454 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
455 mask = ImageData.convertMask (mask); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
456 ImageData image = new ImageData(source.width, source.height, source.depth, source.palette, source.scanlinePad, source.data); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
457 image.maskPad = mask.scanlinePad; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
458 image.maskData = mask.data; |
240 | 459 init_(image); |
460 init_(); | |
18 | 461 } |
462 | |
463 /** | |
464 * Constructs an instance of this class by loading its representation | |
465 * from the specified input stream. Throws an error if an error | |
466 * occurs while loading the image, or if the result is an image | |
467 * of an unsupported type. Application code is still responsible | |
468 * for closing the input stream. | |
469 * <p> | |
470 * This constructor is provided for convenience when loading a single | |
471 * image only. If the stream contains multiple images, only the first | |
472 * one will be loaded. To load multiple images, use | |
473 * <code>ImageLoader.load()</code>. | |
474 * </p><p> | |
475 * This constructor may be used to load a resource as follows: | |
476 * </p> | |
477 * <pre> | |
478 * static Image loadImage (Display display, Class clazz, String string) { | |
479 * InputStream stream = clazz.getResourceAsStream (string); | |
480 * if (stream is null) return null; | |
481 * Image image = null; | |
482 * try { | |
483 * image = new Image (display, stream); | |
71 | 484 * } catch (DWTException ex) { |
18 | 485 * } finally { |
486 * try { | |
487 * stream.close (); | |
488 * } catch (IOException ex) {} | |
489 * } | |
490 * return image; | |
491 * } | |
492 * </pre> | |
493 * | |
494 * @param device the device on which to create the image | |
495 * @param stream the input stream to load the image from | |
496 * | |
497 * @exception IllegalArgumentException <ul> | |
498 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
499 * <li>ERROR_NULL_ARGUMENT - if the stream is null</li> | |
500 * </ul> | |
71 | 501 * @exception DWTException <ul> |
18 | 502 * <li>ERROR_IO - if an IO error occurs while reading from the stream</li> |
503 * <li>ERROR_INVALID_IMAGE - if the image stream contains invalid data </li> | |
504 * <li>ERROR_UNSUPPORTED_DEPTH - if the image stream describes an image with an unsupported depth</li> | |
505 * <li>ERROR_UNSUPPORTED_FORMAT - if the image stream contains an unrecognized format</li> | |
506 * </ul> | |
71 | 507 * @exception DWTError <ul> |
18 | 508 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
509 * </ul> | |
510 */ | |
511 public this(Device device, InputStream stream) { | |
240 | 512 super(device); |
513 init_(new ImageData(stream)); | |
514 init_(); | |
18 | 515 } |
516 | |
517 /** | |
518 * Constructs an instance of this class by loading its representation | |
519 * from the file with the specified name. Throws an error if an error | |
520 * occurs while loading the image, or if the result is an image | |
521 * of an unsupported type. | |
522 * <p> | |
523 * This constructor is provided for convenience when loading | |
524 * a single image only. If the specified file contains | |
525 * multiple images, only the first one will be used. | |
526 * | |
527 * @param device the device on which to create the image | |
528 * @param filename the name of the file to load the image from | |
529 * | |
530 * @exception IllegalArgumentException <ul> | |
531 * <li>ERROR_NULL_ARGUMENT - if device is null and there is no current device</li> | |
532 * <li>ERROR_NULL_ARGUMENT - if the file name is null</li> | |
533 * </ul> | |
71 | 534 * @exception DWTException <ul> |
18 | 535 * <li>ERROR_IO - if an IO error occurs while reading from the file</li> |
536 * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data </li> | |
537 * <li>ERROR_UNSUPPORTED_DEPTH - if the image file describes an image with an unsupported depth</li> | |
538 * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li> | |
539 * </ul> | |
71 | 540 * @exception DWTError <ul> |
18 | 541 * <li>ERROR_NO_HANDLES if a handle could not be obtained for image creation</li> |
542 * </ul> | |
543 */ | |
238 | 544 public this(Device device, String filename) { |
240 | 545 super(device); |
71 | 546 if (filename is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
547 try { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
548 int length = filename.length; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
549 auto pixbuf = OS.gdk_pixbuf_new_from_file(toStringz(filename), null); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
550 if (pixbuf !is null) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
551 bool hasAlpha = cast(bool)OS.gdk_pixbuf_get_has_alpha(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
552 if (hasAlpha) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
553 /* |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
554 * Bug in GTK. Depending on the image (seems to affect images that have |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
555 * some degree of transparency all over the image), gdk_pixbuff_render_pixmap_and_mask() |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
556 * will return a corrupt pixmap. To avoid this, read in and store the alpha channel data |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
557 * for the image and then set it to 0xFF to prevent any possible corruption from |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
558 * gdk_pixbuff_render_pixmap_and_mask(). |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
559 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
560 int width = OS.gdk_pixbuf_get_width(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
561 int height = OS.gdk_pixbuf_get_height(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
562 int stride = OS.gdk_pixbuf_get_rowstride(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
563 auto pixels = OS.gdk_pixbuf_get_pixels(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
564 byte[] line = new byte[stride]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
565 alphaData = new byte[width * height]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
566 for (int y = 0; y < height; y++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
567 memmove(line.ptr, pixels + (y * stride), stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
568 for (int x = 0; x < width; x++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
569 alphaData[y*width+x] = line[x*4 + 3]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
570 line[x*4 + 3] = cast(byte) 0xFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
571 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
572 memmove(pixels + (y * stride), line.ptr, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
573 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
574 createAlphaMask(width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
575 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
576 GdkPixmap* pixmap_return; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
577 OS.gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap_return, null, 0); |
71 | 578 this.type = DWT.BITMAP; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
579 this.pixmap = cast(GdkDrawable*)pixmap_return; |
71 | 580 if (pixmap is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
581 OS.g_object_unref (pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
582 return; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
583 } |
71 | 584 } catch (DWTException e) {} |
240 | 585 init_(new ImageData(filename)); |
586 init_(); | |
18 | 587 } |
588 | |
589 void createAlphaMask (int width, int height) { | |
131 | 590 if (device.useXRender && (alpha !is -1 || alphaData !is null)) { |
591 mask = cast(GdkDrawable*)OS.gdk_pixmap_new(null, alpha !is -1 ? 1 : width, alpha !is -1 ? 1 : height, 8); | |
71 | 592 if (mask is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
593 auto gc = OS.gdk_gc_new(mask); |
131 | 594 if (alpha !is -1) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
595 GdkColor* color = new GdkColor(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
596 color.pixel = (alpha & 0xFF) << 8 | (alpha & 0xFF); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
597 OS.gdk_gc_set_foreground(gc, color); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
598 OS.gdk_draw_rectangle(mask, gc, 1, 0, 0, 1, 1); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
599 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
600 GdkImage* imagePtr = OS.gdk_drawable_get_image(mask, 0, 0, width, height); |
71 | 601 if (imagePtr is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
602 GdkImage* gdkImage = new GdkImage(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
603 *gdkImage = *imagePtr; |
131 | 604 if (gdkImage.bpl is width) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
605 memmove(gdkImage.mem, alphaData.ptr, alphaData.length); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
606 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
607 byte[] line = new byte[gdkImage.bpl]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
608 for (int y = 0; y < height; y++) { |
25
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
609 System.arraycopy(alphaData, width * y, line, 0, width); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
610 memmove(gdkImage.mem + (gdkImage.bpl * y), line.ptr, gdkImage.bpl); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
611 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
612 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
613 OS.gdk_draw_image(mask, gc, imagePtr, 0, 0, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
614 OS.g_object_unref(imagePtr); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
615 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
616 OS.g_object_unref(gc); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
617 } |
18 | 618 } |
619 | |
620 /** | |
621 * Create the receiver's mask if necessary. | |
622 */ | |
623 void createMask() { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
624 if (mask !is null ) return; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
625 mask = createMask(getImageData(), false); |
71 | 626 if (mask is null ) DWT.error(DWT.ERROR_NO_HANDLES); |
18 | 627 } |
628 | |
629 GdkDrawable* createMask(ImageData image, bool copy) { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
630 ImageData mask = image.getTransparencyMask(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
631 byte[] data = mask.data; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
632 byte[] maskData = copy ? new byte[data.length] : data; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
633 for (int i = 0; i < maskData.length; i++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
634 byte s = data[i]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
635 maskData[i] = cast(byte)(((s & 0x80) >> 7) | ((s & 0x40) >> 5) | |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
636 ((s & 0x20) >> 3) | ((s & 0x10) >> 1) | ((s & 0x08) << 1) | |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
637 ((s & 0x04) << 3) | ((s & 0x02) << 5) | ((s & 0x01) << 7)); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
638 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
639 maskData = ImageData.convertPad(maskData, mask.width, mask.height, mask.depth, mask.scanlinePad, 1); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
640 return cast(GdkDrawable*)OS.gdk_bitmap_create_from_data(null, cast(char*)maskData.ptr, mask.width, mask.height); |
18 | 641 } |
642 | |
643 void createSurface() { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
644 if (surface !is null ) return; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
645 /* Generate the mask if necessary. */ |
131 | 646 if (transparentPixel !is -1) createMask(); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
647 int w, h; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
648 OS.gdk_drawable_get_size(pixmap, &w, &h); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
649 int width = w, height = h; |
131 | 650 if (mask !is null || alpha !is -1 || alphaData !is null) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
651 auto pixbuf = OS.gdk_pixbuf_new( OS.GDK_COLORSPACE_RGB, true, 8, width, height); |
71 | 652 if (pixbuf is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
653 auto colormap = OS.gdk_colormap_get_system(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
654 OS.gdk_pixbuf_get_from_drawable(pixbuf, pixmap, colormap, 0, 0, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
655 int stride = OS.gdk_pixbuf_get_rowstride(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
656 auto pixels = OS.gdk_pixbuf_get_pixels(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
657 byte[] line = new byte[stride]; |
131 | 658 if (mask !is null && OS.gdk_drawable_get_depth(mask) is 1) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
659 auto maskPixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, false, 8, width, height); |
71 | 660 if (maskPixbuf is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
661 OS.gdk_pixbuf_get_from_drawable(maskPixbuf, mask, null, 0, 0, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
662 int maskStride = OS.gdk_pixbuf_get_rowstride(maskPixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
663 auto maskPixels = OS.gdk_pixbuf_get_pixels(maskPixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
664 byte[] maskLine = new byte[maskStride]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
665 auto offset = pixels, maskOffset = maskPixels; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
666 for (int y=0; y<height; y++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
667 memmove(line.ptr, offset, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
668 memmove(maskLine.ptr, maskOffset, maskStride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
669 for (int x=0, offset1=0; x<width; x++, offset1 += 4) { |
131 | 670 if (maskLine[x * 3] is 0) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
671 line[offset1 + 0] = line[offset1 + 1] = line[offset1 + 2] = line[offset1 + 3] = 0; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
672 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
673 byte temp = line[offset1]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
674 line[offset1] = line[offset1 + 2]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
675 line[offset1 + 2] = temp; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
676 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
677 memmove(offset, line.ptr, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
678 offset += stride; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
679 maskOffset += maskStride; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
680 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
681 OS.g_object_unref(maskPixbuf); |
131 | 682 } else if (alpha !is -1) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
683 auto offset = pixels; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
684 for (int y=0; y<height; y++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
685 memmove(line.ptr, offset, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
686 for (int x=0, offset1=0; x<width; x++, offset1 += 4) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
687 line[offset1+3] = cast(byte)alpha; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
688 /* pre-multiplied alpha */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
689 int r = ((line[offset1 + 0] & 0xFF) * alpha) + 128; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
690 r = (r + (r >> 8)) >> 8; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
691 int g = ((line[offset1 + 1] & 0xFF) * alpha) + 128; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
692 g = (g + (g >> 8)) >> 8; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
693 int b = ((line[offset1 + 2] & 0xFF) * alpha) + 128; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
694 b = (b + (b >> 8)) >> 8; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
695 line[offset1 + 0] = cast(byte)b; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
696 line[offset1 + 1] = cast(byte)g; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
697 line[offset1 + 2] = cast(byte)r; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
698 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
699 memmove(offset, line.ptr, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
700 offset += stride; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
701 } |
131 | 702 } else if (alphaData !is null) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
703 auto offset = pixels; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
704 for (int y = 0; y < h; y++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
705 memmove (line.ptr, offset, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
706 for (int x=0, offset1=0; x<width; x++, offset1 += 4) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
707 int alpha = alphaData [y*w+x] & 0xFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
708 line[offset1+3] = cast(byte)alpha; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
709 /* pre-multiplied alpha */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
710 int r = ((line[offset1 + 0] & 0xFF) * alpha) + 128; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
711 r = (r + (r >> 8)) >> 8; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
712 int g = ((line[offset1 + 1] & 0xFF) * alpha) + 128; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
713 g = (g + (g >> 8)) >> 8; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
714 int b = ((line[offset1 + 2] & 0xFF) * alpha) + 128; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
715 b = (b + (b >> 8)) >> 8; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
716 line[offset1 + 0] = cast(byte)b; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
717 line[offset1 + 1] = cast(byte)g; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
718 line[offset1 + 2] = cast(byte)r; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
719 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
720 memmove (offset, line.ptr, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
721 offset += stride; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
722 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
723 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
724 auto offset = pixels; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
725 for (int y = 0; y < h; y++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
726 memmove (line.ptr, offset, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
727 for (int x=0, offset1=0; x<width; x++, offset1 += 4) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
728 line[offset1+3] = cast(byte)0xFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
729 byte temp = line[offset1]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
730 line[offset1] = line[offset1 + 2]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
731 line[offset1 + 2] = temp; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
732 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
733 memmove (offset, line.ptr, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
734 offset += stride; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
735 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
736 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
737 surfaceData = cast(cairo_surface_t*) OS.g_malloc(stride * height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
738 memmove(surfaceData, pixels, stride * height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
739 surface = Cairo.cairo_image_surface_create_for_data(cast(char*)surfaceData, Cairo.CAIRO_FORMAT_ARGB32, width, height, stride); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
740 OS.g_object_unref(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
741 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
742 auto xDisplay = OS.GDK_DISPLAY(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
743 auto xDrawable = OS.GDK_PIXMAP_XID(pixmap); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
744 auto xVisual = OS.gdk_x11_visual_get_xvisual(OS.gdk_visual_get_system()); |
19 | 745 // PORTING_FIXME cast and types not good |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
746 surface = Cairo.cairo_xlib_surface_create(cast(void*)xDisplay, xDrawable, xVisual, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
747 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
748 /* Destroy the image mask if the there is a GC created on the image */ |
131 | 749 if (transparentPixel !is -1 && memGC !is null) destroyMask(); |
18 | 750 } |
751 | |
752 /** | |
753 * Destroy the receiver's mask if it exists. | |
754 */ | |
755 void destroyMask() { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
756 if (mask is null) return; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
757 OS.g_object_unref(mask); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
758 mask = null; |
18 | 759 } |
760 | |
240 | 761 void destroy() { |
131 | 762 if (memGC !is null) memGC.dispose(); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
763 if (pixmap !is null) OS.g_object_unref(pixmap); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
764 if (mask !is null) OS.g_object_unref(mask); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
765 if (surface !is null) Cairo.cairo_surface_destroy(surface); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
766 if (surfaceData !is null) OS.g_free(surfaceData); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
767 surfaceData = null; |
19 | 768 surface = null; |
769 pixmap = null; | |
770 mask = null; | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
771 memGC = null; |
18 | 772 } |
773 | |
774 /** | |
775 * Compares the argument to the receiver, and returns true | |
776 * if they represent the <em>same</em> object using a class | |
777 * specific comparison. | |
778 * | |
779 * @param object the object to compare with this object | |
780 * @return <code>true</code> if the object is the same as this object and <code>false</code> otherwise | |
781 * | |
782 * @see #hashCode | |
783 */ | |
150
f2e04420fd6c
reworked overrides and superclass aliases
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
784 public override int opEquals (Object object) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
785 if (object is this) return true; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
786 if ( auto image = cast(Image)object ){ |
18 | 787 return device is image.device && pixmap is image.pixmap; |
788 } | |
789 return false; | |
790 } | |
791 | |
792 /** | |
793 * Returns the color to which to map the transparent pixel, or null if | |
794 * the receiver has no transparent pixel. | |
795 * <p> | |
796 * There are certain uses of Images that do not support transparency | |
797 * (for example, setting an image into a button or label). In these cases, | |
798 * it may be desired to simulate transparency by using the background | |
799 * color of the widget to paint the transparent pixels of the image. | |
800 * Use this method to check which color will be used in these cases | |
801 * in place of transparency. This value may be set with setBackground(). | |
802 * <p> | |
803 * | |
804 * @return the background color of the image, or null if there is no transparency in the image | |
805 * | |
71 | 806 * @exception DWTException <ul> |
18 | 807 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> |
808 * </ul> | |
809 */ | |
810 public Color getBackground() { | |
71 | 811 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED); |
131 | 812 if (transparentPixel is -1) return null; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
813 //NOT DONE |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
814 return null; |
18 | 815 } |
816 | |
817 /** | |
818 * Returns the bounds of the receiver. The rectangle will always | |
819 * have x and y values of 0, and the width and height of the | |
820 * image. | |
821 * | |
822 * @return a rectangle specifying the image's bounds | |
823 * | |
71 | 824 * @exception DWTException <ul> |
18 | 825 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> |
826 * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li> | |
827 * </ul> | |
828 */ | |
829 public Rectangle getBounds() { | |
71 | 830 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED); |
131 | 831 if (width !is -1 && height !is -1) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
832 return new Rectangle(0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
833 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
834 int w; int h; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
835 OS.gdk_drawable_get_size(pixmap, &w, &h); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
836 return new Rectangle(0, 0, width = w, height = h); |
18 | 837 } |
838 | |
839 /** | |
840 * Returns an <code>ImageData</code> based on the receiver | |
841 * Modifications made to this <code>ImageData</code> will not | |
842 * affect the Image. | |
843 * | |
844 * @return an <code>ImageData</code> containing the image's data and attributes | |
845 * | |
71 | 846 * @exception DWTException <ul> |
18 | 847 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> |
848 * <li>ERROR_INVALID_IMAGE - if the image is not a bitmap or an icon</li> | |
849 * </ul> | |
850 * | |
851 * @see ImageData | |
852 */ | |
853 public ImageData getImageData() { | |
71 | 854 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED); |
18 | 855 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
856 int w, h; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
857 OS.gdk_drawable_get_size(pixmap, &w, &h); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
858 int width = w, height = h; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
859 auto pixbuf = OS.gdk_pixbuf_new(OS.GDK_COLORSPACE_RGB, false, 8, width, height); |
71 | 860 if (pixbuf is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
861 auto colormap = OS.gdk_colormap_get_system(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
862 OS.gdk_pixbuf_get_from_drawable(pixbuf, pixmap, colormap, 0, 0, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
863 int stride = OS.gdk_pixbuf_get_rowstride(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
864 auto pixels = OS.gdk_pixbuf_get_pixels(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
865 byte[] srcData = new byte[stride * height]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
866 memmove(srcData.ptr, pixels, srcData.length); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
867 OS.g_object_unref(pixbuf); |
18 | 868 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
869 PaletteData palette = new PaletteData(0xFF0000, 0xFF00, 0xFF); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
870 ImageData data = new ImageData(width, height, 24, palette); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
871 data.data = srcData; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
872 data.bytesPerLine = stride; |
18 | 873 |
131 | 874 if (transparentPixel is -1 && type is DWT.ICON && mask !is null) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
875 /* Get the icon mask data */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
876 auto gdkImagePtr = OS.gdk_drawable_get_image(mask, 0, 0, width, height); |
71 | 877 if (gdkImagePtr is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
878 GdkImage* gdkImage = new GdkImage(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
879 memmove(gdkImage, gdkImagePtr, GdkImage.sizeof ); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
880 byte[] maskData = new byte[gdkImage.bpl * gdkImage.height]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
881 memmove(maskData.ptr, gdkImage.mem, maskData.length); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
882 OS.g_object_unref(gdkImagePtr); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
883 int maskPad; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
884 for (maskPad = 1; maskPad < 128; maskPad++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
885 int bpl = (((width + 7) / 8) + (maskPad - 1)) / maskPad * maskPad; |
131 | 886 if (gdkImage.bpl is bpl) break; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
887 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
888 /* Make mask scanline pad equals to 2 */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
889 data.maskPad = 2; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
890 maskData = ImageData.convertPad(maskData, width, height, 1, maskPad, data.maskPad); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
891 /* Bit swap the mask data if necessary */ |
131 | 892 if (gdkImage.byte_order is OS.GDK_LSB_FIRST) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
893 for (int i = 0; i < maskData.length; i++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
894 byte b = maskData[i]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
895 maskData[i] = cast(byte)(((b & 0x01) << 7) | ((b & 0x02) << 5) | |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
896 ((b & 0x04) << 3) | ((b & 0x08) << 1) | ((b & 0x10) >> 1) | |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
897 ((b & 0x20) >> 3) | ((b & 0x40) >> 5) | ((b & 0x80) >> 7)); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
898 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
899 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
900 data.maskData = maskData; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
901 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
902 data.transparentPixel = transparentPixel; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
903 data.alpha = alpha; |
131 | 904 if (alpha is -1 && alphaData !is null) { |
25
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
905 data.alphaData = new byte[alphaData.length]; |
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
906 System.arraycopy(alphaData, 0, data.alphaData, 0, alphaData.length); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
907 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
908 return data; |
18 | 909 } |
910 | |
911 /** | |
912 * Invokes platform specific functionality to allocate a new image. | |
913 * <p> | |
914 * <b>IMPORTANT:</b> This method is <em>not</em> part of the public | |
915 * API for <code>Image</code>. It is marked public only so that it | |
71 | 916 * can be shared within the packages provided by DWT. It is not |
18 | 917 * available on all platforms, and should never be called from |
918 * application code. | |
919 * </p> | |
920 * | |
921 * @param device the device on which to allocate the color | |
71 | 922 * @param type the type of the image (<code>DWT.BITMAP</code> or <code>DWT.ICON</code>) |
18 | 923 * @param pixmap the OS handle for the image |
924 * @param mask the OS handle for the image mask | |
925 * | |
926 * @private | |
927 */ | |
92 | 928 public static Image gtk_new(Device device, int type, GdkDrawable* pixmap, GdkDrawable* mask) { |
240 | 929 Image image = new Image(device); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
930 image.type = type; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
931 image.pixmap = cast(GdkDrawable*)pixmap; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
932 image.mask = cast(GdkDrawable*)mask; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
933 return image; |
18 | 934 } |
935 | |
936 /** | |
937 * Returns an integer hash code for the receiver. Any two | |
938 * objects that return <code>true</code> when passed to | |
939 * <code>equals</code> must return the same value for this | |
940 * method. | |
941 * | |
942 * @return the receiver's hash | |
943 * | |
944 * @see #equals | |
945 */ | |
150
f2e04420fd6c
reworked overrides and superclass aliases
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
946 public override hash_t toHash () { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
947 return cast(hash_t)/*64*/pixmap; |
18 | 948 } |
949 | |
240 | 950 void init_(int width, int height) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
951 if (width <= 0 || height <= 0) { |
71 | 952 DWT.error (DWT.ERROR_INVALID_ARGUMENT); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
953 } |
71 | 954 this.type = DWT.BITMAP; |
18 | 955 |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
956 /* Create the pixmap */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
957 this.pixmap = cast(GdkDrawable*) OS.gdk_pixmap_new(cast(GdkDrawable*)OS.GDK_ROOT_PARENT(), width, height, -1); |
71 | 958 if (pixmap is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
959 /* Fill the bitmap with white */ |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
960 GdkColor* white = new GdkColor(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
961 white.red = 0xFFFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
962 white.green = 0xFFFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
963 white.blue = 0xFFFF; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
964 auto colormap = OS.gdk_colormap_get_system(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
965 OS.gdk_colormap_alloc_color(colormap, white, true, true); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
966 auto gdkGC = OS.gdk_gc_new(pixmap); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
967 OS.gdk_gc_set_foreground(gdkGC, white); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
968 OS.gdk_draw_rectangle(pixmap, gdkGC, 1, 0, 0, width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
969 OS.g_object_unref(gdkGC); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
970 OS.gdk_colormap_free_colors(colormap, white, 1); |
18 | 971 } |
972 | |
240 | 973 void init_(ImageData image) { |
71 | 974 if (image is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
975 int width = image.width; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
976 int height = image.height; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
977 PaletteData palette = image.palette; |
131 | 978 if (!(((image.depth is 1 || image.depth is 2 || image.depth is 4 || image.depth is 8) && !palette.isDirect) || |
979 ((image.depth is 8) || (image.depth is 16 || image.depth is 24 || image.depth is 32) && palette.isDirect))) | |
71 | 980 DWT.error (DWT.ERROR_UNSUPPORTED_DEPTH); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
981 auto pixbuf = OS.gdk_pixbuf_new( OS.GDK_COLORSPACE_RGB, false, 8, width, height); |
71 | 982 if (pixbuf is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
983 int stride = OS.gdk_pixbuf_get_rowstride(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
984 auto data = OS.gdk_pixbuf_get_pixels(pixbuf); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
985 byte[] buffer = image.data; |
131 | 986 if (!palette.isDirect || image.depth !is 24 || stride !is image.bytesPerLine || palette.redMask !is 0xFF0000 || palette.greenMask !is 0xFF00 || palette.blueMask !is 0xFF) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
987 buffer = new byte[stride * height]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
988 if (palette.isDirect) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
989 ImageData.blit(ImageData.BLIT_SRC, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
990 image.data, image.depth, image.bytesPerLine, image.getByteOrder(), 0, 0, width, height, palette.redMask, palette.greenMask, palette.blueMask, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
991 ImageData.ALPHA_OPAQUE, null, 0, 0, 0, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
992 buffer, 24, stride, ImageData.MSB_FIRST, 0, 0, width, height, 0xFF0000, 0xFF00, 0xFF, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
993 false, false); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
994 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
995 RGB[] rgbs = palette.getRGBs(); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
996 int length = rgbs.length; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
997 byte[] srcReds = new byte[length]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
998 byte[] srcGreens = new byte[length]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
999 byte[] srcBlues = new byte[length]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1000 for (int i = 0; i < rgbs.length; i++) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1001 RGB rgb = rgbs[i]; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1002 if (rgb is null) continue; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1003 srcReds[i] = cast(byte)rgb.red; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1004 srcGreens[i] = cast(byte)rgb.green; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1005 srcBlues[i] = cast(byte)rgb.blue; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1006 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1007 ImageData.blit(ImageData.BLIT_SRC, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1008 image.data, image.depth, image.bytesPerLine, image.getByteOrder(), 0, 0, width, height, srcReds, srcGreens, srcBlues, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1009 ImageData.ALPHA_OPAQUE, null, 0, 0, 0, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1010 buffer, 24, stride, ImageData.MSB_FIRST, 0, 0, width, height, 0xFF0000, 0xFF00, 0xFF, |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1011 false, false); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1012 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1013 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1014 memmove(data, buffer.ptr, stride * height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1015 auto pixmap = cast(GdkDrawable*) OS.gdk_pixmap_new (cast(GdkDrawable*) OS.GDK_ROOT_PARENT(), width, height, -1); |
71 | 1016 if (pixmap is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1017 auto gdkGC = OS.gdk_gc_new(pixmap); |
71 | 1018 if (gdkGC is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1019 OS.gdk_pixbuf_render_to_drawable(pixbuf, pixmap, gdkGC, 0, 0, 0, 0, width, height, OS.GDK_RGB_DITHER_NORMAL, 0, 0); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1020 OS.g_object_unref(gdkGC); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1021 OS.g_object_unref(pixbuf); |
18 | 1022 |
131 | 1023 bool isIcon = image.getTransparencyType() is DWT.TRANSPARENCY_MASK; |
1024 if (isIcon || image.transparentPixel !is -1) { | |
1025 if (image.transparentPixel !is -1) { | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1026 RGB rgb = null; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1027 if (palette.isDirect) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1028 rgb = palette.getRGB(image.transparentPixel); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1029 } else { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1030 if (image.transparentPixel < palette.colors.length) { |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1031 rgb = palette.getRGB(image.transparentPixel); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1032 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1033 } |
131 | 1034 if (rgb !is null) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1035 transparentPixel = rgb.red << 16 | rgb.green << 8 | rgb.blue; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1036 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1037 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1038 auto mask = createMask(image, isIcon); |
71 | 1039 if (mask is null) DWT.error(DWT.ERROR_NO_HANDLES); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1040 this.mask = mask; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1041 if (isIcon) { |
71 | 1042 this.type = DWT.ICON; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1043 } else { |
71 | 1044 this.type = DWT.BITMAP; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1045 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1046 } else { |
71 | 1047 this.type = DWT.BITMAP; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1048 this.mask = null; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1049 this.alpha = image.alpha; |
131 | 1050 if (image.alpha is -1 && image.alphaData !is null) { |
25
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
1051 this.alphaData = new byte[image.alphaData.length]; |
fc2b263b8a3f
Merged back the System.arraycopy and use a System class
Frank Benoit <benoit@tionex.de>
parents:
19
diff
changeset
|
1052 System.arraycopy(image.alphaData, 0, this.alphaData, 0, alphaData.length); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1053 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1054 createAlphaMask(width, height); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1055 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1056 this.pixmap = pixmap; |
18 | 1057 } |
1058 | |
1059 /** | |
1060 * Invokes platform specific functionality to allocate a new GC handle. | |
1061 * <p> | |
1062 * <b>IMPORTANT:</b> This method is <em>not</em> part of the public | |
1063 * API for <code>Image</code>. It is marked public only so that it | |
71 | 1064 * can be shared within the packages provided by DWT. It is not |
18 | 1065 * available on all platforms, and should never be called from |
1066 * application code. | |
1067 * </p> | |
1068 * | |
1069 * @param data the platform specific GC data | |
1070 * @return the platform specific GC handle | |
1071 */ | |
19 | 1072 public GdkGC* internal_new_GC (GCData data) { |
71 | 1073 if (pixmap is null) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED); |
131 | 1074 if (type !is DWT.BITMAP || memGC !is null) { |
71 | 1075 DWT.error(DWT.ERROR_INVALID_ARGUMENT); |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1076 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1077 auto gdkGC = OS.gdk_gc_new(pixmap); |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1078 if (data !is null) { |
71 | 1079 int mask = DWT.LEFT_TO_RIGHT | DWT.RIGHT_TO_LEFT; |
131 | 1080 if ((data.style & mask) is 0) { |
71 | 1081 data.style |= DWT.LEFT_TO_RIGHT; |
240 | 1082 } else { |
1083 if ((data.style & DWT.RIGHT_TO_LEFT) !is 0) { | |
1084 data.style |= DWT.MIRRORED; | |
1085 } | |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1086 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1087 data.device = device; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1088 data.drawable = pixmap; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1089 data.background = device.COLOR_WHITE.handle; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1090 data.foreground = device.COLOR_BLACK.handle; |
240 | 1091 data.font = device.systemFont; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1092 data.image = this; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1093 } |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1094 return gdkGC; |
18 | 1095 } |
1096 | |
1097 /** | |
1098 * Invokes platform specific functionality to dispose a GC handle. | |
1099 * <p> | |
1100 * <b>IMPORTANT:</b> This method is <em>not</em> part of the public | |
1101 * API for <code>Image</code>. It is marked public only so that it | |
71 | 1102 * can be shared within the packages provided by DWT. It is not |
18 | 1103 * available on all platforms, and should never be called from |
1104 * application code. | |
1105 * </p> | |
1106 * | |
1107 * @param hDC the platform specific GC handle | |
1108 * @param data the platform specific GC data | |
1109 */ | |
19 | 1110 public void internal_dispose_GC ( GdkGC* gdkGC, GCData data) { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1111 OS.g_object_unref(gdkGC); |
18 | 1112 } |
1113 | |
1114 /** | |
1115 * Returns <code>true</code> if the image has been disposed, | |
1116 * and <code>false</code> otherwise. | |
1117 * <p> | |
1118 * This method gets the dispose state for the image. | |
1119 * When an image has been disposed, it is an error to | |
1120 * invoke any other method using the image. | |
1121 * | |
1122 * @return <code>true</code> when the image is disposed and <code>false</code> otherwise | |
1123 */ | |
150
f2e04420fd6c
reworked overrides and superclass aliases
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
1124 public override bool isDisposed() { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1125 return pixmap is null; |
18 | 1126 } |
1127 | |
1128 /** | |
1129 * Sets the color to which to map the transparent pixel. | |
1130 * <p> | |
1131 * There are certain uses of <code>Images</code> that do not support | |
1132 * transparency (for example, setting an image into a button or label). | |
1133 * In these cases, it may be desired to simulate transparency by using | |
1134 * the background color of the widget to paint the transparent pixels | |
1135 * of the image. This method specifies the color that will be used in | |
1136 * these cases. For example: | |
1137 * <pre> | |
1138 * Button b = new Button(); | |
1139 * image.setBackground(b.getBackground()); | |
1140 * b.setImage(image); | |
1141 * </pre> | |
1142 * </p><p> | |
1143 * The image may be modified by this operation (in effect, the | |
1144 * transparent regions may be filled with the supplied color). Hence | |
1145 * this operation is not reversible and it is not legal to call | |
1146 * this function twice or with a null argument. | |
1147 * </p><p> | |
1148 * This method has no effect if the receiver does not have a transparent | |
1149 * pixel value. | |
1150 * </p> | |
1151 * | |
1152 * @param color the color to use when a transparent pixel is specified | |
1153 * | |
1154 * @exception IllegalArgumentException <ul> | |
1155 * <li>ERROR_NULL_ARGUMENT - if the color is null</li> | |
1156 * <li>ERROR_INVALID_ARGUMENT - if the color has been disposed</li> | |
1157 * </ul> | |
71 | 1158 * @exception DWTException <ul> |
18 | 1159 * <li>ERROR_GRAPHIC_DISPOSED - if the receiver has been disposed</li> |
1160 * </ul> | |
1161 */ | |
1162 public void setBackground(Color color) { | |
71 | 1163 if (isDisposed()) DWT.error(DWT.ERROR_GRAPHIC_DISPOSED); |
1164 if (color is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); | |
1165 if (color.isDisposed()) DWT.error(DWT.ERROR_INVALID_ARGUMENT); | |
131 | 1166 if (transparentPixel is -1) return; |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1167 //NOT DONE |
18 | 1168 } |
1169 | |
1170 /** | |
1171 * Returns a string containing a concise, human-readable | |
1172 * description of the receiver. | |
1173 * | |
1174 * @return a string representation of the receiver | |
1175 */ | |
238 | 1176 public override String toString () { |
59
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1177 if (isDisposed()) return "Image {*DISPOSED*}"; |
8cec8f536af3
All D sources complete gvim retab (4 spaces), bug with Composite moveAbove/moveBelow fixed.
Frank Benoit <benoit@tionex.de>
parents:
55
diff
changeset
|
1178 return Format( "Image {{{}}", pixmap); |
18 | 1179 } |
1180 | |
1181 } | |
150
f2e04420fd6c
reworked overrides and superclass aliases
Frank Benoit <benoit@tionex.de>
parents:
131
diff
changeset
|
1182 |