4 * Copyright 1993 Alexandre Julliard
12 #include "metafiledrv.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 static BOOL
MFDRV_CreateBrushIndirect(DC
*dc
, HBRUSH16 hBrush
,
38 char buffer
[sizeof(METARECORD
) - 2 + sizeof(*logbrush
)];
39 METARECORD
*mr
= (METARECORD
*)&buffer
;
41 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(*logbrush
) - 2) / 2;
42 mr
->rdFunction
= META_CREATEBRUSHINDIRECT
;
43 memcpy(&(mr
->rdParm
), logbrush
, sizeof(*logbrush
));
44 if (!(MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
46 mr
->rdSize
= sizeof(METARECORD
) / 2;
47 mr
->rdFunction
= META_SELECTOBJECT
;
49 if ((index
= MFDRV_AddHandleDC( dc
)) == -1) return FALSE
;
50 *(mr
->rdParm
) = index
;
51 return MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
55 /******************************************************************
56 * MFDRV_CreatePatternBrush
58 static BOOL
MFDRV_CreatePatternBrush(DC
*dc
, HBRUSH16 hBrush
,
61 DWORD len
, bmSize
, biSize
;
65 char buffer
[sizeof(METARECORD
)];
67 switch (logbrush
->lbStyle
)
74 GetObjectA(logbrush
->lbHatch
, sizeof(bm
), &bm
);
75 if(bm
.bmBitsPixel
!= 1 || bm
.bmPlanes
!= 1) {
76 FIXME(metafile
, "Trying to store a colour pattern brush\n");
80 bmSize
= DIB_GetDIBImageBytes(bm
.bmWidth
, bm
.bmHeight
, 1);
82 len
= sizeof(METARECORD
) + sizeof(WORD
) + sizeof(BITMAPINFO
) +
83 sizeof(RGBQUAD
) + bmSize
;
85 mr
= HeapAlloc(SystemHeap
, HEAP_ZERO_MEMORY
, len
);
87 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
89 mr
->rdParm
[0] = BS_PATTERN
;
90 mr
->rdParm
[1] = DIB_RGB_COLORS
;
91 info
= (BITMAPINFO
*)(mr
->rdParm
+ 2);
93 info
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
94 info
->bmiHeader
.biWidth
= bm
.bmWidth
;
95 info
->bmiHeader
.biHeight
= bm
.bmHeight
;
96 info
->bmiHeader
.biPlanes
= 1;
97 info
->bmiHeader
.biBitCount
= 1;
98 bits
= ((BYTE
*)info
) + sizeof(BITMAPINFO
) + sizeof(RGBQUAD
);
100 GetDIBits(dc
->hSelf
, logbrush
->lbHatch
, 0, bm
.bmHeight
, bits
,
101 info
, DIB_RGB_COLORS
);
102 *(DWORD
*)info
->bmiColors
= 0;
103 *(DWORD
*)(info
->bmiColors
+ 1) = 0xffffff;
108 info
= (BITMAPINFO
*)GlobalLock16((HGLOBAL16
)logbrush
->lbHatch
);
109 if (info
->bmiHeader
.biCompression
)
110 bmSize
= info
->bmiHeader
.biSizeImage
;
112 bmSize
= DIB_GetDIBImageBytes(info
->bmiHeader
.biWidth
,
113 info
->bmiHeader
.biHeight
,
114 info
->bmiHeader
.biBitCount
);
115 biSize
= DIB_BitmapInfoSize(info
, LOWORD(logbrush
->lbColor
));
116 len
= sizeof(METARECORD
) + biSize
+ bmSize
+ 2;
117 mr
= HeapAlloc(SystemHeap
, HEAP_ZERO_MEMORY
, len
);
118 if(!mr
) return FALSE
;
119 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
120 mr
->rdSize
= len
/ 2;
121 *(mr
->rdParm
) = logbrush
->lbStyle
;
122 *(mr
->rdParm
+ 1) = LOWORD(logbrush
->lbColor
);
123 memcpy(mr
->rdParm
+ 2, info
, biSize
+ bmSize
);
128 if (!(MFDRV_WriteRecord(dc
, mr
, len
)))
130 HeapFree(SystemHeap
, 0, mr
);
134 HeapFree(SystemHeap
, 0, mr
);
136 mr
= (METARECORD
*)&buffer
;
137 mr
->rdSize
= sizeof(METARECORD
) / 2;
138 mr
->rdFunction
= META_SELECTOBJECT
;
140 if ((index
= MFDRV_AddHandleDC( dc
)) == -1) return FALSE
;
141 *(mr
->rdParm
) = index
;
142 return MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
145 /***********************************************************************
146 * MFDRV_BRUSH_SelectObject
148 static HBRUSH
MFDRV_BRUSH_SelectObject( DC
* dc
, HBRUSH hbrush
,
151 LOGBRUSH16 logbrush
= { brush
->logbrush
.lbStyle
,
152 brush
->logbrush
.lbColor
,
153 brush
->logbrush
.lbHatch
};
154 switch (brush
->logbrush
.lbStyle
)
159 if (!MFDRV_CreateBrushIndirect( dc
, hbrush
, &logbrush
)) return 0;
163 if (!MFDRV_CreatePatternBrush( dc
, hbrush
, &logbrush
)) return 0;
166 return 1; /* FIXME? */
169 /******************************************************************
170 * MFDRV_CreateFontIndirect
173 static BOOL
MFDRV_CreateFontIndirect(DC
*dc
, HFONT16 hFont
, LOGFONT16
*logfont
)
176 char buffer
[sizeof(METARECORD
) - 2 + sizeof(LOGFONT16
)];
177 METARECORD
*mr
= (METARECORD
*)&buffer
;
179 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(LOGFONT16
) - 2) / 2;
180 mr
->rdFunction
= META_CREATEFONTINDIRECT
;
181 memcpy(&(mr
->rdParm
), logfont
, sizeof(LOGFONT16
));
182 if (!(MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
184 mr
->rdSize
= sizeof(METARECORD
) / 2;
185 mr
->rdFunction
= META_SELECTOBJECT
;
187 if ((index
= MFDRV_AddHandleDC( dc
)) == -1) return FALSE
;
188 *(mr
->rdParm
) = index
;
189 return MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
193 /***********************************************************************
194 * MFDRV_FONT_SelectObject
196 static HFONT16
MFDRV_FONT_SelectObject( DC
* dc
, HFONT16 hfont
,
199 HFONT16 prevHandle
= dc
->w
.hFont
;
200 if (MFDRV_CreateFontIndirect(dc
, hfont
, &(font
->logfont
)))
205 /******************************************************************
206 * MFDRV_CreatePenIndirect
208 static BOOL
MFDRV_CreatePenIndirect(DC
*dc
, HPEN16 hPen
, LOGPEN16
*logpen
)
211 char buffer
[sizeof(METARECORD
) - 2 + sizeof(*logpen
)];
212 METARECORD
*mr
= (METARECORD
*)&buffer
;
214 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(*logpen
) - 2) / 2;
215 mr
->rdFunction
= META_CREATEPENINDIRECT
;
216 memcpy(&(mr
->rdParm
), logpen
, sizeof(*logpen
));
217 if (!(MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
219 mr
->rdSize
= sizeof(METARECORD
) / 2;
220 mr
->rdFunction
= META_SELECTOBJECT
;
222 if ((index
= MFDRV_AddHandleDC( dc
)) == -1) return FALSE
;
223 *(mr
->rdParm
) = index
;
224 return MFDRV_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
228 /***********************************************************************
229 * MFDRV_PEN_SelectObject
231 static HPEN
MFDRV_PEN_SelectObject( DC
* dc
, HPEN hpen
, PENOBJ
* pen
)
233 HPEN prevHandle
= dc
->w
.hPen
;
234 LOGPEN16 logpen
= { pen
->logpen
.lopnStyle
,
235 { pen
->logpen
.lopnWidth
.x
, pen
->logpen
.lopnWidth
.y
},
236 pen
->logpen
.lopnColor
};
237 if (MFDRV_CreatePenIndirect( dc
, hpen
, &logpen
)) return prevHandle
;
242 /***********************************************************************
245 HGDIOBJ
MFDRV_SelectObject( DC
*dc
, HGDIOBJ handle
)
247 GDIOBJHDR
* ptr
= GDI_GetObjPtr( handle
, MAGIC_DONTCARE
);
251 TRACE(gdi
, "hdc=%04x %04x\n", dc
->hSelf
, handle
);
256 ret
= MFDRV_PEN_SelectObject( dc
, handle
, (PENOBJ
*)ptr
);
259 ret
= MFDRV_BRUSH_SelectObject( dc
, handle
, (BRUSHOBJ
*)ptr
);
262 ret
= MFDRV_BITMAP_SelectObject( dc
, handle
, (BITMAPOBJ
*)ptr
);
265 ret
= MFDRV_FONT_SelectObject( dc
, handle
, (FONTOBJ
*)ptr
);
268 ret
= (HGDIOBJ16
)SelectClipRgn16( dc
->hSelf
, handle
);
271 GDI_HEAP_UNLOCK( handle
);