init.c
来自「Wine-20031016」· C语言 代码 · 共 588 行 · 第 1/2 页
C
588 行
/* Construct the end of metafile record - this is documented * in SDK Knowledgebase Q99334. */ if (!MFDRV_MetaParam0(dc->physDev, META_EOF)) { MFDRV_DeleteDC( dc->physDev ); return 0; } if (physDev->mh->mtType == METAFILE_DISK) /* disk based metafile */ { if (SetFilePointer(physDev->hFile, 0, NULL, FILE_BEGIN) != 0) { MFDRV_DeleteDC( dc->physDev ); return 0; } physDev->mh->mtType = METAFILE_MEMORY; /* This is what windows does */ if (!WriteFile(physDev->hFile, (LPSTR)physDev->mh, sizeof(*physDev->mh), NULL, NULL)) { MFDRV_DeleteDC( dc->physDev ); return 0; } CloseHandle(physDev->hFile); physDev->mh->mtType = METAFILE_DISK; } return dc;}/****************************************************************** * CloseMetaFile (GDI.126) */HMETAFILE16 WINAPI CloseMetaFile16( HDC16 hdc /* [in] Metafile DC to close */){ HMETAFILE16 hmf; METAFILEDRV_PDEVICE *physDev; DC *dc = MFDRV_CloseMetaFile(HDC_32(hdc)); if (!dc) return 0; physDev = (METAFILEDRV_PDEVICE *)dc->physDev; /* Now allocate a global handle for the metafile */ hmf = MF_Create_HMETAFILE16( physDev->mh ); physDev->mh = NULL; /* So it won't be deleted */ MFDRV_DeleteDC( dc->physDev ); return hmf;}/****************************************************************** * CloseMetaFile (GDI32.@) * * Stop recording graphics operations in metafile associated with * hdc and retrieve metafile. * * RETURNS * Handle of newly created metafile on success, NULL on failure. */HMETAFILE WINAPI CloseMetaFile( HDC hdc /* [in] Metafile DC to close */){ HMETAFILE hmf; METAFILEDRV_PDEVICE *physDev; DC *dc = MFDRV_CloseMetaFile(hdc); if (!dc) return 0; physDev = (METAFILEDRV_PDEVICE *)dc->physDev; /* Now allocate a global handle for the metafile */ hmf = MF_Create_HMETAFILE( physDev->mh ); physDev->mh = NULL; /* So it won't be deleted */ MFDRV_DeleteDC( dc->physDev ); return hmf;}/****************************************************************** * MFDRV_WriteRecord * * Warning: this function can change the pointer to the metafile header. */BOOL MFDRV_WriteRecord( PHYSDEV dev, METARECORD *mr, DWORD rlen){ DWORD len, size; METAHEADER *mh; METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dev; switch(physDev->mh->mtType) { case METAFILE_MEMORY: len = physDev->mh->mtSize * 2 + rlen; /* reallocate memory if needed */ size = HeapSize( GetProcessHeap(), 0, physDev->mh ); if (len > size) { /*expand size*/ size += size / 2 + rlen; mh = HeapReAlloc( GetProcessHeap(), 0, physDev->mh, size); if (!mh) return FALSE; physDev->mh = mh; TRACE("Reallocated metafile: new size is %ld\n",size); } memcpy((WORD *)physDev->mh + physDev->mh->mtSize, mr, rlen); break; case METAFILE_DISK: TRACE("Writing record to disk\n"); if (!WriteFile(physDev->hFile, (char *)mr, rlen, NULL, NULL)) return FALSE; break; default: ERR("Unknown metafile type %d\n", physDev->mh->mtType ); return FALSE; } physDev->mh->mtSize += rlen / 2; physDev->mh->mtMaxRecord = max(physDev->mh->mtMaxRecord, rlen / 2); return TRUE;}/****************************************************************** * MFDRV_MetaParam0 */BOOL MFDRV_MetaParam0(PHYSDEV dev, short func){ char buffer[8]; METARECORD *mr = (METARECORD *)&buffer; mr->rdSize = 3; mr->rdFunction = func; return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);}/****************************************************************** * MFDRV_MetaParam1 */BOOL MFDRV_MetaParam1(PHYSDEV dev, short func, short param1){ char buffer[8]; METARECORD *mr = (METARECORD *)&buffer; mr->rdSize = 4; mr->rdFunction = func; *(mr->rdParm) = param1; return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);}/****************************************************************** * MFDRV_MetaParam2 */BOOL MFDRV_MetaParam2(PHYSDEV dev, short func, short param1, short param2){ char buffer[10]; METARECORD *mr = (METARECORD *)&buffer; mr->rdSize = 5; mr->rdFunction = func; *(mr->rdParm) = param2; *(mr->rdParm + 1) = param1; return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);}/****************************************************************** * MFDRV_MetaParam4 */BOOL MFDRV_MetaParam4(PHYSDEV dev, short func, short param1, short param2, short param3, short param4){ char buffer[14]; METARECORD *mr = (METARECORD *)&buffer; mr->rdSize = 7; mr->rdFunction = func; *(mr->rdParm) = param4; *(mr->rdParm + 1) = param3; *(mr->rdParm + 2) = param2; *(mr->rdParm + 3) = param1; return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);}/****************************************************************** * MFDRV_MetaParam6 */BOOL MFDRV_MetaParam6(PHYSDEV dev, short func, short param1, short param2, short param3, short param4, short param5, short param6){ char buffer[18]; METARECORD *mr = (METARECORD *)&buffer; mr->rdSize = 9; mr->rdFunction = func; *(mr->rdParm) = param6; *(mr->rdParm + 1) = param5; *(mr->rdParm + 2) = param4; *(mr->rdParm + 3) = param3; *(mr->rdParm + 4) = param2; *(mr->rdParm + 5) = param1; return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);}/****************************************************************** * MFDRV_MetaParam8 */BOOL MFDRV_MetaParam8(PHYSDEV dev, short func, short param1, short param2, short param3, short param4, short param5, short param6, short param7, short param8){ char buffer[22]; METARECORD *mr = (METARECORD *)&buffer; mr->rdSize = 11; mr->rdFunction = func; *(mr->rdParm) = param8; *(mr->rdParm + 1) = param7; *(mr->rdParm + 2) = param6; *(mr->rdParm + 3) = param5; *(mr->rdParm + 4) = param4; *(mr->rdParm + 5) = param3; *(mr->rdParm + 6) = param2; *(mr->rdParm + 7) = param1; return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);}/****************************************************************** * MFDRV_AddHandleDC * * Note: this function assumes that we never delete objects. * If we do someday, we'll need to maintain a table to re-use deleted * handles. */int MFDRV_AddHandleDC( PHYSDEV dev ){ METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dev; physDev->mh->mtNoObjects++; return physDev->nextHandle++;}/********************************************************************** * MFDRV_ExtEscape */INT MFDRV_ExtEscape( PHYSDEV dev, INT nEscape, INT cbInput, LPCVOID in_data, INT cbOutput, LPVOID out_data ){ METARECORD *mr; DWORD len; INT ret; len = sizeof(*mr) + sizeof(WORD) + ((cbInput + 1) & ~1); mr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); mr->rdSize = len / 2; mr->rdFunction = META_ESCAPE; mr->rdParm[0] = nEscape; mr->rdParm[1] = cbInput; memcpy(&(mr->rdParm[2]), in_data, cbInput); ret = MFDRV_WriteRecord( dev, mr, len); HeapFree(GetProcessHeap(), 0, mr); return ret;}/****************************************************************** * MFDRV_GetDeviceCaps * *A very simple implementation that returns DT_METAFILE */INT MFDRV_GetDeviceCaps(PHYSDEV dev, INT cap){ switch(cap) { case TECHNOLOGY: return DT_METAFILE; case TEXTCAPS: return 0; default: TRACE(" unsupported capability %d, will return 0\n", cap ); } return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?