mirror of
https://github.com/reactos/reactos.git
synced 2024-07-11 15:15:27 +00:00
Started CreateMetaFile, port from wine. Made changes to the structures. Added new support routines.
svn path=/trunk/; revision=28172
This commit is contained in:
parent
e8847e55ed
commit
dfd772ea97
|
@ -35,12 +35,12 @@ typedef INT
|
|||
|
||||
/* TYPES *********************************************************************/
|
||||
|
||||
// Based on wmfapi.h and Wine. This is the DC_ATTR for a MetaDC file.
|
||||
// Based on wmfapi.h and Wine.
|
||||
typedef struct tagMETAFILEDC {
|
||||
PVOID pvMetaBuffer;
|
||||
HANDLE hFile;
|
||||
DWORD Size;
|
||||
PMETAHEADER mf;
|
||||
METAHEADER mh;
|
||||
UINT handles_size, cur_handles;
|
||||
HGDIOBJ *handles;
|
||||
|
||||
|
@ -49,9 +49,17 @@ typedef struct tagMETAFILEDC {
|
|||
HGDIOBJ Brush;
|
||||
HGDIOBJ Palette;
|
||||
HGDIOBJ Font;
|
||||
|
||||
WCHAR Filename[MAX_PATH+2];
|
||||
// Add more later.
|
||||
} METAFILEDC,*PMETAFILEDC;
|
||||
|
||||
// Metafile Entry handle
|
||||
typedef struct tagMF_ENTRY {
|
||||
LIST_ENTRY List;
|
||||
HGDIOBJ hmDC; // Handle return from NtGdiCreateClientObj.
|
||||
PMETAFILEDC pmfDC;
|
||||
} MF_ENTRY, *PMF_ENTRY;
|
||||
|
||||
typedef struct tagENHMETAFILE {
|
||||
PVOID pvMetaBuffer;
|
||||
|
|
|
@ -33,37 +33,7 @@ CancelDC(
|
|||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
HMETAFILE
|
||||
STDCALL
|
||||
CloseMetaFile(
|
||||
HDC a0
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
STDCALL
|
||||
DeleteMetaFile(
|
||||
HMETAFILE a0
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
|
|
|
@ -1,5 +1,94 @@
|
|||
#include "precomp.h"
|
||||
|
||||
/* DEFINES *******************************************************************/
|
||||
|
||||
|
||||
/* PRIVATE DATA **************************************************************/
|
||||
|
||||
PMF_ENTRY hMF_List = NULL;
|
||||
DWORD hMFCount = 0;
|
||||
|
||||
/* INTERNAL FUNCTIONS ********************************************************/
|
||||
|
||||
BOOL
|
||||
MF_CreateMFDC ( HGDIOBJ hMDC,
|
||||
PMETAFILEDC pmfDC )
|
||||
{
|
||||
PMF_ENTRY pMFME;
|
||||
|
||||
pMFME = LocalAlloc(LMEM_ZEROINIT, sizeof(MF_ENTRY));
|
||||
if (!pMFME)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (hMF_List == NULL)
|
||||
{
|
||||
hMF_List = pMFME;
|
||||
InitializeListHead(&hMF_List->List);
|
||||
}
|
||||
else
|
||||
InsertTailList(&hMF_List->List, &pMFME->List);
|
||||
|
||||
pMFME->hmDC = hMDC;
|
||||
pMFME->pmfDC = pmfDC;
|
||||
|
||||
hMFCount++;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
PMETAFILEDC
|
||||
MF_GetMFDC ( HGDIOBJ hMDC )
|
||||
{
|
||||
PMF_ENTRY pMFME = hMF_List;
|
||||
|
||||
do
|
||||
{
|
||||
if ( pMFME->hmDC == hMDC ) return pMFME->pmfDC;
|
||||
pMFME = (PMF_ENTRY) pMFME->List.Flink;
|
||||
}
|
||||
while ( pMFME != hMF_List );
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
MF_DeleteMFDC ( HGDIOBJ hMDC )
|
||||
{
|
||||
PMF_ENTRY pMFME = hMF_List;
|
||||
|
||||
do
|
||||
{
|
||||
if ( pMFME->hmDC == hMDC)
|
||||
{
|
||||
RemoveEntryList(&pMFME->List);
|
||||
LocalFree ( pMFME );
|
||||
hMFCount--;
|
||||
return TRUE;
|
||||
}
|
||||
pMFME = (PMF_ENTRY) pMFME->List.Flink;
|
||||
}
|
||||
while ( pMFME != hMF_List );
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
HMETAFILE
|
||||
STDCALL
|
||||
CloseMetaFile(
|
||||
HDC a0
|
||||
)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
|
@ -34,8 +123,7 @@ CopyMetaFileA(
|
|||
SetLastError (RtlNtStatusToDosError(Status));
|
||||
else
|
||||
{
|
||||
|
||||
rc = NULL;
|
||||
rc = CopyMetaFileW( hmfSrc, lpszFileW );
|
||||
HEAP_free ( lpszFileW );
|
||||
}
|
||||
|
||||
|
@ -52,7 +140,50 @@ CreateMetaFileW(
|
|||
LPCWSTR lpszFile
|
||||
)
|
||||
{
|
||||
return NULL;
|
||||
HANDLE hFile;
|
||||
HDC hmDC;
|
||||
PMETAFILEDC pmfDC = LocalAlloc(LMEM_ZEROINIT, sizeof(METAFILEDC));
|
||||
if (!pmfDC) return NULL;
|
||||
|
||||
pmfDC->mh.mtHeaderSize = sizeof(METAHEADER) / sizeof(WORD);
|
||||
pmfDC->mh.mtVersion = 0x0300;
|
||||
pmfDC->mh.mtSize = pmfDC->mh.mtHeaderSize;
|
||||
|
||||
if (lpszFile) /* disk based metafile */
|
||||
{
|
||||
pmfDC->mh.mtType = METAFILE_DISK;
|
||||
|
||||
if(!GetFullPathName( lpszFile,
|
||||
MAX_PATH,
|
||||
(LPTSTR) &pmfDC->Filename,
|
||||
(LPTSTR*) &lpszFile))
|
||||
{
|
||||
// MFDRV_DeleteDC( dc->physDev );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((hFile = CreateFileW(pmfDC->Filename, GENERIC_WRITE, 0, NULL,
|
||||
CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
// MFDRV_DeleteDC( dc->physDev );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!WriteFile( hFile, &pmfDC->mh, sizeof(pmfDC->mh), NULL, NULL ))
|
||||
{
|
||||
// MFDRV_DeleteDC( dc->physDev );
|
||||
return NULL;
|
||||
}
|
||||
pmfDC->hFile = hFile;
|
||||
}
|
||||
else /* memory based metafile */
|
||||
pmfDC->mh.mtType = METAFILE_MEMORY;
|
||||
|
||||
hmDC = NtGdiCreateClientObj ( GDI_OBJECT_TYPE_METADC );
|
||||
|
||||
MF_CreateMFDC ( hmDC, pmfDC );
|
||||
|
||||
return hmDC;
|
||||
}
|
||||
|
||||
|
||||
|
@ -74,14 +205,26 @@ CreateMetaFileA(
|
|||
SetLastError (RtlNtStatusToDosError(Status));
|
||||
else
|
||||
{
|
||||
rc = NULL;
|
||||
|
||||
rc = CreateMetaFileW( lpszFileW );
|
||||
HEAP_free ( lpszFileW );
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @unimplemented
|
||||
*/
|
||||
BOOL
|
||||
STDCALL
|
||||
DeleteMetaFile(
|
||||
HMETAFILE a0
|
||||
)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
|
@ -113,8 +256,7 @@ GetMetaFileA(
|
|||
SetLastError (RtlNtStatusToDosError(Status));
|
||||
else
|
||||
{
|
||||
rc = NULL;
|
||||
|
||||
rc = GetMetaFileW( lpszMetaFileW );
|
||||
HEAP_free ( lpszMetaFileW );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue