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 + -
显示快捷键?