Started CreateMetaFile, port from wine. Made changes to the structures. Added new support routines.

svn path=/trunk/; revision=28172
This commit is contained in:
James Tabor 2007-08-05 09:21:00 +00:00
parent e8847e55ed
commit dfd772ea97
3 changed files with 160 additions and 40 deletions

View file

@ -35,12 +35,12 @@ typedef INT
/* TYPES *********************************************************************/ /* 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 { typedef struct tagMETAFILEDC {
PVOID pvMetaBuffer; PVOID pvMetaBuffer;
HANDLE hFile; HANDLE hFile;
DWORD Size; DWORD Size;
PMETAHEADER mf; METAHEADER mh;
UINT handles_size, cur_handles; UINT handles_size, cur_handles;
HGDIOBJ *handles; HGDIOBJ *handles;
@ -49,9 +49,17 @@ typedef struct tagMETAFILEDC {
HGDIOBJ Brush; HGDIOBJ Brush;
HGDIOBJ Palette; HGDIOBJ Palette;
HGDIOBJ Font; HGDIOBJ Font;
WCHAR Filename[MAX_PATH+2];
// Add more later. // Add more later.
} METAFILEDC,*PMETAFILEDC; } 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 { typedef struct tagENHMETAFILE {
PVOID pvMetaBuffer; PVOID pvMetaBuffer;

View file

@ -33,37 +33,7 @@ CancelDC(
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE; 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 * @unimplemented

View file

@ -1,5 +1,94 @@
#include "precomp.h" #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 * @implemented
@ -34,8 +123,7 @@ CopyMetaFileA(
SetLastError (RtlNtStatusToDosError(Status)); SetLastError (RtlNtStatusToDosError(Status));
else else
{ {
rc = CopyMetaFileW( hmfSrc, lpszFileW );
rc = NULL;
HEAP_free ( lpszFileW ); HEAP_free ( lpszFileW );
} }
@ -52,7 +140,50 @@ CreateMetaFileW(
LPCWSTR lpszFile 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)); SetLastError (RtlNtStatusToDosError(Status));
else else
{ {
rc = NULL; rc = CreateMetaFileW( lpszFileW );
HEAP_free ( lpszFileW ); HEAP_free ( lpszFileW );
} }
return rc; return rc;
} }
/*
* @unimplemented
*/
BOOL
STDCALL
DeleteMetaFile(
HMETAFILE a0
)
{
return FALSE;
}
/* /*
* @implemented * @implemented
*/ */
@ -113,8 +256,7 @@ GetMetaFileA(
SetLastError (RtlNtStatusToDosError(Status)); SetLastError (RtlNtStatusToDosError(Status));
else else
{ {
rc = NULL; rc = GetMetaFileW( lpszMetaFileW );
HEAP_free ( lpszMetaFileW ); HEAP_free ( lpszMetaFileW );
} }