/* $Id$ * * reactos/lib/gdi32/misc/stubs.c * * GDI32.DLL Stubs for ANSI functions * * When you implement one of these functions, * remove its stub from this file. * */ #ifdef UNICODE #undef UNICODE #endif #undef WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include /* * @implemented */ int STDCALL AddFontResourceExA ( LPCSTR lpszFilename, DWORD fl, PVOID pvReserved ) { NTSTATUS Status; PWSTR FilenameW; int rc = 0; Status = HEAP_strdupA2W ( &FilenameW, lpszFilename ); if ( !NT_SUCCESS (Status) ) SetLastError (RtlNtStatusToDosError(Status)); else { rc = AddFontResourceExW ( FilenameW, fl, pvReserved ); HEAP_free ( &FilenameW ); } return rc; } /* * @implemented */ int STDCALL AddFontResourceA ( LPCSTR lpszFilename ) { return AddFontResourceExA ( lpszFilename, 0, 0 ); } /* * @implemented */ HMETAFILE STDCALL CopyMetaFileA( HMETAFILE Src, LPCSTR lpszFile ) { NTSTATUS Status; PWSTR lpszFileW; HMETAFILE rc = 0; Status = HEAP_strdupA2W ( &lpszFileW, lpszFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiCopyMetaFile ( Src, lpszFileW ); HEAP_free ( lpszFileW ); } return rc; } /* * @implemented */ HDC STDCALL CreateICA( LPCSTR lpszDriver, LPCSTR lpszDevice, LPCSTR lpszOutput, CONST DEVMODEA * lpdvmInit ) { NTSTATUS Status; LPWSTR lpszDriverW, lpszDeviceW, lpszOutputW; DEVMODEW dvmInitW; HDC rc = 0; Status = HEAP_strdupA2W ( &lpszDriverW, lpszDriver ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { Status = HEAP_strdupA2W ( &lpszDeviceW, lpszDevice ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { Status = HEAP_strdupA2W ( &lpszOutputW, lpszOutput ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { if ( lpdvmInit ) RosRtlDevModeA2W ( &dvmInitW, (const LPDEVMODEA)lpdvmInit ); rc = NtGdiCreateIC ( lpszDriverW, lpszDeviceW, lpszOutputW, lpdvmInit ? &dvmInitW : NULL ); HEAP_free ( lpszOutputW ); } HEAP_free ( lpszDeviceW ); } HEAP_free ( lpszDriverW ); } return rc; } /* * @implemented */ HDC STDCALL CreateMetaFileA( LPCSTR lpszFile ) { NTSTATUS Status; PWSTR lpszFileW; HDC rc = 0; Status = HEAP_strdupA2W ( &lpszFileW, lpszFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiCreateMetaFile ( lpszFileW ); HEAP_free ( lpszFileW ); } return rc; } /* * @implemented */ BOOL STDCALL CreateScalableFontResourceA( DWORD fdwHidden, LPCSTR lpszFontRes, LPCSTR lpszFontFile, LPCSTR lpszCurrentPath ) { NTSTATUS Status; LPWSTR lpszFontResW, lpszFontFileW, lpszCurrentPathW; BOOL rc = FALSE; Status = HEAP_strdupA2W ( &lpszFontResW, lpszFontRes ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { Status = HEAP_strdupA2W ( &lpszFontFileW, lpszFontFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { Status = HEAP_strdupA2W ( &lpszCurrentPathW, lpszCurrentPath ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiCreateScalableFontResource ( fdwHidden, lpszFontResW, lpszFontFileW, lpszCurrentPathW ); HEAP_free ( lpszCurrentPathW ); } HEAP_free ( lpszFontFileW ); } HEAP_free ( lpszFontResW ); } return rc; } /* * @unimplemented */ int STDCALL DeviceCapabilitiesExA( LPCSTR pDevice, LPCSTR pPort, WORD fwCapability, LPSTR pOutput, CONST DEVMODEA *pDevMode ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @unimplemented */ int STDCALL EnumFontFamiliesExA ( HDC hdc, LPLOGFONTA lpLogFont, FONTENUMEXPROCA lpEnumFontFamProc, LPARAM lParam, DWORD dwFlags ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; #if 0 LOGFONTW LogFontW; RosRtlLogFontA2W ( &LogFontW, lpLogFont ); /* no need to convert LogFontW back to lpLogFont b/c it's an [in] parameter only */ return NtGdiEnumFontFamiliesEx ( hdc, &LogFontW, lpEnumFontFamProc, lParam, dwFlags ); #endif } /* * @unimplemented */ int STDCALL EnumFontFamiliesA( HDC hdc, LPCSTR lpszFamily, FONTENUMPROCA lpEnumFontFamProc, LPARAM lParam ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; #if 0 NTSTATUS Status; LPWSTR lpszFamilyW; int rc = 0; Status = HEAP_strdupA2W ( &lpszFamilyW, lpszFamily ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiEnumFontFamilies ( hdc, lpszFamilyW, lpEnumFontFamProc, lParam ); HEAP_free ( lpszFamilyW ); } return rc; #endif } /* * @implemented */ int STDCALL EnumFontsA ( HDC hDC, LPCSTR lpFaceName, FONTENUMPROCA FontFunc, LPARAM lParam ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; #if 0 NTSTATUS Status; LPWSTR lpFaceNameW; int rc = 0; Status = HEAP_strdupA2W ( &lpFaceNameW, lpFaceName ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiEnumFonts ( hDC, lpFaceNameW, FontFunc, lParam ); HEAP_free ( lpFaceNameW ); } return rc; #endif } /* * @unimplemented */ BOOL STDCALL GetCharWidthA ( HDC hdc, UINT iFirstChar, UINT iLastChar, LPINT lpBuffer ) { /* FIXME what to do with iFirstChar and iLastChar ??? */ return NtGdiGetCharWidth ( hdc, iFirstChar, iLastChar, lpBuffer ); } /* * @unimplemented */ BOOL STDCALL GetCharWidth32A( HDC hdc, UINT iFirstChar, UINT iLastChar, LPINT lpBuffer ) { /* FIXME what to do with iFirstChar and iLastChar ??? */ return NtGdiGetCharWidth32 ( hdc, iFirstChar, iLastChar, lpBuffer ); } /* * @unimplemented */ BOOL APIENTRY GetCharWidthFloatA( HDC hdc, UINT iFirstChar, UINT iLastChar, PFLOAT pxBuffer ) { /* FIXME what to do with iFirstChar and iLastChar ??? */ return NtGdiGetCharWidthFloat ( hdc, iFirstChar, iLastChar, pxBuffer ); } /* * @unimplemented */ BOOL APIENTRY GetCharABCWidthsA( HDC hdc, UINT uFirstChar, UINT uLastChar, LPABC lpabc ) { /* FIXME what to do with uFirstChar and uLastChar ??? */ return NtGdiGetCharABCWidths ( hdc, uFirstChar, uLastChar, lpabc ); } /* * @unimplemented */ BOOL APIENTRY GetCharABCWidthsFloatA( HDC hdc, UINT iFirstChar, UINT iLastChar, LPABCFLOAT lpABCF ) { /* FIXME what to do with iFirstChar and iLastChar ??? */ return NtGdiGetCharABCWidthsFloat ( hdc, iFirstChar, iLastChar, lpABCF ); } /* * @implemented */ DWORD STDCALL GetGlyphOutlineA( HDC hdc, UINT uChar, UINT uFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpvBuffer, CONST MAT2 *lpmat2 ) { return NtGdiGetGlyphOutline ( hdc, uChar, uFormat, lpgm, cbBuffer, lpvBuffer, (CONST LPMAT2)lpmat2 ); } /* * @implemented */ HMETAFILE STDCALL GetMetaFileA( LPCSTR lpszMetaFile ) { NTSTATUS Status; LPWSTR lpszMetaFileW; HMETAFILE rc = 0; Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiGetMetaFile ( lpszMetaFileW ); HEAP_free ( lpszMetaFileW ); } return rc; } /* * @unimplemented */ UINT APIENTRY GetOutlineTextMetricsA( HDC hdc, UINT cbData, LPOUTLINETEXTMETRICA lpOTM ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @implemented */ BOOL APIENTRY GetTextExtentExPointA( HDC hdc, LPCSTR lpszStr, int cchString, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize ) { NTSTATUS Status; LPWSTR lpszStrW; BOOL rc = 0; Status = HEAP_strdupA2W ( &lpszStrW, lpszStr ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiGetTextExtentExPoint ( hdc, lpszStrW, cchString, nMaxExtent, lpnFit, alpDx, lpSize ); HEAP_free ( lpszStrW ); } return rc; } /* * @unimplemented */ DWORD STDCALL GetCharacterPlacementA( HDC hDc, LPCSTR a1, int a2, int a3, LPGCP_RESULTSA a4, DWORD a5 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @implemented */ HDC STDCALL ResetDCA( HDC hdc, CONST DEVMODEA *lpInitData ) { DEVMODEW InitDataW; RosRtlDevModeA2W ( &InitDataW, (CONST LPDEVMODEA)lpInitData ); return NtGdiResetDC ( hdc, &InitDataW ); } /* * @implemented */ BOOL STDCALL RemoveFontResourceA( LPCSTR lpFileName ) { NTSTATUS Status; LPWSTR lpFileNameW; BOOL rc = 0; Status = HEAP_strdupA2W ( &lpFileNameW, lpFileName ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiRemoveFontResource ( lpFileNameW ); HEAP_free ( lpFileNameW ); } return rc; } /* * @implemented */ HENHMETAFILE STDCALL CopyEnhMetaFileA( HENHMETAFILE hemfSrc, LPCSTR lpszFile ) { NTSTATUS Status; LPWSTR lpszFileW; HENHMETAFILE rc = 0; Status = HEAP_strdupA2W ( &lpszFileW, lpszFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiCopyEnhMetaFile ( hemfSrc, lpszFileW ); HEAP_free ( lpszFileW ); } return rc; } /* * @implemented */ HDC STDCALL CreateEnhMetaFileA( HDC hdc, LPCSTR lpFileName, CONST RECT *lpRect, LPCSTR lpDescription ) { NTSTATUS Status; LPWSTR lpFileNameW, lpDescriptionW; HDC rc = 0; Status = HEAP_strdupA2W ( &lpFileNameW, lpFileName ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { Status = HEAP_strdupA2W ( &lpDescriptionW, lpDescription ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiCreateEnhMetaFile ( hdc, lpFileNameW, (CONST LPRECT)lpRect, lpDescriptionW ); HEAP_free ( lpDescriptionW ); } HEAP_free ( lpFileNameW ); } return rc; } /* * @implemented */ HENHMETAFILE STDCALL GetEnhMetaFileA( LPCSTR lpszMetaFile ) { NTSTATUS Status; LPWSTR lpszMetaFileW; HENHMETAFILE rc = 0; Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile ); if (!NT_SUCCESS (Status)) SetLastError (RtlNtStatusToDosError(Status)); else { rc = NtGdiGetEnhMetaFile ( lpszMetaFileW ); HEAP_free ( lpszMetaFileW ); } return rc; } /* * @implemented */ UINT STDCALL GetEnhMetaFileDescriptionA( HENHMETAFILE hemf, UINT cchBuffer, LPSTR lpszDescription ) { NTSTATUS Status; LPWSTR lpszDescriptionW; UINT rc; if ( lpszDescription && cchBuffer ) { lpszDescriptionW = (LPWSTR)HEAP_alloc ( cchBuffer*sizeof(WCHAR) ); if ( !lpszDescriptionW ) { SetLastError (RtlNtStatusToDosError(STATUS_NO_MEMORY)); return 0; } } else lpszDescriptionW = NULL; rc = NtGdiGetEnhMetaFileDescription ( hemf, cchBuffer, lpszDescriptionW ); if ( lpszDescription && cchBuffer ) { Status = RtlUnicodeToMultiByteN ( lpszDescription, cchBuffer, NULL, lpszDescriptionW, cchBuffer ); HEAP_free ( lpszDescriptionW ); if ( !NT_SUCCESS(Status) ) { SetLastError (RtlNtStatusToDosError(Status)); return 0; } } return rc; } /* * @unimplemented */ int STDCALL StartDocA( HDC hdc, CONST DOCINFOA *a1 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @unimplemented */ int STDCALL GetObjectA( HGDIOBJ a0, int a1, LPVOID a2 ) { return NtGdiGetObject ( a0, a1, a2 ); } /* * @unimplemented */ BOOL STDCALL PolyTextOutA( HDC hdc, CONST POLYTEXTA *a1, int a2 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ int STDCALL GetTextFaceA( HDC a0, int a1, LPSTR a2 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ DWORD STDCALL GetKerningPairsA( HDC a0, DWORD a1, LPKERNINGPAIR a2 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @unimplemented */ BOOL STDCALL GetLogColorSpaceA( HCOLORSPACE a0, LPLOGCOLORSPACEA a1, DWORD a2 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ HCOLORSPACE STDCALL CreateColorSpaceA( LPLOGCOLORSPACEA a0 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @unimplemented */ WINBOOL STDCALL GetICMProfileA( HDC a0, DWORD a1, /* MS says LPDWORD! */ LPSTR a2 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ BOOL STDCALL SetICMProfileA( HDC a0, LPSTR a1 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ int STDCALL EnumICMProfilesA( HDC a0, ICMENUMPROCA a1, LPARAM a2 ) { /* * FIXME - call NtGdiEnumICMProfiles with NULL for lpstrBuffer * to find out how big a buffer we need. Then allocate that buffer * and call NtGdiEnumICMProfiles again to have the buffer filled. * * Finally, step through the buffer ( MULTI-SZ recommended for format ), * and convert each string to ANSI, calling the user's callback function * until we run out of strings or the user returns FALSE */ SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return 0; } /* * @unimplemented */ BOOL STDCALL wglUseFontBitmapsA( HDC a0, DWORD a1, DWORD a2, DWORD a3 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ BOOL STDCALL wglUseFontOutlinesA( HDC a0, DWORD a1, DWORD a2, DWORD a3, FLOAT a4, FLOAT a5, int a6, LPGLYPHMETRICSFLOAT a7 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* * @unimplemented */ WINBOOL STDCALL UpdateICMRegKeyA( DWORD a0, DWORD a1, LPSTR a2, UINT a3 ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } /* EOF */