4 * Copyright 1993 Alexandre Julliard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include "mfdrv/metafiledrv.h"
29 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(metafile
);
34 /***********************************************************************
37 HBITMAP
MFDRV_SelectBitmap( PHYSDEV dev
, HBITMAP hbitmap
)
43 /******************************************************************
44 * MFDRV_CreateBrushIndirect
47 INT16
MFDRV_CreateBrushIndirect(PHYSDEV dev
, HBRUSH hBrush
)
53 METAFILEDRV_PDEVICE
*physDev
= (METAFILEDRV_PDEVICE
*)dev
;
55 if (!GetObjectA( hBrush
, sizeof(logbrush
), &logbrush
)) return -1;
57 switch(logbrush
.lbStyle
)
65 lb16
.lbStyle
= logbrush
.lbStyle
;
66 lb16
.lbColor
= logbrush
.lbColor
;
67 lb16
.lbHatch
= logbrush
.lbHatch
;
68 size
= sizeof(METARECORD
) + sizeof(LOGBRUSH16
) - 2;
69 mr
= HeapAlloc( GetProcessHeap(), 0, size
);
70 mr
->rdSize
= size
/ 2;
71 mr
->rdFunction
= META_CREATEBRUSHINDIRECT
;
72 memcpy( mr
->rdParm
, &lb16
, sizeof(LOGBRUSH
));
82 GetObjectA((HANDLE
)logbrush
.lbHatch
, sizeof(bm
), &bm
);
83 if(bm
.bmBitsPixel
!= 1 || bm
.bmPlanes
!= 1) {
84 FIXME("Trying to store a colour pattern brush\n");
88 bmSize
= DIB_GetDIBImageBytes(bm
.bmWidth
, bm
.bmHeight
, 1);
90 size
= sizeof(METARECORD
) + sizeof(WORD
) + sizeof(BITMAPINFO
) +
91 sizeof(RGBQUAD
) + bmSize
;
93 mr
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, size
);
95 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
96 mr
->rdSize
= size
/ 2;
97 mr
->rdParm
[0] = BS_PATTERN
;
98 mr
->rdParm
[1] = DIB_RGB_COLORS
;
99 info
= (BITMAPINFO
*)(mr
->rdParm
+ 2);
101 info
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
102 info
->bmiHeader
.biWidth
= bm
.bmWidth
;
103 info
->bmiHeader
.biHeight
= bm
.bmHeight
;
104 info
->bmiHeader
.biPlanes
= 1;
105 info
->bmiHeader
.biBitCount
= 1;
106 bits
= ((BYTE
*)info
) + sizeof(BITMAPINFO
) + sizeof(RGBQUAD
);
108 GetDIBits(physDev
->hdc
, (HANDLE
)logbrush
.lbHatch
, 0, bm
.bmHeight
,
109 bits
, info
, DIB_RGB_COLORS
);
110 *(DWORD
*)info
->bmiColors
= 0;
111 *(DWORD
*)(info
->bmiColors
+ 1) = 0xffffff;
118 DWORD bmSize
, biSize
;
120 info
= GlobalLock16((HGLOBAL16
)logbrush
.lbHatch
);
121 if (info
->bmiHeader
.biCompression
)
122 bmSize
= info
->bmiHeader
.biSizeImage
;
124 bmSize
= DIB_GetDIBImageBytes(info
->bmiHeader
.biWidth
,
125 info
->bmiHeader
.biHeight
,
126 info
->bmiHeader
.biBitCount
);
127 biSize
= DIB_BitmapInfoSize(info
, LOWORD(logbrush
.lbColor
));
128 size
= sizeof(METARECORD
) + biSize
+ bmSize
+ 2;
129 mr
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, size
);
131 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
132 mr
->rdSize
= size
/ 2;
133 *(mr
->rdParm
) = logbrush
.lbStyle
;
134 *(mr
->rdParm
+ 1) = LOWORD(logbrush
.lbColor
);
135 memcpy(mr
->rdParm
+ 2, info
, biSize
+ bmSize
);
139 FIXME("Unkonwn brush style %x\n", logbrush
.lbStyle
);
142 index
= MFDRV_AddHandleDC( dev
);
143 if(!MFDRV_WriteRecord( dev
, mr
, mr
->rdSize
* 2))
145 HeapFree(GetProcessHeap(), 0, mr
);
151 /***********************************************************************
154 HBRUSH
MFDRV_SelectBrush( PHYSDEV dev
, HBRUSH hbrush
)
159 index
= MFDRV_CreateBrushIndirect( dev
, hbrush
);
160 if(index
== -1) return 0;
162 mr
.rdSize
= sizeof(mr
) / 2;
163 mr
.rdFunction
= META_SELECTOBJECT
;
164 mr
.rdParm
[0] = index
;
165 return MFDRV_WriteRecord( dev
, &mr
, mr
.rdSize
* 2) ? hbrush
: 0;
168 /******************************************************************
169 * MFDRV_CreateFontIndirect
172 static BOOL
MFDRV_CreateFontIndirect(PHYSDEV dev
, HFONT hFont
, LOGFONT16
*logfont
)
175 char buffer
[sizeof(METARECORD
) - 2 + sizeof(LOGFONT16
)];
176 METARECORD
*mr
= (METARECORD
*)&buffer
;
178 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(LOGFONT16
) - 2) / 2;
179 mr
->rdFunction
= META_CREATEFONTINDIRECT
;
180 memcpy(&(mr
->rdParm
), logfont
, sizeof(LOGFONT16
));
181 if (!(MFDRV_WriteRecord( dev
, mr
, mr
->rdSize
* 2))) return FALSE
;
183 mr
->rdSize
= sizeof(METARECORD
) / 2;
184 mr
->rdFunction
= META_SELECTOBJECT
;
186 if ((index
= MFDRV_AddHandleDC( dev
)) == -1) return FALSE
;
187 *(mr
->rdParm
) = index
;
188 return MFDRV_WriteRecord( dev
, mr
, mr
->rdSize
* 2);
192 /***********************************************************************
195 HFONT
MFDRV_SelectFont( PHYSDEV dev
, HFONT hfont
)
199 if (!GetObject16( HFONT_16(hfont
), sizeof(lf16
), &lf16
)) return HGDI_ERROR
;
200 if (MFDRV_CreateFontIndirect(dev
, hfont
, &lf16
)) return 0;
204 /******************************************************************
205 * MFDRV_CreatePenIndirect
207 static BOOL
MFDRV_CreatePenIndirect(PHYSDEV dev
, HPEN hPen
, LOGPEN16
*logpen
)
210 char buffer
[sizeof(METARECORD
) - 2 + sizeof(*logpen
)];
211 METARECORD
*mr
= (METARECORD
*)&buffer
;
213 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(*logpen
) - 2) / 2;
214 mr
->rdFunction
= META_CREATEPENINDIRECT
;
215 memcpy(&(mr
->rdParm
), logpen
, sizeof(*logpen
));
216 if (!(MFDRV_WriteRecord( dev
, mr
, mr
->rdSize
* 2))) return FALSE
;
218 mr
->rdSize
= sizeof(METARECORD
) / 2;
219 mr
->rdFunction
= META_SELECTOBJECT
;
221 if ((index
= MFDRV_AddHandleDC( dev
)) == -1) return FALSE
;
222 *(mr
->rdParm
) = index
;
223 return MFDRV_WriteRecord( dev
, mr
, mr
->rdSize
* 2);
227 /***********************************************************************
230 HPEN
MFDRV_SelectPen( PHYSDEV dev
, HPEN hpen
)
234 if (!GetObject16( HPEN_16(hpen
), sizeof(logpen
), &logpen
)) return 0;
235 if (MFDRV_CreatePenIndirect( dev
, hpen
, &logpen
)) return hpen
;