/************************************************************************ * DrawDibBegin [MSVIDEO.104] */ BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc, INT16 dySrc, UINT16 wFlags) { return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi, dxSrc, dySrc, wFlags); }
/****************************************************************** * PlayMetaFile (GDI.123) * */ BOOL16 WINAPI PlayMetaFile16( HDC16 hdc, HMETAFILE16 hmf16 ) { HMETAFILE hmf = create_metafile32( hmf16 ); BOOL ret = PlayMetaFile( HDC_32(hdc), hmf ); DeleteMetaFile( hmf ); return ret; }
/*********************************************************************** * ExcludeVisRect (GDI.73) */ INT16 WINAPI ExcludeVisRect16( HDC16 hdc16, INT16 left, INT16 top, INT16 right, INT16 bottom ) { HRGN tempRgn; INT16 ret; POINT pt[2]; HDC hdc = HDC_32( hdc16 ); DC * dc = get_dc_ptr( hdc ); if (!dc) return ERROR; pt[0].x = left; pt[0].y = top; pt[1].x = right; pt[1].y = bottom; LPtoDP( hdc, pt, 2 ); TRACE("%p %d,%d - %d,%d\n", hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y); if (!(tempRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR; else { update_dc( dc ); ret = CombineRgn( dc->hVisRgn, dc->hVisRgn, tempRgn, RGN_DIFF ); DeleteObject( tempRgn ); } if (ret != ERROR) CLIPPING_UpdateGCRegion( dc ); release_dc_ptr( dc ); return ret; }
/*********************************************************************** * IntersectVisRect (GDI.98) */ INT16 WINAPI IntersectVisRect16( HDC16 hdc16, INT16 left, INT16 top, INT16 right, INT16 bottom ) { HRGN tempRgn; INT16 ret; POINT pt[2]; HDC hdc = HDC_32( hdc16 ); DC * dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; pt[0].x = left; pt[0].y = top; pt[1].x = right; pt[1].y = bottom; LPtoDP( hdc, pt, 2 ); TRACE("%p %ld,%ld - %ld,%ld\n", hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y); if (!(tempRgn = CreateRectRgn( pt[0].x, pt[0].y, pt[1].x, pt[1].y ))) ret = ERROR; else { ret = CombineRgn( dc->hVisRgn, dc->hVisRgn, tempRgn, RGN_AND ); DeleteObject( tempRgn ); } if (ret != ERROR) CLIPPING_UpdateGCRegion( dc ); GDI_ReleaseObj( hdc ); return ret; }
static void CFn_CHOOSEFONT16to32W(LPCHOOSEFONT16 chf16, LPCHOOSEFONTW chf32w) { int len; if (chf16->Flags & CF_ENABLETEMPLATE) { len = MultiByteToWideChar( CP_ACP, 0, MapSL(chf16->lpTemplateName), -1, NULL, 0); chf32w->lpTemplateName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); MultiByteToWideChar( CP_ACP, 0, MapSL(chf16->lpTemplateName), -1, (LPWSTR)chf32w->lpTemplateName, len); } if (chf16->Flags & CF_USESTYLE) { len = MultiByteToWideChar( CP_ACP, 0, MapSL(chf16->lpszStyle), -1, NULL, 0); chf32w->lpszStyle = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); MultiByteToWideChar( CP_ACP, 0, MapSL(chf16->lpszStyle), -1, chf32w->lpszStyle, len); } chf32w->lStructSize=sizeof(CHOOSEFONTW); chf32w->hwndOwner=HWND_32(chf16->hwndOwner); chf32w->hDC=HDC_32(chf16->hDC); chf32w->iPointSize=chf16->iPointSize; chf32w->Flags=chf16->Flags; chf32w->rgbColors=chf16->rgbColors; chf32w->lCustData=chf16->lCustData; chf32w->lpfnHook=NULL; chf32w->hInstance=HINSTANCE_32(chf16->hInstance); chf32w->nFontType=chf16->nFontType; chf32w->nSizeMax=chf16->nSizeMax; chf32w->nSizeMin=chf16->nSizeMin; FONT_LogFont16To32W(MapSL(chf16->lpLogFont), chf32w->lpLogFont); }
/********************************************************************** * DrawDibDraw [MSVIDEO.106] */ BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst, INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi, LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc, INT16 dySrc, UINT16 wFlags) { return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst, dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags); }
/*********************************************************************** * OffsetVisRgn (GDI.102) */ INT16 WINAPI OffsetVisRgn16( HDC16 hdc16, INT16 x, INT16 y ) { INT16 retval; HDC hdc = HDC_32( hdc16 ); DC * dc = DC_GetDCUpdate( hdc ); if (!dc) return ERROR; TRACE("%p %d,%d\n", hdc, x, y ); retval = OffsetRgn( dc->hVisRgn, x, y ); CLIPPING_UpdateGCRegion( dc ); GDI_ReleaseObj( hdc ); return retval; }
/*********************************************************************** * OffsetVisRgn (GDI.102) */ INT16 WINAPI OffsetVisRgn16( HDC16 hdc16, INT16 x, INT16 y ) { INT16 retval; HDC hdc = HDC_32( hdc16 ); DC * dc = get_dc_ptr( hdc ); if (!dc) return ERROR; TRACE("%p %d,%d\n", hdc, x, y ); update_dc( dc ); retval = OffsetRgn( dc->hVisRgn, x, y ); CLIPPING_UpdateGCRegion( dc ); release_dc_ptr( dc ); return retval; }
/*********************************************************************** * SelectVisRgn (GDI.105) */ INT16 WINAPI SelectVisRgn16( HDC16 hdc16, HRGN16 hrgn ) { int retval; HDC hdc = HDC_32( hdc16 ); DC * dc; if (!hrgn) return ERROR; if (!(dc = DC_GetDCPtr( hdc ))) return ERROR; TRACE("%p %04x\n", hdc, hrgn ); dc->flags &= ~DC_DIRTY; retval = CombineRgn( dc->hVisRgn, HRGN_32(hrgn), 0, RGN_COPY ); CLIPPING_UpdateGCRegion( dc ); GDI_ReleaseObj( hdc ); return retval; }
/*********************************************************************** * SaveVisRgn (GDI.129) */ HRGN16 WINAPI SaveVisRgn16( HDC16 hdc16 ) { struct saved_visrgn *saved; HDC hdc = HDC_32( hdc16 ); DC *dc = DC_GetDCUpdate( hdc ); if (!dc) return 0; TRACE("%p\n", hdc ); if (!(saved = HeapAlloc( GetProcessHeap(), 0, sizeof(*saved) ))) goto error; if (!(saved->hrgn = CreateRectRgn( 0, 0, 0, 0 ))) goto error; CombineRgn( saved->hrgn, dc->hVisRgn, 0, RGN_COPY ); saved->next = dc->saved_visrgn; dc->saved_visrgn = saved; GDI_ReleaseObj( hdc ); return HRGN_16(saved->hrgn); error: GDI_ReleaseObj( hdc ); HeapFree( GetProcessHeap(), 0, saved ); return 0; }
/*********************************************************************** * RestoreVisRgn (GDI.130) */ INT16 WINAPI RestoreVisRgn16( HDC16 hdc16 ) { struct saved_visrgn *saved; HDC hdc = HDC_32( hdc16 ); DC *dc = get_dc_ptr( hdc ); INT16 ret = ERROR; if (!dc) return ERROR; TRACE("%p\n", hdc ); if (!(saved = dc->saved_visrgn)) goto done; ret = CombineRgn( dc->hVisRgn, saved->hrgn, 0, RGN_COPY ); dc->saved_visrgn = saved->next; DeleteObject( saved->hrgn ); HeapFree( GetProcessHeap(), 0, saved ); CLIPPING_UpdateGCRegion( dc ); done: release_dc_ptr( dc ); return ret; }
/****************************************************************** * MSVIDEO_MapMsg16To32 * * */ static LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) { LPVOID ret = 0; TRACE("Mapping %d\n", msg); switch (msg) { case DRV_LOAD: case DRV_ENABLE: case DRV_CLOSE: case DRV_DISABLE: case DRV_FREE: case ICM_ABOUT: case ICM_CONFIGURE: case ICM_COMPRESS_END: case ICM_DECOMPRESS_END: case ICM_DECOMPRESSEX_END: case ICM_SETQUALITY: case ICM_DRAW_START_PLAY: case ICM_DRAW_STOP_PLAY: case ICM_DRAW_REALIZE: case ICM_DRAW_RENDERBUFFER: case ICM_DRAW_END: break; case DRV_OPEN: case ICM_GETDEFAULTQUALITY: case ICM_GETQUALITY: case ICM_SETSTATE: case ICM_DRAW_WINDOW: case ICM_GETBUFFERSWANTED: *lParam1 = (DWORD)MapSL(*lParam1); break; case ICM_GETINFO: { ICINFO *ici = HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO)); ICINFO16 *ici16; ici16 = MapSL(*lParam1); ret = ici16; ici->dwSize = sizeof(ICINFO); COPY(ici, fccType); COPY(ici, fccHandler); COPY(ici, dwFlags); COPY(ici, dwVersion); COPY(ici, dwVersionICM); MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 ); MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 ); MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 ); *lParam1 = (DWORD)(ici); *lParam2 = sizeof(ICINFO); } break; case ICM_COMPRESS: { ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS)); ICCOMPRESS *icc16; icc16 = MapSL(*lParam1); ret = icc16; COPY(icc, dwFlags); COPYPTR(icc, lpbiOutput); COPYPTR(icc, lpOutput); COPYPTR(icc, lpbiInput); COPYPTR(icc, lpInput); COPYPTR(icc, lpckid); COPYPTR(icc, lpdwFlags); COPY(icc, lFrameNum); COPY(icc, dwFrameSize); COPY(icc, dwQuality); COPYPTR(icc, lpbiPrev); COPYPTR(icc, lpPrev); *lParam1 = (DWORD)(icc); *lParam2 = sizeof(ICCOMPRESS); } break; case ICM_DECOMPRESS: { ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); ICDECOMPRESS *icd16; /* Same structure except for the pointers */ icd16 = MapSL(*lParam1); ret = icd16; COPY(icd, dwFlags); COPYPTR(icd, lpbiInput); COPYPTR(icd, lpInput); COPYPTR(icd, lpbiOutput); COPYPTR(icd, lpOutput); COPY(icd, ckid); *lParam1 = (DWORD)(icd); *lParam2 = sizeof(ICDECOMPRESS); } break; case ICM_COMPRESS_BEGIN: case ICM_COMPRESS_GET_FORMAT: case ICM_COMPRESS_GET_SIZE: case ICM_COMPRESS_QUERY: case ICM_DECOMPRESS_GET_FORMAT: case ICM_DECOMPRESS_QUERY: case ICM_DECOMPRESS_BEGIN: case ICM_DECOMPRESS_SET_PALETTE: case ICM_DECOMPRESS_GET_PALETTE: *lParam1 = (DWORD)MapSL(*lParam1); *lParam2 = (DWORD)MapSL(*lParam2); break; case ICM_DECOMPRESSEX_QUERY: if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0)) WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16*)*lParam2); /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16) * This is because of ICMessage(). Special case it? { LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID)); addr[0] = MSVIDEO_MapICDEX16To32(lParam1); if (*lParam2) addr[1] = MSVIDEO_MapICDEX16To32(lParam2); else addr[1] = 0; ret = addr; } break;*/ case ICM_DECOMPRESSEX_BEGIN: case ICM_DECOMPRESSEX: ret = MSVIDEO_MapICDEX16To32(lParam1); *lParam2 = sizeof(ICDECOMPRESSEX); break; case ICM_DRAW_BEGIN: { ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN)); ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1); ret = icdb16; COPY(icdb, dwFlags); icdb->hpal = HPALETTE_32(icdb16->hpal); icdb->hwnd = HWND_32(icdb16->hwnd); icdb->hdc = HDC_32(icdb16->hdc); COPY(icdb, xDst); COPY(icdb, yDst); COPY(icdb, dxDst); COPY(icdb, dyDst); COPYPTR(icdb, lpbi); COPY(icdb, xSrc); COPY(icdb, ySrc); COPY(icdb, dxSrc); COPY(icdb, dySrc); COPY(icdb, dwRate); COPY(icdb, dwScale); *lParam1 = (DWORD)(icdb); *lParam2 = sizeof(ICDRAWBEGIN); } break; case ICM_DRAW_SUGGESTFORMAT: { ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST)); ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1); ret = icds16; COPY(icds, dwFlags); COPYPTR(icds, lpbiIn); COPYPTR(icds, lpbiSuggest); COPY(icds, dxSrc); COPY(icds, dySrc); COPY(icds, dxDst); COPY(icds, dyDst); icds->hicDecompressor = HIC_32(icds16->hicDecompressor); *lParam1 = (DWORD)(icds); *lParam2 = sizeof(ICDRAWSUGGEST); } break; case ICM_DRAW: { ICDRAW *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW)); ICDRAW *icd16 = MapSL(*lParam1); ret = icd16; COPY(icd, dwFlags); COPYPTR(icd, lpFormat); COPYPTR(icd, lpData); COPY(icd, cbData); COPY(icd, lTime); *lParam1 = (DWORD)(icd); *lParam2 = sizeof(ICDRAW); } break; case ICM_DRAW_START: case ICM_DRAW_STOP: break; default: FIXME("%d is not yet handled. Expect a crash.\n", msg); } return ret; }
/*********************************************************************** * DrawDibRealize [MSVIDEO.112] */ UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, BOOL16 fBackground) { return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground); }
/****************************************************************** * EnumMetaFile (GDI.175) * */ BOOL16 WINAPI EnumMetaFile16( HDC16 hdc16, HMETAFILE16 hmf, MFENUMPROC16 lpEnumFunc, LPARAM lpData ) { METAHEADER *mh = MF_GetMetaHeader16(hmf); METARECORD *mr; HANDLETABLE16 *ht; HDC hdc = HDC_32(hdc16); HGLOBAL16 hHT; SEGPTR spht; unsigned int offset = 0; WORD i, seg; HPEN hPen; HBRUSH hBrush; HFONT hFont; WORD args[8]; BOOL16 result = TRUE; TRACE("(%p, %04x, %p, %08lx)\n", hdc, hmf, lpEnumFunc, lpData); if(!mh) return FALSE; /* save the current pen, brush and font */ hPen = GetCurrentObject(hdc, OBJ_PEN); hBrush = GetCurrentObject(hdc, OBJ_BRUSH); hFont = GetCurrentObject(hdc, OBJ_FONT); /* create the handle table */ hHT = GlobalAlloc16(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(HANDLETABLE16) * mh->mtNoObjects); spht = WOWGlobalLock16(hHT); seg = hmf | 7; offset = mh->mtHeaderSize * 2; /* loop through metafile records */ args[7] = hdc16; args[6] = SELECTOROF(spht); args[5] = OFFSETOF(spht); args[4] = seg + (HIWORD(offset) << __AHSHIFT); args[3] = LOWORD(offset); args[2] = mh->mtNoObjects; args[1] = HIWORD(lpData); args[0] = LOWORD(lpData); while (offset < (mh->mtSize * 2)) { DWORD ret; mr = (METARECORD *)((char *)mh + offset); WOWCallback16Ex( (DWORD)lpEnumFunc, WCB16_PASCAL, sizeof(args), args, &ret ); if (!LOWORD(ret)) { result = FALSE; break; } offset += (mr->rdSize * 2); args[4] = seg + (HIWORD(offset) << __AHSHIFT); args[3] = LOWORD(offset); } SelectObject(hdc, hBrush); SelectObject(hdc, hPen); SelectObject(hdc, hFont); ht = GlobalLock16(hHT); /* free objects in handle table */ for(i = 0; i < mh->mtNoObjects; i++) if(*(ht->objectHandle + i) != 0) DeleteObject( (HGDIOBJ)(ULONG_PTR)(*(ht->objectHandle + i) )); /* free handle table */ GlobalFree16(hHT); MF_ReleaseMetaHeader16(hmf); return result; }
/****************************************************************** * CloseMetaFile (GDI.126) */ HMETAFILE16 WINAPI CloseMetaFile16(HDC16 hdc) { return create_metafile16( CloseMetaFile( HDC_32(hdc) )); }