1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 """
29 Wrapper for gdi32.dll in ctypes.
30 """
31
32 __revision__ = "$Id: gdi32.py 687 2010-06-06 16:09:38Z qvasimodo $"
33
34 from defines import *
35 from kernel32 import GetLastError, SetLastError
36
37
38
39
40
41
42
43
44 OBJ_PEN = 1
45 OBJ_BRUSH = 2
46 OBJ_DC = 3
47 OBJ_METADC = 4
48 OBJ_PAL = 5
49 OBJ_FONT = 6
50 OBJ_BITMAP = 7
51 OBJ_REGION = 8
52 OBJ_METAFILE = 9
53 OBJ_MEMDC = 10
54 OBJ_EXTPEN = 11
55 OBJ_ENHMETADC = 12
56 OBJ_ENHMETAFILE = 13
57 OBJ_COLORSPACE = 14
58 GDI_OBJ_LAST = OBJ_COLORSPACE
59
60
61 SRCCOPY = 0x00CC0020
62 SRCPAINT = 0x00EE0086
63 SRCAND = 0x008800C6
64 SRCINVERT = 0x00660046
65 SRCERASE = 0x00440328
66 NOTSRCCOPY = 0x00330008
67 NOTSRCERASE = 0x001100A6
68 MERGECOPY = 0x00C000CA
69 MERGEPAINT = 0x00BB0226
70 PATCOPY = 0x00F00021
71 PATPAINT = 0x00FB0A09
72 PATINVERT = 0x005A0049
73 DSTINVERT = 0x00550009
74 BLACKNESS = 0x00000042
75 WHITENESS = 0x00FF0062
76 NOMIRRORBITMAP = 0x80000000
77 CAPTUREBLT = 0x40000000
78
79
80 ERROR = 0
81 NULLREGION = 1
82 SIMPLEREGION = 2
83 COMPLEXREGION = 3
84 RGN_ERROR = ERROR
85
86
87 RGN_AND = 1
88 RGN_OR = 2
89 RGN_XOR = 3
90 RGN_DIFF = 4
91 RGN_COPY = 5
92 RGN_MIN = RGN_AND
93 RGN_MAX = RGN_COPY
94
95
96 BLACKONWHITE = 1
97 WHITEONBLACK = 2
98 COLORONCOLOR = 3
99 HALFTONE = 4
100 MAXSTRETCHBLTMODE = 4
101 STRETCH_ANDSCANS = BLACKONWHITE
102 STRETCH_ORSCANS = WHITEONBLACK
103 STRETCH_DELETESCANS = COLORONCOLOR
104 STRETCH_HALFTONE = HALFTONE
105
106
107 ALTERNATE = 1
108 WINDING = 2
109 POLYFILL_LAST = 2
110
111
112 LAYOUT_RTL = 0x00000001
113 LAYOUT_BTT = 0x00000002
114 LAYOUT_VBH = 0x00000004
115 LAYOUT_ORIENTATIONMASK = LAYOUT_RTL + LAYOUT_BTT + LAYOUT_VBH
116 LAYOUT_BITMAPORIENTATIONPRESERVED = 0x00000008
117
118
119 WHITE_BRUSH = 0
120 LTGRAY_BRUSH = 1
121 GRAY_BRUSH = 2
122 DKGRAY_BRUSH = 3
123 BLACK_BRUSH = 4
124 NULL_BRUSH = 5
125 HOLLOW_BRUSH = NULL_BRUSH
126 WHITE_PEN = 6
127 BLACK_PEN = 7
128 NULL_PEN = 8
129 OEM_FIXED_FONT = 10
130 ANSI_FIXED_FONT = 11
131 ANSI_VAR_FONT = 12
132 SYSTEM_FONT = 13
133 DEVICE_DEFAULT_FONT = 14
134 DEFAULT_PALETTE = 15
135 SYSTEM_FIXED_FONT = 16
136
137
138 META_SETBKCOLOR = 0x0201
139 META_SETBKMODE = 0x0102
140 META_SETMAPMODE = 0x0103
141 META_SETROP2 = 0x0104
142 META_SETRELABS = 0x0105
143 META_SETPOLYFILLMODE = 0x0106
144 META_SETSTRETCHBLTMODE = 0x0107
145 META_SETTEXTCHAREXTRA = 0x0108
146 META_SETTEXTCOLOR = 0x0209
147 META_SETTEXTJUSTIFICATION = 0x020A
148 META_SETWINDOWORG = 0x020B
149 META_SETWINDOWEXT = 0x020C
150 META_SETVIEWPORTORG = 0x020D
151 META_SETVIEWPORTEXT = 0x020E
152 META_OFFSETWINDOWORG = 0x020F
153 META_SCALEWINDOWEXT = 0x0410
154 META_OFFSETVIEWPORTORG = 0x0211
155 META_SCALEVIEWPORTEXT = 0x0412
156 META_LINETO = 0x0213
157 META_MOVETO = 0x0214
158 META_EXCLUDECLIPRECT = 0x0415
159 META_INTERSECTCLIPRECT = 0x0416
160 META_ARC = 0x0817
161 META_ELLIPSE = 0x0418
162 META_FLOODFILL = 0x0419
163 META_PIE = 0x081A
164 META_RECTANGLE = 0x041B
165 META_ROUNDRECT = 0x061C
166 META_PATBLT = 0x061D
167 META_SAVEDC = 0x001E
168 META_SETPIXEL = 0x041F
169 META_OFFSETCLIPRGN = 0x0220
170 META_TEXTOUT = 0x0521
171 META_BITBLT = 0x0922
172 META_STRETCHBLT = 0x0B23
173 META_POLYGON = 0x0324
174 META_POLYLINE = 0x0325
175 META_ESCAPE = 0x0626
176 META_RESTOREDC = 0x0127
177 META_FILLREGION = 0x0228
178 META_FRAMEREGION = 0x0429
179 META_INVERTREGION = 0x012A
180 META_PAINTREGION = 0x012B
181 META_SELECTCLIPREGION = 0x012C
182 META_SELECTOBJECT = 0x012D
183 META_SETTEXTALIGN = 0x012E
184 META_CHORD = 0x0830
185 META_SETMAPPERFLAGS = 0x0231
186 META_EXTTEXTOUT = 0x0a32
187 META_SETDIBTODEV = 0x0d33
188 META_SELECTPALETTE = 0x0234
189 META_REALIZEPALETTE = 0x0035
190 META_ANIMATEPALETTE = 0x0436
191 META_SETPALENTRIES = 0x0037
192 META_POLYPOLYGON = 0x0538
193 META_RESIZEPALETTE = 0x0139
194 META_DIBBITBLT = 0x0940
195 META_DIBSTRETCHBLT = 0x0b41
196 META_DIBCREATEPATTERNBRUSH = 0x0142
197 META_STRETCHDIB = 0x0f43
198 META_EXTFLOODFILL = 0x0548
199 META_SETLAYOUT = 0x0149
200 META_DELETEOBJECT = 0x01f0
201 META_CREATEPALETTE = 0x00f7
202 META_CREATEPATTERNBRUSH = 0x01F9
203 META_CREATEPENINDIRECT = 0x02FA
204 META_CREATEFONTINDIRECT = 0x02FB
205 META_CREATEBRUSHINDIRECT = 0x02FC
206 META_CREATEREGION = 0x06FF
207
208
209 NEWFRAME = 1
210 ABORTDOC = 2
211 NEXTBAND = 3
212 SETCOLORTABLE = 4
213 GETCOLORTABLE = 5
214 FLUSHOUTPUT = 6
215 DRAFTMODE = 7
216 QUERYESCSUPPORT = 8
217 SETABORTPROC = 9
218 STARTDOC = 10
219 ENDDOC = 11
220 GETPHYSPAGESIZE = 12
221 GETPRINTINGOFFSET = 13
222 GETSCALINGFACTOR = 14
223 MFCOMMENT = 15
224 GETPENWIDTH = 16
225 SETCOPYCOUNT = 17
226 SELECTPAPERSOURCE = 18
227 DEVICEDATA = 19
228 PASSTHROUGH = 19
229 GETTECHNOLGY = 20
230 GETTECHNOLOGY = 20
231 SETLINECAP = 21
232 SETLINEJOIN = 22
233 SETMITERLIMIT = 23
234 BANDINFO = 24
235 DRAWPATTERNRECT = 25
236 GETVECTORPENSIZE = 26
237 GETVECTORBRUSHSIZE = 27
238 ENABLEDUPLEX = 28
239 GETSETPAPERBINS = 29
240 GETSETPRINTORIENT = 30
241 ENUMPAPERBINS = 31
242 SETDIBSCALING = 32
243 EPSPRINTING = 33
244 ENUMPAPERMETRICS = 34
245 GETSETPAPERMETRICS = 35
246 POSTSCRIPT_DATA = 37
247 POSTSCRIPT_IGNORE = 38
248 MOUSETRAILS = 39
249 GETDEVICEUNITS = 42
250 GETEXTENDEDTEXTMETRICS = 256
251 GETEXTENTTABLE = 257
252 GETPAIRKERNTABLE = 258
253 GETTRACKKERNTABLE = 259
254 EXTTEXTOUT = 512
255 GETFACENAME = 513
256 DOWNLOADFACE = 514
257 ENABLERELATIVEWIDTHS = 768
258 ENABLEPAIRKERNING = 769
259 SETKERNTRACK = 770
260 SETALLJUSTVALUES = 771
261 SETCHARSET = 772
262 STRETCHBLT = 2048
263 METAFILE_DRIVER = 2049
264 GETSETSCREENPARAMS = 3072
265 QUERYDIBSUPPORT = 3073
266 BEGIN_PATH = 4096
267 CLIP_TO_PATH = 4097
268 END_PATH = 4098
269 EXT_DEVICE_CAPS = 4099
270 RESTORE_CTM = 4100
271 SAVE_CTM = 4101
272 SET_ARC_DIRECTION = 4102
273 SET_BACKGROUND_COLOR = 4103
274 SET_POLY_MODE = 4104
275 SET_SCREEN_ANGLE = 4105
276 SET_SPREAD = 4106
277 TRANSFORM_CTM = 4107
278 SET_CLIP_BOX = 4108
279 SET_BOUNDS = 4109
280 SET_MIRROR_MODE = 4110
281 OPENCHANNEL = 4110
282 DOWNLOADHEADER = 4111
283 CLOSECHANNEL = 4112
284 POSTSCRIPT_PASSTHROUGH = 4115
285 ENCAPSULATED_POSTSCRIPT = 4116
286 POSTSCRIPT_IDENTIFY = 4117
287 POSTSCRIPT_INJECTION = 4118
288 CHECKJPEGFORMAT = 4119
289 CHECKPNGFORMAT = 4120
290 GET_PS_FEATURESETTING = 4121
291 GDIPLUS_TS_QUERYVER = 4122
292 GDIPLUS_TS_RECORD = 4123
293 SPCLPASSTHROUGH2 = 4568
294
295
296
297
298
299
300
301
302
303 -class RECT(Structure):
304 _fields_ = [
305 ('left', LONG),
306 ('top', LONG),
307 ('right', LONG),
308 ('bottom', LONG),
309 ]
310 PRECT = POINTER(RECT)
311 LPRECT = PRECT
312
313
314
315
316
318 _fields_ = [
319 ('x', LONG),
320 ('y', LONG),
321 ]
322 PPOINT = POINTER(POINT)
323 LPPOINT = PPOINT
324
325
326
327
328
329
330
331
332
333
335 _fields_ = [
336 ("bmType", LONG),
337 ("bmWidth", LONG),
338 ("bmHeight", LONG),
339 ("bmWidthBytes", LONG),
340 ("bmPlanes", WORD),
341 ("bmBitsPixel", WORD),
342 ("bmBits", LPVOID),
343 ]
344 PBITMAP = POINTER(BITMAP)
345 LPBITMAP = PBITMAP
346
347
348
349
350
351
352
353
360
361
362
363
370
371
372
373
374
376 _ReleaseDC = windll.gdi32.ReleaseDC
377 _ReleaseDC.argtypes = [HWND, HDC]
378 _ReleaseDC.restype = ctypes.c_int
379 _ReleaseDC.errcheck = RaiseIfZero
380 _ReleaseDC(hWnd, hDC)
381
382
383
384
385
387 _SelectObject = windll.gdi32.SelectObject
388 _SelectObject.argtypes = [HDC, HGDIOBJ]
389 _SelectObject.restype = HGDIOBJ
390 _SelectObject.errcheck = RaiseIfZero
391 return _SelectObject(hdc, hgdiobj)
392
393
394
395
397 _GetStockObject = windll.gdi32.GetStockObject
398 _GetStockObject.argtypes = [ctypes.c_int]
399 _GetStockObject.restype = HGDIOBJ
400 _GetStockObject.errcheck = RaiseIfZero
401 return _GetStockObject(fnObject)
402
403
404
405
407 _GetObjectType = windll.gdi32.GetObjectType
408 _GetObjectType.argtypes = [HGDIOBJ]
409 _GetObjectType.restype = DWORD
410 _GetObjectType.errcheck = RaiseIfZero
411 return _GetObjectType(h)
412
413
414
415
416
417
418 -def GetObject(hgdiobj, cbBuffer = None, lpvObject = None):
419 _GetObject = windll.gdi32.GetObject
420 _GetObject.argtypes = [HGDIOBJ, ctypes.c_int, LPVOID]
421 _GetObject.restype = ctypes.c_int
422 _GetObject.errcheck = RaiseIfZero
423
424
425
426
427
428
429 if cbBuffer is not None:
430 if lpvObject is None:
431 lpvObject = ctypes.create_string_buffer("", cbBuffer)
432 elif lpvObject is not None:
433 cbBuffer = ctypes.sizeof(lpvObject)
434 else:
435 t = GetObjectType(hgdiobj)
436 if t == OBJ_PEN:
437 cbBuffer = ctypes.sizeof(LOGPEN)
438 lpvObject = LOGPEN()
439 elif t == OBJ_BRUSH:
440 cbBuffer = ctypes.sizeof(LOGBRUSH)
441 lpvObject = LOGBRUSH()
442 elif t == OBJ_PAL:
443 cbBuffer = _GetObject(hgdiobj, 0, None)
444 lpvObject = (WORD * (cbBuffer // ctypes.sizeof(WORD)))()
445 elif t == OBJ_FONT:
446 cbBuffer = ctypes.sizeof(LOGFONT)
447 lpvObject = LOGFONT()
448 elif t == OBJ_BITMAP:
449 cbBuffer = ctypes.sizeof(DIBSECTION)
450 lpvObject = DIBSECTION()
451 try:
452 _GetObject(hgdiobj, cbBuffer, ctypes.byref(lpvObject))
453 return lpvObject
454 except WindowsError:
455 cbBuffer = ctypes.sizeof(BITMAP)
456 lpvObject = BITMAP()
457 elif t == OBJ_EXTPEN:
458 cbBuffer = ctypes.sizeof(LOGEXTPEN)
459 lpvObject = LOGEXTPEN()
460 else:
461 cbBuffer = _GetObject(hgdiobj, 0, None)
462 lpvObject = ctypes.create_string_buffer("", cbBuffer)
463 _GetObject(hgdiobj, cbBuffer, ctypes.byref(lpvObject))
464 return lpvObject
465
466
467
468
469
470
472 _GetBitmapBits = windll.gdi32.GetBitmapBits
473 _GetBitmapBits.argtypes = [HBITMAP, LONG, LPVOID]
474 _GetBitmapBits.restype = LONG
475 _GetBitmapBits.errcheck = RaiseIfZero
476
477 bitmap = GetObject(hbmp, lpvObject = BITMAP())
478 cbBuffer = bitmap.bmWidthBytes * bitmap.bmHeight
479 lpvBits = ctypes.create_string_buffer("", cbBuffer)
480 _GetBitmapBits(hbmp, cbBuffer, ctypes.byref(lpvBits))
481 return lpvBits.raw
482
483
484
485
492