4 * Copyright 1993 Alexandre Julliard
12 #include "metafiledrv.h"
14 #include "debugtools.h"
17 DECLARE_DEBUG_CHANNEL(gdi
)
18 DECLARE_DEBUG_CHANNEL(metafile
)
20 /***********************************************************************
21 * MFDRV_BITMAP_SelectObject
23 static HBITMAP16
MFDRV_BITMAP_SelectObject( DC
* dc
, HBITMAP16 hbitmap
,
30 /******************************************************************
31 * MFDRV_CreateBrushIndirect
34 INT16
MFDRV_CreateBrushIndirect(DC
*dc
, HBRUSH hBrush
)
39 BRUSHOBJ
*brushObj
= (BRUSHOBJ
*)GDI_GetObjPtr( hBrush
, BRUSH_MAGIC
);
40 if(!brushObj
) return -1;
42 switch(brushObj
->logbrush
.lbStyle
) {
49 lb16
.lbStyle
= brushObj
->logbrush
.lbStyle
;
50 lb16
.lbColor
= brushObj
->logbrush
.lbColor
;
51 lb16
.lbHatch
= brushObj
->logbrush
.lbHatch
;
52 size
= sizeof(METARECORD
) + sizeof(LOGBRUSH16
) - 2;
53 mr
= HeapAlloc( SystemHeap
, 0, size
);
54 mr
->rdSize
= size
/ 2;
55 mr
->rdFunction
= META_CREATEBRUSHINDIRECT
;
56 memcpy( mr
->rdParm
, &lb16
, sizeof(LOGBRUSH
));
66 GetObjectA(brushObj
->logbrush
.lbHatch
, sizeof(bm
), &bm
);
67 if(bm
.bmBitsPixel
!= 1 || bm
.bmPlanes
!= 1) {
68 FIXME_(metafile
)("Trying to store a colour pattern brush\n");
72 bmSize
= DIB_GetDIBImageBytes(bm
.bmWidth
, bm
.bmHeight
, 1);
74 size
= sizeof(METARECORD
) + sizeof(WORD
) + sizeof(BITMAPINFO
) +
75 sizeof(RGBQUAD
) + bmSize
;
77 mr
= HeapAlloc(SystemHeap
, HEAP_ZERO_MEMORY
, size
);
79 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
80 mr
->rdSize
= size
/ 2;
81 mr
->rdParm
[0] = BS_PATTERN
;
82 mr
->rdParm
[1] = DIB_RGB_COLORS
;
83 info
= (BITMAPINFO
*)(mr
->rdParm
+ 2);
85 info
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
86 info
->bmiHeader
.biWidth
= bm
.bmWidth
;
87 info
->bmiHeader
.biHeight
= bm
.bmHeight
;
88 info
->bmiHeader
.biPlanes
= 1;
89 info
->bmiHeader
.biBitCount
= 1;
90 bits
= ((BYTE
*)info
) + sizeof(BITMAPINFO
) + sizeof(RGBQUAD
);
92 GetDIBits(dc
->hSelf
, brushObj
->logbrush
.lbHatch
, 0, bm
.bmHeight
,
93 bits
, info
, DIB_RGB_COLORS
);
94 *(DWORD
*)info
->bmiColors
= 0;
95 *(DWORD
*)(info
->bmiColors
+ 1) = 0xffffff;
102 DWORD bmSize
, biSize
;
104 info
= GlobalLock16((HGLOBAL16
)brushObj
->logbrush
.lbHatch
);
105 if (info
->bmiHeader
.biCompression
)
106 bmSize
= info
->bmiHeader
.biSizeImage
;
108 bmSize
= DIB_GetDIBImageBytes(info
->bmiHeader
.biWidth
,
109 info
->bmiHeader
.biHeight
,
110 info
->bmiHeader
.biBitCount
);
111 biSize
= DIB_BitmapInfoSize(info
,
112 LOWORD(brushObj
->logbrush
.lbColor
));
113 size
= sizeof(METARECORD
) + biSize
+ bmSize
+ 2;
114 mr
= HeapAlloc(SystemHeap
, HEAP_ZERO_MEMORY
, size
);
115 if(!mr
) return FALSE
;
116 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
117 mr
->rdSize
= size
/ 2;
118 *(mr
->rdParm
) = brushObj
->logbrush
.lbStyle
;
119 *(mr
->rdParm
+ 1) = LOWORD(brushObj
->logbrush
.lbColor
);
120 memcpy(mr
->rdParm
+ 2, info
, biSize
+ bmSize
);
124 FIXME_(metafile
)("Unkonwn brush style %x\n",
125 brushObj
->logbrush
.lbStyle
);
128 index
= MFDRV_AddHandleDC( dc
);
129 if(!MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2))
131 HeapFree(SystemHeap
, 0, mr
);
132 GDI_HEAP_UNLOCK( hBrush
);
137 /***********************************************************************
138 * MFDRV_BRUSH_SelectObject
140 static HBRUSH
MFDRV_BRUSH_SelectObject( DC
*dc
, HBRUSH hbrush
,
146 index
= MFDRV_CreateBrushIndirect( dc
, hbrush
);
147 if(index
== -1) return 0;
149 mr
.rdSize
= sizeof(mr
) / 2;
150 mr
.rdFunction
= META_SELECTOBJECT
;
151 mr
.rdParm
[0] = index
;
152 return MFDRV_WriteRecord( dc
, &mr
, mr
.rdSize
* 2);
155 /******************************************************************
156 * MFDRV_CreateFontIndirect
159 static BOOL
MFDRV_CreateFontIndirect(DC
*dc
, HFONT16 hFont
, LOGFONT16
*logfont
)
162 char buffer
[sizeof(METARECORD
) - 2 + sizeof(LOGFONT16
)];
163 METARECORD
*mr
= (METARECORD
*)&buffer
;
165 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(LOGFONT16
) - 2) / 2;
166 mr
->rdFunction
= META_CREATEFONTINDIRECT
;
167 memcpy(&(mr
->rdParm
), logfont
, sizeof(LOGFONT16
));
168 if (!(MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
170 mr
->rdSize
= sizeof(METARECORD
) / 2;
171 mr
->rdFunction
= META_SELECTOBJECT
;
173 if ((index
= MFDRV_AddHandleDC( dc
)) == -1) return FALSE
;
174 *(mr
->rdParm
) = index
;
175 return MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
179 /***********************************************************************
180 * MFDRV_FONT_SelectObject
182 static HFONT16
MFDRV_FONT_SelectObject( DC
* dc
, HFONT16 hfont
,
185 HFONT16 prevHandle
= dc
->w
.hFont
;
186 if (MFDRV_CreateFontIndirect(dc
, hfont
, &(font
->logfont
)))
191 /******************************************************************
192 * MFDRV_CreatePenIndirect
194 static BOOL
MFDRV_CreatePenIndirect(DC
*dc
, HPEN16 hPen
, LOGPEN16
*logpen
)
197 char buffer
[sizeof(METARECORD
) - 2 + sizeof(*logpen
)];
198 METARECORD
*mr
= (METARECORD
*)&buffer
;
200 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(*logpen
) - 2) / 2;
201 mr
->rdFunction
= META_CREATEPENINDIRECT
;
202 memcpy(&(mr
->rdParm
), logpen
, sizeof(*logpen
));
203 if (!(MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
205 mr
->rdSize
= sizeof(METARECORD
) / 2;
206 mr
->rdFunction
= META_SELECTOBJECT
;
208 if ((index
= MFDRV_AddHandleDC( dc
)) == -1) return FALSE
;
209 *(mr
->rdParm
) = index
;
210 return MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
214 /***********************************************************************
215 * MFDRV_PEN_SelectObject
217 static HPEN
MFDRV_PEN_SelectObject( DC
* dc
, HPEN hpen
, PENOBJ
* pen
)
220 HPEN prevHandle
= dc
->w
.hPen
;
222 logpen
.lopnStyle
= pen
->logpen
.lopnStyle
;
223 logpen
.lopnWidth
.x
= pen
->logpen
.lopnWidth
.x
;
224 logpen
.lopnWidth
.y
= pen
->logpen
.lopnWidth
.y
;
225 logpen
.lopnColor
= pen
->logpen
.lopnColor
;
227 if (MFDRV_CreatePenIndirect( dc
, hpen
, &logpen
)) return prevHandle
;
233 /***********************************************************************
236 HGDIOBJ
MFDRV_SelectObject( DC
*dc
, HGDIOBJ handle
)
238 GDIOBJHDR
* ptr
= GDI_GetObjPtr( handle
, MAGIC_DONTCARE
);
242 TRACE_(gdi
)("hdc=%04x %04x\n", dc
->hSelf
, handle
);
247 ret
= MFDRV_PEN_SelectObject( dc
, handle
, (PENOBJ
*)ptr
);
250 ret
= MFDRV_BRUSH_SelectObject( dc
, handle
, (BRUSHOBJ
*)ptr
);
253 ret
= MFDRV_BITMAP_SelectObject( dc
, handle
, (BITMAPOBJ
*)ptr
);
256 ret
= MFDRV_FONT_SelectObject( dc
, handle
, (FONTOBJ
*)ptr
);
259 ret
= (HGDIOBJ16
)SelectClipRgn16( dc
->hSelf
, handle
);
262 GDI_HEAP_UNLOCK( handle
);