4 * Copyright David W. Metcalfe, 1994
5 * Niels de Carpentier, Albrecht Kleine, Huw Davies 1996
16 #include "metafiledrv.h"
20 /******************************************************************
23 * Add a handle to an external handle table and return the index
26 static int MF_AddHandle(HANDLETABLE16
*ht
, WORD htlen
, HGDIOBJ16 hobj
)
30 for (i
= 0; i
< htlen
; i
++)
32 if (*(ht
->objectHandle
+ i
) == 0)
34 *(ht
->objectHandle
+ i
) = hobj
;
42 /******************************************************************
45 * Note: this function assumes that we never delete objects.
46 * If we do someday, we'll need to maintain a table to re-use deleted
49 static int MF_AddHandleDC( DC
*dc
)
51 METAFILEDRV_PDEVICE
*physDev
= (METAFILEDRV_PDEVICE
*)dc
->physDev
;
52 physDev
->mh
->mtNoObjects
++;
53 return physDev
->nextHandle
++;
57 /******************************************************************
58 * GetMetafile16 (GDI.124)
60 HMETAFILE16
GetMetaFile16( LPCSTR lpFilename
)
62 return GetMetaFile32A( lpFilename
);
66 /******************************************************************
67 * GetMetafile32A (GDI32.197)
69 HMETAFILE32
GetMetaFile32A( LPCSTR lpFilename
)
76 dprintf_metafile(stddeb
,"GetMetaFile: %s\n", lpFilename
);
81 hmf
= GlobalAlloc16(GMEM_MOVEABLE
, MFHEADERSIZE
);
82 mh
= (METAHEADER
*)GlobalLock16(hmf
);
90 if ((hFile
= _lopen32(lpFilename
, OF_READ
)) == HFILE_ERROR32
)
96 if (_lread32(hFile
, (char *)mh
, MFHEADERSIZE
) == HFILE_ERROR32
)
103 size
= mh
->mtSize
* 2; /* alloc memory for whole metafile */
105 hmf
= GlobalReAlloc16(hmf
,size
,GMEM_MOVEABLE
);
106 mh
= (METAHEADER
*)GlobalLock16(hmf
);
115 if (_lread32(hFile
, (char*)mh
+ mh
->mtHeaderSize
* 2,
116 size
- mh
->mtHeaderSize
* 2) == HFILE_ERROR32
)
137 /******************************************************************
138 * GetMetafile32W (GDI32.199)
140 HMETAFILE32
GetMetaFile32W( LPCWSTR lpFilename
)
142 LPSTR p
= HEAP_strdupWtoA( GetProcessHeap(), 0, lpFilename
);
143 HMETAFILE32 ret
= GetMetaFile32A( p
);
144 HeapFree( GetProcessHeap(), 0, p
);
149 /******************************************************************
150 * CopyMetaFile16 (GDI.151)
153 HMETAFILE16
CopyMetaFile16( HMETAFILE16 hSrcMetaFile
, LPCSTR lpFilename
)
155 return CopyMetaFile32A( hSrcMetaFile
, lpFilename
);
159 /******************************************************************
160 * CopyMetaFile32A (GDI32.23)
162 HMETAFILE32
CopyMetaFile32A( HMETAFILE32 hSrcMetaFile
, LPCSTR lpFilename
)
164 HMETAFILE16 handle
= 0;
169 dprintf_metafile(stddeb
,"CopyMetaFile: %s\n", lpFilename
);
171 mh
= (METAHEADER
*)GlobalLock16(hSrcMetaFile
);
176 if (lpFilename
) /* disk based metafile */
179 hFile
= _lcreat32(lpFilename
, 0);
181 mh
->mtType
=1; /* disk file version stores 1 here */
182 i
=_lwrite32(hFile
, (char *)mh
, mh
->mtSize
* 2) ;
183 mh
->mtType
=j
; /* restore old value [0 or 1] */
187 /* FIXME: return value */
189 else /* memory based metafile */
191 handle
= GlobalAlloc16(GMEM_MOVEABLE
,mh
->mtSize
* 2);
192 mh2
= (METAHEADER
*)GlobalLock16(handle
);
193 memcpy(mh2
,mh
, mh
->mtSize
* 2);
194 GlobalUnlock16(handle
);
201 /******************************************************************
202 * CopyMetaFile32W (GDI32.24)
204 HMETAFILE32
CopyMetaFile32W( HMETAFILE32 hSrcMetaFile
, LPCWSTR lpFilename
)
206 LPSTR p
= HEAP_strdupWtoA( GetProcessHeap(), 0, lpFilename
);
207 HMETAFILE32 ret
= CopyMetaFile32A( hSrcMetaFile
, p
);
208 HeapFree( GetProcessHeap(), 0, p
);
213 /******************************************************************
214 * IsValidMetaFile (GDI.410)
215 * (This is not exactly what windows does, see "Undoc Win")
218 BOOL16
IsValidMetaFile(HMETAFILE16 hmf
)
221 METAHEADER
*mh
= (METAHEADER
*)GlobalLock16(hmf
);
223 if (mh
->mtType
== 1 || mh
->mtType
== 0)
224 if (mh
->mtHeaderSize
== MFHEADERSIZE
/sizeof(INT16
))
225 if (mh
->mtVersion
== MFVERSION
)
229 dprintf_metafile(stddeb
,"IsValidMetaFile %x => %d\n",hmf
,resu
);
234 /******************************************************************
235 * PlayMetafile16 (GDI.123)
237 BOOL16
PlayMetaFile16( HDC16 hdc
, HMETAFILE16 hmf
)
239 return PlayMetaFile32( hdc
, hmf
);
243 /******************************************************************
244 * PlayMetafile32 (GDI32.265)
246 BOOL32
PlayMetaFile32( HDC32 hdc
, HMETAFILE32 hmf
)
248 METAHEADER
*mh
= (METAHEADER
*)GlobalLock16(hmf
);
259 dprintf_metafile(stddeb
,"PlayMetaFile(%04x %04x)\n",hdc
,hmf
);
261 if (!(dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
))) return 0;
263 hBrush
= dc
->w
.hBrush
;
266 /* create the handle table */
267 hHT
= GlobalAlloc16(GMEM_MOVEABLE
|GMEM_ZEROINIT
,
268 sizeof(HANDLETABLE16
) * mh
->mtNoObjects
);
269 ht
= (HANDLETABLE16
*)GlobalLock16(hHT
);
271 /* loop through metafile playing records */
272 offset
= mh
->mtHeaderSize
* 2;
273 while (offset
< mh
->mtSize
* 2)
275 mr
= (METARECORD
*)((char *)mh
+ offset
);
276 dprintf_metafile(stddeb
,"offset = %04x size = %08lx function = %04x\n",
277 offset
,mr
->rdSize
,mr
->rdFunction
);
278 offset
+= mr
->rdSize
* 2;
279 PlayMetaFileRecord16( hdc
, ht
, mr
, mh
->mtNoObjects
);
282 SelectObject32(hdc
, hBrush
);
283 SelectObject32(hdc
, hPen
);
284 SelectObject32(hdc
, hFont
);
286 /* free objects in handle table */
287 for(i
= 0; i
< mh
->mtNoObjects
; i
++)
288 if(*(ht
->objectHandle
+ i
) != 0)
289 DeleteObject32(*(ht
->objectHandle
+ i
));
291 /* free handle table */
298 /******************************************************************
299 * EnumMetaFile16 (GDI.175)
300 * Niels de carpentier, april 1996
302 BOOL16
EnumMetaFile16( HDC16 hdc
, HMETAFILE16 hmf
, MFENUMPROC16 lpEnumFunc
,
305 METAHEADER
*mh
= (METAHEADER
*)GlobalLock16(hmf
);
311 dprintf_metafile(stddeb
,"EnumMetaFile(%04x, %04x, %08lx, %08lx)\n",
312 hdc
, hmf
, (DWORD
)lpEnumFunc
, lpData
);
314 /* create the handle table */
316 hHT
= GlobalAlloc16(GMEM_MOVEABLE
| GMEM_ZEROINIT
,
317 sizeof(HANDLETABLE16
) * mh
->mtNoObjects
);
318 ht
= WIN16_GlobalLock16(hHT
);
320 offset
= mh
->mtHeaderSize
* 2;
322 /* loop through metafile records */
324 spRecord
= WIN16_GlobalLock16(hmf
);
325 while (offset
< (mh
->mtSize
* 2))
327 mr
= (METARECORD
*)((char *)mh
+ offset
);
328 if (!lpEnumFunc( hdc
, (HANDLETABLE16
*)ht
,
329 (METARECORD
*)((UINT32
)spRecord
+ offset
),
330 mh
->mtNoObjects
, (LONG
)lpData
))
333 offset
+= (mr
->rdSize
* 2);
336 /* free handle table */
343 /******************************************************************
344 * PlayMetaFileRecord16 (GDI.176)
346 void PlayMetaFileRecord16( HDC16 hdc
, HANDLETABLE16
*ht
, METARECORD
*mr
,
352 BITMAPINFOHEADER
*infohdr
;
354 dprintf_metafile(stddeb
,"PlayMetaFileRecord(%04x %08lx %08lx %04x)\n",
355 hdc
,(LONG
)ht
, (LONG
)mr
, nHandles
);
357 switch (mr
->rdFunction
)
362 case META_DELETEOBJECT
:
363 DeleteObject32(*(ht
->objectHandle
+ *(mr
->rdParam
)));
364 *(ht
->objectHandle
+ *(mr
->rdParam
)) = 0;
367 case META_SETBKCOLOR
:
368 SetBkColor16(hdc
, MAKELONG(*(mr
->rdParam
), *(mr
->rdParam
+ 1)));
372 SetBkMode16(hdc
, *(mr
->rdParam
));
375 case META_SETMAPMODE
:
376 SetMapMode16(hdc
, *(mr
->rdParam
));
380 SetROP216(hdc
, *(mr
->rdParam
));
384 SetRelAbs16(hdc
, *(mr
->rdParam
));
387 case META_SETPOLYFILLMODE
:
388 SetPolyFillMode16(hdc
, *(mr
->rdParam
));
391 case META_SETSTRETCHBLTMODE
:
392 SetStretchBltMode16(hdc
, *(mr
->rdParam
));
394 case META_SETTEXTCOLOR
:
395 SetTextColor16(hdc
, MAKELONG(*(mr
->rdParam
), *(mr
->rdParam
+ 1)));
398 case META_SETWINDOWORG
:
399 SetWindowOrg(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
402 case META_SETWINDOWEXT
:
403 SetWindowExt(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
406 case META_SETVIEWPORTORG
:
407 SetViewportOrg(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
410 case META_SETVIEWPORTEXT
:
411 SetViewportExt(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
414 case META_OFFSETWINDOWORG
:
415 OffsetWindowOrg(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
418 case META_SCALEWINDOWEXT
:
419 ScaleWindowExt(hdc
, *(mr
->rdParam
+ 3), *(mr
->rdParam
+ 2),
420 *(mr
->rdParam
+ 1), *(mr
->rdParam
));
423 case META_OFFSETVIEWPORTORG
:
424 OffsetViewportOrg(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
427 case META_SCALEVIEWPORTEXT
:
428 ScaleViewportExt(hdc
, *(mr
->rdParam
+ 3), *(mr
->rdParam
+ 2),
429 *(mr
->rdParam
+ 1), *(mr
->rdParam
));
433 LineTo32(hdc
, (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
437 MoveTo(hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
));
440 case META_EXCLUDECLIPRECT
:
441 ExcludeClipRect16( hdc
, *(mr
->rdParam
+ 3), *(mr
->rdParam
+ 2),
442 *(mr
->rdParam
+ 1), *(mr
->rdParam
) );
445 case META_INTERSECTCLIPRECT
:
446 IntersectClipRect16( hdc
, *(mr
->rdParam
+ 3), *(mr
->rdParam
+ 2),
447 *(mr
->rdParam
+ 1), *(mr
->rdParam
) );
451 Arc32(hdc
, (INT16
)*(mr
->rdParam
+ 7), (INT16
)*(mr
->rdParam
+ 6),
452 (INT16
)*(mr
->rdParam
+ 5), (INT16
)*(mr
->rdParam
+ 4),
453 (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
454 (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
458 Ellipse32(hdc
, (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
459 (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
463 FloodFill32(hdc
, (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
464 MAKELONG(*(mr
->rdParam
), *(mr
->rdParam
+ 1)));
468 Pie32(hdc
, (INT16
)*(mr
->rdParam
+ 7), (INT16
)*(mr
->rdParam
+ 6),
469 (INT16
)*(mr
->rdParam
+ 5), (INT16
)*(mr
->rdParam
+ 4),
470 (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
471 (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
475 Rectangle32(hdc
, (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
476 (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
480 RoundRect32(hdc
, (INT16
)*(mr
->rdParam
+ 5), (INT16
)*(mr
->rdParam
+ 4),
481 (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
482 (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
486 PatBlt16(hdc
, *(mr
->rdParam
+ 5), *(mr
->rdParam
+ 4),
487 *(mr
->rdParam
+ 3), *(mr
->rdParam
+ 2),
488 MAKELONG(*(mr
->rdParam
), *(mr
->rdParam
+ 1)));
496 SetPixel32(hdc
, (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
497 MAKELONG(*(mr
->rdParam
), *(mr
->rdParam
+ 1)));
500 case META_OFFSETCLIPRGN
:
501 OffsetClipRgn16( hdc
, *(mr
->rdParam
+ 1), *(mr
->rdParam
) );
506 TextOut16(hdc
, *(mr
->rdParam
+ ((s1
+ 1) >> 1) + 2),
507 *(mr
->rdParam
+ ((s1
+ 1) >> 1) + 1),
508 (char *)(mr
->rdParam
+ 1), s1
);
512 Polygon16(hdc
, (LPPOINT16
)(mr
->rdParam
+ 1), *(mr
->rdParam
));
515 case META_POLYPOLYGON
:
516 PolyPolygon16(hdc
, (LPPOINT16
)(mr
->rdParam
+ *(mr
->rdParam
) + 1),
517 (LPINT16
)(mr
->rdParam
+ 1), *(mr
->rdParam
));
521 Polyline16(hdc
, (LPPOINT16
)(mr
->rdParam
+ 1), *(mr
->rdParam
));
525 RestoreDC32(hdc
, (INT16
)*(mr
->rdParam
));
528 case META_SELECTOBJECT
:
529 SelectObject32(hdc
, *(ht
->objectHandle
+ *(mr
->rdParam
)));
533 Chord32(hdc
, (INT16
)*(mr
->rdParam
+ 7), (INT16
)*(mr
->rdParam
+ 6),
534 (INT16
)*(mr
->rdParam
+5), (INT16
)*(mr
->rdParam
+ 4),
535 (INT16
)*(mr
->rdParam
+ 3), (INT16
)*(mr
->rdParam
+ 2),
536 (INT16
)*(mr
->rdParam
+ 1), (INT16
)*(mr
->rdParam
));
539 case META_CREATEPATTERNBRUSH
:
540 switch (*(mr
->rdParam
))
543 infohdr
= (BITMAPINFOHEADER
*)(mr
->rdParam
+ 2);
544 MF_AddHandle(ht
, nHandles
,
545 CreatePatternBrush32(CreateBitmap32(infohdr
->biWidth
,
549 (LPSTR
)(mr
->rdParam
+
550 (sizeof(BITMAPINFOHEADER
) / 2) + 4))));
554 s1
= mr
->rdSize
* 2 - sizeof(METARECORD
) - 2;
555 hndl
= GlobalAlloc16(GMEM_MOVEABLE
, s1
);
556 ptr
= GlobalLock16(hndl
);
557 memcpy(ptr
, mr
->rdParam
+ 2, s1
);
558 GlobalUnlock16(hndl
);
559 MF_AddHandle(ht
, nHandles
,
560 CreateDIBPatternBrush32(hndl
, *(mr
->rdParam
+ 1)));
565 case META_CREATEPENINDIRECT
:
566 MF_AddHandle(ht
, nHandles
,
567 CreatePenIndirect16((LOGPEN16
*)(&(mr
->rdParam
))));
570 case META_CREATEFONTINDIRECT
:
571 MF_AddHandle(ht
, nHandles
,
572 CreateFontIndirect16((LOGFONT16
*)(&(mr
->rdParam
))));
575 case META_CREATEBRUSHINDIRECT
:
576 MF_AddHandle(ht
, nHandles
,
577 CreateBrushIndirect16((LOGBRUSH16
*)(&(mr
->rdParam
))));
580 /* W. Magro: Some new metafile operations. Not all debugged. */
581 case META_CREATEPALETTE
:
582 MF_AddHandle(ht
, nHandles
,
583 CreatePalette16((LPLOGPALETTE
)mr
->rdParam
));
586 case META_SETTEXTALIGN
:
587 SetTextAlign16(hdc
, *(mr
->rdParam
));
590 case META_SELECTPALETTE
:
591 SelectPalette16(hdc
, *(ht
->objectHandle
+ *(mr
->rdParam
+1)),*(mr
->rdParam
));
594 case META_SETMAPPERFLAGS
:
595 SetMapperFlags16(hdc
, *(mr
->rdParam
));
598 case META_REALIZEPALETTE
:
599 RealizePalette16(hdc
);
603 dprintf_metafile(stddeb
,"PlayMetaFileRecord: META_ESCAPE unimplemented.\n");
606 /* --- Begin of fixed or new metafile operations. July 1996 ----*/
607 case META_EXTTEXTOUT
:
612 s1
= mr
->rdParam
[2]; /* String length */
613 len
= sizeof(METARECORD
) + (((s1
+ 1) >> 1) * 2) + 2 * sizeof(short)
614 + sizeof(UINT16
) + sizeof(RECT16
);
615 if (mr
->rdSize
== len
/ 2)
616 dxx
= NULL
; /* No array present */
617 else if (mr
->rdSize
== (len
+ s1
* sizeof(INT16
)) / 2)
618 dxx
= &mr
->rdParam
[8+(s1
+1)/2]; /* start of array */
621 "PlayMetaFileRecord ExtTextOut mr->rdSize = %08lx, count = %x\n",
625 ExtTextOut16( hdc
, mr
->rdParam
[1], /* X position */
626 mr
->rdParam
[0], /* Y position */
627 mr
->rdParam
[3], /* options */
628 (LPRECT16
) &mr
->rdParam
[4], /* rectangle */
629 (char *)(mr
->rdParam
+ 8), /* string */
630 s1
, dxx
); /* length, dx array */
632 dprintf_metafile(stddeb
,"EXTTEXTOUT len: %ld (%hd %hd) [%s].\n",
633 mr
->rdSize
,dxx
[0],dxx
[1],(char*) &(mr
->rdParam
[8]) );
637 case META_STRETCHDIB
:
639 LPBITMAPINFO info
= (LPBITMAPINFO
) &(mr
->rdParam
[11]);
640 LPSTR bits
= (LPSTR
)info
+ DIB_BitmapInfoSize( info
, mr
->rdParam
[2] );
641 StretchDIBits16(hdc
,mr
->rdParam
[10],mr
->rdParam
[9],mr
->rdParam
[8],
642 mr
->rdParam
[7],mr
->rdParam
[6],mr
->rdParam
[5],
643 mr
->rdParam
[4],mr
->rdParam
[3],bits
,info
,
644 mr
->rdParam
[2],MAKELONG(mr
->rdParam
[0],mr
->rdParam
[1]));
648 case META_DIBSTRETCHBLT
:
650 LPBITMAPINFO info
= (LPBITMAPINFO
) &(mr
->rdParam
[10]);
651 LPSTR bits
= (LPSTR
)info
+ DIB_BitmapInfoSize( info
, mr
->rdParam
[2] );
652 StretchDIBits16(hdc
,mr
->rdParam
[9],mr
->rdParam
[8],mr
->rdParam
[7],
653 mr
->rdParam
[6],mr
->rdParam
[5],mr
->rdParam
[4],
654 mr
->rdParam
[3],mr
->rdParam
[2],bits
,info
,
655 DIB_RGB_COLORS
,MAKELONG(mr
->rdParam
[0],mr
->rdParam
[1]));
659 case META_STRETCHBLT
:
661 HDC16 hdcSrc
=CreateCompatibleDC16(hdc
);
662 HBITMAP32 hbitmap
=CreateBitmap32(mr
->rdParam
[10], /*Width */
663 mr
->rdParam
[11], /*Height*/
664 mr
->rdParam
[13], /*Planes*/
665 mr
->rdParam
[14], /*BitsPixel*/
666 (LPSTR
)&mr
->rdParam
[15]); /*bits*/
667 SelectObject32(hdcSrc
,hbitmap
);
668 StretchBlt16(hdc
,mr
->rdParam
[9],mr
->rdParam
[8],
669 mr
->rdParam
[7],mr
->rdParam
[6],
670 hdcSrc
,mr
->rdParam
[5],mr
->rdParam
[4],
671 mr
->rdParam
[3],mr
->rdParam
[2],
672 MAKELONG(mr
->rdParam
[0],mr
->rdParam
[1]));
677 case META_BITBLT
: /* <-- not yet debugged */
679 HDC16 hdcSrc
=CreateCompatibleDC16(hdc
);
680 HBITMAP32 hbitmap
=CreateBitmap32(mr
->rdParam
[7]/*Width */,
681 mr
->rdParam
[8]/*Height*/,
682 mr
->rdParam
[10]/*Planes*/,
683 mr
->rdParam
[11]/*BitsPixel*/,
684 (LPSTR
)&mr
->rdParam
[12]/*bits*/);
685 SelectObject32(hdcSrc
,hbitmap
);
686 BitBlt32(hdc
,(INT16
)mr
->rdParam
[6],(INT16
)mr
->rdParam
[5],
687 (INT16
)mr
->rdParam
[4],(INT16
)mr
->rdParam
[3],
688 hdcSrc
, (INT16
)mr
->rdParam
[2],(INT16
)mr
->rdParam
[1],
689 MAKELONG(0,mr
->rdParam
[0]));
694 /* --- Begin of new metafile operations. April, 1997 (ak) ----*/
695 case META_CREATEREGION
:
698 HRGN32 h1
,h2
,hrgn
=CreateRectRgn32(mr
->rdParam
[7],mr
->rdParam
[8],
699 mr
->rdParam
[9],mr
->rdParam
[10]);
700 for (i
=0,h1
=CreateRectRgn32(0,0,0,0);i
<mr
->rdParam
[5];i
++)
702 if (mr
->rdParam
[11+i
*6]==2)
704 h2
=CreateRectRgn32(mr
->rdParam
[14+i
*6],mr
->rdParam
[12+i
*6],
705 mr
->rdParam
[15+i
*6],mr
->rdParam
[13+i
*6]);
706 CombineRgn32(hrgn
,h1
,h2
,mr
->rdParam
[16+i
*6]); /* e.g. RGN_OR */
710 MF_AddHandle(ht
, nHandles
,hrgn
);
714 case META_FILLREGION
:
715 FillRgn16(hdc
, *(ht
->objectHandle
+ *(mr
->rdParam
)),
716 *(ht
->objectHandle
+ *(mr
->rdParam
+1)));
719 case META_INVERTREGION
:
720 InvertRgn16(hdc
, *(ht
->objectHandle
+ *(mr
->rdParam
)));
723 case META_PAINTREGION
:
724 PaintRgn16(hdc
, *(ht
->objectHandle
+ *(mr
->rdParam
)));
727 case META_SELECTCLIPREGION
:
728 SelectClipRgn32(hdc
, *(ht
->objectHandle
+ *(mr
->rdParam
)));
731 case META_DIBCREATEPATTERNBRUSH
:
732 /* *(mr->rdParam) may be BS_PATTERN or BS_DIBPATTERN: but there's no difference */
733 dprintf_metafile(stddeb
,"META_DIBCREATEPATTERNBRUSH: %d\n",*(mr
->rdParam
));
734 s1
= mr
->rdSize
* 2 - sizeof(METARECORD
) - 2;
735 hndl
= GlobalAlloc16(GMEM_MOVEABLE
, s1
);
736 ptr
= GlobalLock16(hndl
);
737 memcpy(ptr
, mr
->rdParam
+ 2, s1
);
738 GlobalUnlock16(hndl
);
739 MF_AddHandle(ht
, nHandles
,CreateDIBPatternBrush16(hndl
, *(mr
->rdParam
+ 1)));
743 #define META_UNIMP(x) case x: fprintf(stderr,"PlayMetaFileRecord:record type "#x" not implemented.\n");break;
744 META_UNIMP(META_SETTEXTCHAREXTRA
)
745 META_UNIMP(META_SETTEXTJUSTIFICATION
)
746 META_UNIMP(META_FRAMEREGION
)
747 META_UNIMP(META_DRAWTEXT
)
748 META_UNIMP(META_SETDIBTODEV
)
749 META_UNIMP(META_ANIMATEPALETTE
)
750 META_UNIMP(META_SETPALENTRIES
)
751 META_UNIMP(META_RESIZEPALETTE
)
752 META_UNIMP(META_DIBBITBLT
)
753 META_UNIMP(META_EXTFLOODFILL
)
754 META_UNIMP(META_RESETDC
)
755 META_UNIMP(META_STARTDOC
)
756 META_UNIMP(META_STARTPAGE
)
757 META_UNIMP(META_ENDPAGE
)
758 META_UNIMP(META_ABORTDOC
)
759 META_UNIMP(META_ENDDOC
)
760 META_UNIMP(META_CREATEBRUSH
)
761 META_UNIMP(META_CREATEBITMAPINDIRECT
)
762 META_UNIMP(META_CREATEBITMAP
)
766 fprintf(stddeb
,"PlayMetaFileRecord: Unknown record type %x\n",
772 /******************************************************************
773 * GetMetaFileBits (GDI.159)
775 * Trade in a meta file object handle for a handle to the meta file memory
778 HGLOBAL16
GetMetaFileBits(HMETAFILE16 hmf
)
780 dprintf_metafile(stddeb
,"GetMetaFileBits: hMem out: %04x\n", hmf
);
785 /******************************************************************
786 * SetMetaFileBits (GDI.160)
788 * Trade in a meta file memory handle for a handle to a meta file object
790 HMETAFILE16
SetMetaFileBits( HGLOBAL16 hMem
)
792 dprintf_metafile(stddeb
,"SetMetaFileBits: hmf out: %04x\n", hMem
);
797 /******************************************************************
798 * SetMetaFileBitsBetter (GDI.196)
800 HMETAFILE16
SetMetaFileBitsBetter( HMETAFILE16 hMeta
)
802 if( IsValidMetaFile( hMeta
) )
803 return (HMETAFILE16
)GlobalReAlloc16( hMeta
, 0,
804 GMEM_SHARE
| GMEM_NODISCARD
| GMEM_MODIFY
);
805 return (HMETAFILE16
)0;
808 /******************************************************************
811 * Warning: this function can change the metafile handle.
814 static BOOL32
MF_WriteRecord( DC
*dc
, METARECORD
*mr
, WORD rlen
)
818 METAFILEDRV_PDEVICE
*physDev
= (METAFILEDRV_PDEVICE
*)dc
->physDev
;
820 switch(physDev
->mh
->mtType
)
822 case METAFILE_MEMORY
:
823 len
= physDev
->mh
->mtSize
* 2 + rlen
;
824 mh
= HeapReAlloc( SystemHeap
, 0, physDev
->mh
, len
);
825 if (!mh
) return FALSE
;
827 memcpy((WORD
*)physDev
->mh
+ physDev
->mh
->mtSize
, mr
, rlen
);
830 dprintf_metafile(stddeb
,"Writing record to disk\n");
831 if (_lwrite32(physDev
->mh
->mtNoParameters
, (char *)mr
, rlen
) == -1)
835 fprintf( stderr
, "Unknown metafile type %d\n", physDev
->mh
->mtType
);
839 physDev
->mh
->mtSize
+= rlen
/ 2;
840 physDev
->mh
->mtMaxRecord
= MAX(physDev
->mh
->mtMaxRecord
, rlen
/ 2);
845 /******************************************************************
849 BOOL32
MF_MetaParam0(DC
*dc
, short func
)
852 METARECORD
*mr
= (METARECORD
*)&buffer
;
855 mr
->rdFunction
= func
;
856 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
860 /******************************************************************
863 BOOL32
MF_MetaParam1(DC
*dc
, short func
, short param1
)
866 METARECORD
*mr
= (METARECORD
*)&buffer
;
869 mr
->rdFunction
= func
;
870 *(mr
->rdParam
) = param1
;
871 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
875 /******************************************************************
878 BOOL32
MF_MetaParam2(DC
*dc
, short func
, short param1
, short param2
)
881 METARECORD
*mr
= (METARECORD
*)&buffer
;
884 mr
->rdFunction
= func
;
885 *(mr
->rdParam
) = param2
;
886 *(mr
->rdParam
+ 1) = param1
;
887 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
891 /******************************************************************
895 BOOL32
MF_MetaParam4(DC
*dc
, short func
, short param1
, short param2
,
896 short param3
, short param4
)
899 METARECORD
*mr
= (METARECORD
*)&buffer
;
902 mr
->rdFunction
= func
;
903 *(mr
->rdParam
) = param4
;
904 *(mr
->rdParam
+ 1) = param3
;
905 *(mr
->rdParam
+ 2) = param2
;
906 *(mr
->rdParam
+ 3) = param1
;
907 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
911 /******************************************************************
915 BOOL32
MF_MetaParam6(DC
*dc
, short func
, short param1
, short param2
,
916 short param3
, short param4
, short param5
, short param6
)
919 METARECORD
*mr
= (METARECORD
*)&buffer
;
922 mr
->rdFunction
= func
;
923 *(mr
->rdParam
) = param6
;
924 *(mr
->rdParam
+ 1) = param5
;
925 *(mr
->rdParam
+ 2) = param4
;
926 *(mr
->rdParam
+ 3) = param3
;
927 *(mr
->rdParam
+ 4) = param2
;
928 *(mr
->rdParam
+ 5) = param1
;
929 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
933 /******************************************************************
936 BOOL32
MF_MetaParam8(DC
*dc
, short func
, short param1
, short param2
,
937 short param3
, short param4
, short param5
,
938 short param6
, short param7
, short param8
)
941 METARECORD
*mr
= (METARECORD
*)&buffer
;
944 mr
->rdFunction
= func
;
945 *(mr
->rdParam
) = param8
;
946 *(mr
->rdParam
+ 1) = param7
;
947 *(mr
->rdParam
+ 2) = param6
;
948 *(mr
->rdParam
+ 3) = param5
;
949 *(mr
->rdParam
+ 4) = param4
;
950 *(mr
->rdParam
+ 5) = param3
;
951 *(mr
->rdParam
+ 6) = param2
;
952 *(mr
->rdParam
+ 7) = param1
;
953 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
957 /******************************************************************
958 * MF_CreateBrushIndirect
961 BOOL32
MF_CreateBrushIndirect(DC
*dc
, HBRUSH16 hBrush
, LOGBRUSH16
*logbrush
)
964 char buffer
[sizeof(METARECORD
) - 2 + sizeof(*logbrush
)];
965 METARECORD
*mr
= (METARECORD
*)&buffer
;
967 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(*logbrush
) - 2) / 2;
968 mr
->rdFunction
= META_CREATEBRUSHINDIRECT
;
969 memcpy(&(mr
->rdParam
), logbrush
, sizeof(*logbrush
));
970 if (!(MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
972 mr
->rdSize
= sizeof(METARECORD
) / 2;
973 mr
->rdFunction
= META_SELECTOBJECT
;
975 if ((index
= MF_AddHandleDC( dc
)) == -1) return FALSE
;
976 *(mr
->rdParam
) = index
;
977 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
981 /******************************************************************
982 * MF_CreatePatternBrush
985 BOOL32
MF_CreatePatternBrush(DC
*dc
, HBRUSH16 hBrush
, LOGBRUSH16
*logbrush
)
987 DWORD len
, bmSize
, biSize
;
992 BITMAPINFOHEADER
*infohdr
;
994 char buffer
[sizeof(METARECORD
)];
996 switch (logbrush
->lbStyle
)
999 bmp
= (BITMAPOBJ
*)GDI_GetObjPtr((HGDIOBJ16
)logbrush
->lbHatch
, BITMAP_MAGIC
);
1000 if (!bmp
) return FALSE
;
1001 len
= sizeof(METARECORD
) + sizeof(BITMAPINFOHEADER
) +
1002 (bmp
->bitmap
.bmHeight
* bmp
->bitmap
.bmWidthBytes
) + 6;
1003 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1005 mr
= (METARECORD
*)GlobalLock16(hmr
);
1007 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
1008 mr
->rdSize
= len
/ 2;
1009 *(mr
->rdParam
) = logbrush
->lbStyle
;
1010 *(mr
->rdParam
+ 1) = DIB_RGB_COLORS
;
1011 infohdr
= (BITMAPINFOHEADER
*)(mr
->rdParam
+ 2);
1012 infohdr
->biSize
= sizeof(BITMAPINFOHEADER
);
1013 infohdr
->biWidth
= bmp
->bitmap
.bmWidth
;
1014 infohdr
->biHeight
= bmp
->bitmap
.bmHeight
;
1015 infohdr
->biPlanes
= bmp
->bitmap
.bmPlanes
;
1016 infohdr
->biBitCount
= bmp
->bitmap
.bmBitsPixel
;
1017 memcpy(mr
->rdParam
+ (sizeof(BITMAPINFOHEADER
) / 2) + 4,
1018 PTR_SEG_TO_LIN(bmp
->bitmap
.bmBits
),
1019 bmp
->bitmap
.bmHeight
* bmp
->bitmap
.bmWidthBytes
);
1023 info
= (BITMAPINFO
*)GlobalLock16((HGLOBAL16
)logbrush
->lbHatch
);
1024 if (info
->bmiHeader
.biCompression
)
1025 bmSize
= info
->bmiHeader
.biSizeImage
;
1027 bmSize
= (info
->bmiHeader
.biWidth
* info
->bmiHeader
.biBitCount
1028 + 31) / 32 * 8 * info
->bmiHeader
.biHeight
;
1029 biSize
= DIB_BitmapInfoSize(info
, LOWORD(logbrush
->lbColor
));
1030 len
= sizeof(METARECORD
) + biSize
+ bmSize
+ 2;
1031 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1033 mr
= (METARECORD
*)GlobalLock16(hmr
);
1035 mr
->rdFunction
= META_DIBCREATEPATTERNBRUSH
;
1036 mr
->rdSize
= len
/ 2;
1037 *(mr
->rdParam
) = logbrush
->lbStyle
;
1038 *(mr
->rdParam
+ 1) = LOWORD(logbrush
->lbColor
);
1039 memcpy(mr
->rdParam
+ 2, info
, biSize
+ bmSize
);
1044 if (!(MF_WriteRecord(dc
, mr
, len
)))
1052 mr
= (METARECORD
*)&buffer
;
1053 mr
->rdSize
= sizeof(METARECORD
) / 2;
1054 mr
->rdFunction
= META_SELECTOBJECT
;
1056 if ((index
= MF_AddHandleDC( dc
)) == -1) return FALSE
;
1057 *(mr
->rdParam
) = index
;
1058 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
1062 /******************************************************************
1063 * MF_CreatePenIndirect
1066 BOOL32
MF_CreatePenIndirect(DC
*dc
, HPEN16 hPen
, LOGPEN16
*logpen
)
1069 char buffer
[sizeof(METARECORD
) - 2 + sizeof(*logpen
)];
1070 METARECORD
*mr
= (METARECORD
*)&buffer
;
1072 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(*logpen
) - 2) / 2;
1073 mr
->rdFunction
= META_CREATEPENINDIRECT
;
1074 memcpy(&(mr
->rdParam
), logpen
, sizeof(*logpen
));
1075 if (!(MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
1077 mr
->rdSize
= sizeof(METARECORD
) / 2;
1078 mr
->rdFunction
= META_SELECTOBJECT
;
1080 if ((index
= MF_AddHandleDC( dc
)) == -1) return FALSE
;
1081 *(mr
->rdParam
) = index
;
1082 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
1086 /******************************************************************
1087 * MF_CreateFontIndirect
1090 BOOL32
MF_CreateFontIndirect(DC
*dc
, HFONT16 hFont
, LOGFONT16
*logfont
)
1093 char buffer
[sizeof(METARECORD
) - 2 + sizeof(LOGFONT16
)];
1094 METARECORD
*mr
= (METARECORD
*)&buffer
;
1096 mr
->rdSize
= (sizeof(METARECORD
) + sizeof(LOGFONT16
) - 2) / 2;
1097 mr
->rdFunction
= META_CREATEFONTINDIRECT
;
1098 memcpy(&(mr
->rdParam
), logfont
, sizeof(LOGFONT16
));
1099 if (!(MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2))) return FALSE
;
1101 mr
->rdSize
= sizeof(METARECORD
) / 2;
1102 mr
->rdFunction
= META_SELECTOBJECT
;
1104 if ((index
= MF_AddHandleDC( dc
)) == -1) return FALSE
;
1105 *(mr
->rdParam
) = index
;
1106 return MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
1110 /******************************************************************
1113 BOOL32
MF_TextOut(DC
*dc
, short x
, short y
, LPCSTR str
, short count
)
1120 len
= sizeof(METARECORD
) + (((count
+ 1) >> 1) * 2) + 4;
1121 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1123 mr
= (METARECORD
*)GlobalLock16(hmr
);
1126 mr
->rdSize
= len
/ 2;
1127 mr
->rdFunction
= META_TEXTOUT
;
1128 *(mr
->rdParam
) = count
;
1129 memcpy(mr
->rdParam
+ 1, str
, count
);
1130 *(mr
->rdParam
+ ((count
+ 1) >> 1) + 1) = y
;
1131 *(mr
->rdParam
+ ((count
+ 1) >> 1) + 2) = x
;
1132 ret
= MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
1137 /******************************************************************
1140 BOOL32
MF_ExtTextOut(DC
*dc
, short x
, short y
, UINT16 flags
, const RECT16
*rect
,
1141 LPCSTR str
, short count
, const INT16
*lpDx
)
1148 len
= sizeof(METARECORD
) + (((count
+ 1) >> 1) * 2) + 2 * sizeof(short)
1149 + sizeof(UINT16
) + sizeof(RECT16
);
1151 len
+=count
*sizeof(INT16
);
1152 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1154 mr
= (METARECORD
*)GlobalLock16(hmr
);
1157 mr
->rdSize
= len
/ 2;
1158 mr
->rdFunction
= META_EXTTEXTOUT
;
1160 *(mr
->rdParam
+ 1) = x
;
1161 *(mr
->rdParam
+ 2) = count
;
1162 *(mr
->rdParam
+ 3) = flags
;
1163 if (rect
) memcpy(mr
->rdParam
+ 4, rect
, sizeof(RECT16
));
1164 memcpy(mr
->rdParam
+ 8, str
, count
);
1166 memcpy(mr
->rdParam
+ 8+ ((count
+ 1) >> 1),lpDx
,count
*sizeof(INT16
));
1167 ret
= MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
1172 /******************************************************************
1173 * MF_MetaPoly - implements Polygon and Polyline
1175 BOOL32
MF_MetaPoly(DC
*dc
, short func
, LPPOINT16 pt
, short count
)
1182 len
= sizeof(METARECORD
) + (count
* 4);
1183 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1185 mr
= (METARECORD
*)GlobalLock16(hmr
);
1188 mr
->rdSize
= len
/ 2;
1189 mr
->rdFunction
= func
;
1190 *(mr
->rdParam
) = count
;
1191 memcpy(mr
->rdParam
+ 1, pt
, count
* 4);
1192 ret
= MF_WriteRecord( dc
, mr
, mr
->rdSize
* 2);
1198 /******************************************************************
1201 BOOL32
MF_BitBlt(DC
*dcDest
, short xDest
, short yDest
, short width
,
1202 short height
, DC
*dcSrc
, short xSrc
, short ySrc
, DWORD rop
)
1210 GetObject16(dcSrc
->w
.hBitmap
, sizeof(BITMAP16
), &BM
);
1211 len
= sizeof(METARECORD
) + 12 * sizeof(INT16
) + BM
.bmWidthBytes
* BM
.bmHeight
;
1212 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1214 mr
= (METARECORD
*)GlobalLock16(hmr
);
1215 mr
->rdFunction
= META_BITBLT
;
1216 *(mr
->rdParam
+ 7) = BM
.bmWidth
;
1217 *(mr
->rdParam
+ 8) = BM
.bmHeight
;
1218 *(mr
->rdParam
+ 9) = BM
.bmWidthBytes
;
1219 *(mr
->rdParam
+10) = BM
.bmPlanes
;
1220 *(mr
->rdParam
+11) = BM
.bmBitsPixel
;
1221 dprintf_metafile(stddeb
,"MF_StretchBlt->len = %ld rop=%lx \n",len
,rop
);
1222 if (GetBitmapBits32(dcSrc
->w
.hBitmap
,BM
.bmWidthBytes
* BM
.bmHeight
,
1225 mr
->rdSize
= len
/ sizeof(INT16
);
1226 *(mr
->rdParam
) = HIWORD(rop
);
1227 *(mr
->rdParam
+ 1) = ySrc
;
1228 *(mr
->rdParam
+ 2) = xSrc
;
1229 *(mr
->rdParam
+ 3) = height
;
1230 *(mr
->rdParam
+ 4) = width
;
1231 *(mr
->rdParam
+ 5) = yDest
;
1232 *(mr
->rdParam
+ 6) = xDest
;
1233 ret
= MF_WriteRecord( dcDest
, mr
, mr
->rdSize
* 2);
1242 /**********************************************************************
1244 * this function contains TWO ways for procesing StretchBlt in metafiles,
1245 * decide between rdFunction values META_STRETCHBLT or META_DIBSTRETCHBLT
1246 * via #define STRETCH_VIA_DIB
1248 #define STRETCH_VIA_DIB
1249 #undef STRETCH_VIA_DIB
1250 BOOL32
MF_StretchBlt(DC
*dcDest
, short xDest
, short yDest
, short widthDest
,
1251 short heightDest
, DC
*dcSrc
, short xSrc
, short ySrc
,
1252 short widthSrc
, short heightSrc
, DWORD rop
)
1259 #ifdef STRETCH_VIA_DIB
1260 LPBITMAPINFOHEADER lpBMI
;
1263 GetObject16(dcSrc
->w
.hBitmap
, sizeof(BITMAP16
), &BM
);
1264 #ifdef STRETCH_VIA_DIB
1265 nBPP
= BM
.bmPlanes
* BM
.bmBitsPixel
;
1266 len
= sizeof(METARECORD
) + 10 * sizeof(INT16
)
1267 + sizeof(BITMAPINFOHEADER
) + (nBPP
!= 24 ? 1 << nBPP
: 0) * sizeof(RGBQUAD
)
1268 + ((BM
.bmWidth
* nBPP
+ 31) / 32) * 4 * BM
.bmHeight
;
1269 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1271 mr
= (METARECORD
*)GlobalLock16(hmr
);
1272 mr
->rdFunction
= META_DIBSTRETCHBLT
;
1273 lpBMI
=(LPBITMAPINFOHEADER
)(mr
->rdParam
+10);
1274 lpBMI
->biSize
= sizeof(BITMAPINFOHEADER
);
1275 lpBMI
->biWidth
= BM
.bmWidth
;
1276 lpBMI
->biHeight
= BM
.bmHeight
;
1277 lpBMI
->biPlanes
= 1;
1278 lpBMI
->biBitCount
= nBPP
; /* 1,4,8 or 24 */
1279 lpBMI
->biClrUsed
= nBPP
!= 24 ? 1 << nBPP
: 0;
1280 lpBMI
->biSizeImage
= ((lpBMI
->biWidth
* nBPP
+ 31) / 32) * 4 * lpBMI
->biHeight
;
1281 lpBMI
->biCompression
= BI_RGB
;
1282 lpBMI
->biXPelsPerMeter
= MulDiv32(GetDeviceCaps(dcSrc
->hSelf
,LOGPIXELSX
),3937,100);
1283 lpBMI
->biYPelsPerMeter
= MulDiv32(GetDeviceCaps(dcSrc
->hSelf
,LOGPIXELSY
),3937,100);
1284 lpBMI
->biClrImportant
= 0; /* 1 meter = 39.37 inch */
1286 dprintf_metafile(stddeb
,"MF_StretchBltViaDIB->len = %ld rop=%lx PixYPM=%ld Caps=%d\n",
1287 len
,rop
,lpBMI
->biYPelsPerMeter
,GetDeviceCaps(hdcSrc
,LOGPIXELSY
));
1288 if (GetDIBits(hdcSrc
,dcSrc
->w
.hBitmap
,0,(UINT32
)lpBMI
->biHeight
,
1289 (LPSTR
)lpBMI
+ DIB_BitmapInfoSize( (BITMAPINFO
*)lpBMI
,
1291 (LPBITMAPINFO
)lpBMI
, DIB_RGB_COLORS
))
1293 len
= sizeof(METARECORD
) + 15 * sizeof(INT16
) + BM
.bmWidthBytes
* BM
.bmHeight
;
1294 if (!(hmr
= GlobalAlloc16(GMEM_MOVEABLE
, len
)))
1296 mr
= (METARECORD
*)GlobalLock16(hmr
);
1297 mr
->rdFunction
= META_STRETCHBLT
;
1298 *(mr
->rdParam
+10) = BM
.bmWidth
;
1299 *(mr
->rdParam
+11) = BM
.bmHeight
;
1300 *(mr
->rdParam
+12) = BM
.bmWidthBytes
;
1301 *(mr
->rdParam
+13) = BM
.bmPlanes
;
1302 *(mr
->rdParam
+14) = BM
.bmBitsPixel
;
1303 dprintf_metafile(stddeb
,"MF_StretchBlt->len = %ld rop=%lx \n",len
,rop
);
1304 if (GetBitmapBits32( dcSrc
->w
.hBitmap
, BM
.bmWidthBytes
* BM
.bmHeight
,
1308 mr
->rdSize
= len
/ sizeof(INT16
);
1309 *(mr
->rdParam
) = LOWORD(rop
);
1310 *(mr
->rdParam
+ 1) = HIWORD(rop
);
1311 *(mr
->rdParam
+ 2) = heightSrc
;
1312 *(mr
->rdParam
+ 3) = widthSrc
;
1313 *(mr
->rdParam
+ 4) = ySrc
;
1314 *(mr
->rdParam
+ 5) = xSrc
;
1315 *(mr
->rdParam
+ 6) = heightDest
;
1316 *(mr
->rdParam
+ 7) = widthDest
;
1317 *(mr
->rdParam
+ 8) = yDest
;
1318 *(mr
->rdParam
+ 9) = xDest
;
1319 ret
= MF_WriteRecord( dcDest
, mr
, mr
->rdSize
* 2);