[Win32SS|GDI] Implement seldom used API and update types for local DC's.

Two working in house application require these API. Known as FolCOL and Reach.
This commit is contained in:
James Tabor 2021-09-25 11:57:26 -05:00
parent a602bc3550
commit 970344bd16
8 changed files with 150 additions and 98 deletions

View File

@ -784,7 +784,7 @@ NtGdiCheckBitmapBits(
}
/*
* @unimplemented
* @implemented
*/
HBITMAP
APIENTRY
@ -792,7 +792,13 @@ NtGdiClearBitmapAttributes(
IN HBITMAP hbm,
IN DWORD dwFlags)
{
UNIMPLEMENTED;
if ( dwFlags & SC_BB_STOCKOBJ )
{
if (GDIOBJ_ConvertFromStockObj((HGDIOBJ*)&hbm))
{
return hbm;
}
}
return NULL;
}
@ -1406,7 +1412,7 @@ NtGdiMonoBitmap(
}
/*
* @unimplemented
* @implemented
*/
HBITMAP
APIENTRY
@ -1414,7 +1420,13 @@ NtGdiSetBitmapAttributes(
IN HBITMAP hbm,
IN DWORD dwFlags)
{
UNIMPLEMENTED;
if ( dwFlags & SC_BB_STOCKOBJ )
{
if (GDIOBJ_ConvertToStockObj((HGDIOBJ*)&hbm))
{
return hbm;
}
}
return NULL;
}

View File

@ -812,52 +812,23 @@ StretchDIBits(
DPRINT("StretchDIBits %p : %p : %u\n", lpBits, lpBitsInfo, iUsage);
#if 0
// Handle something other than a normal dc object.
if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC)
{
if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC)
return MFDRV_StretchBlt( hdc,
XDest,
YDest,
nDestWidth,
nDestHeight,
XSrc,
YSrc,
nSrcWidth,
nSrcHeight,
lpBits,
lpBitsInfo,
iUsage,
dwRop);
else
{
PLDC pLDC = GdiGetLDC(hdc);
if ( !pLDC )
{
SetLastError(ERROR_INVALID_HANDLE);
return 0;
}
if (pLDC->iType == LDC_EMFLDC)
{
return EMFDRV_StretchBlt(hdc,
XDest,
YDest,
nDestWidth,
nDestHeight,
XSrc,
YSrc,
nSrcWidth,
nSrcHeight,
lpBits,
lpBitsInfo,
iUsage,
dwRop);
}
return 0;
}
}
HANDLE_METADC( int,
StretchDIBits,
0,
hdc,
XDest,
YDest,
nDestWidth,
nDestHeight,
XSrc,
YSrc,
nSrcWidth,
nSrcHeight,
lpBits,
lpBitsInfo,
iUsage,
dwRop );
#endif
if ( GdiConvertAndCheckDC(hdc) == NULL ) return 0;
pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize,
@ -921,61 +892,45 @@ StretchDIBits(
}
/*
* @unimplemented
* @implemented
*/
DWORD
WINAPI
GetBitmapAttributes(HBITMAP hbm)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
if ( GDI_HANDLE_IS_STOCKOBJ(hbm) )
{
return SC_BB_STOCKOBJ;
}
return 0;
}
/*
* @unimplemented
* @implemented
*/
HBITMAP
WINAPI
SetBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
if ( dwFlags & ~SC_BB_STOCKOBJ )
{
return NULL;
}
return NtGdiSetBitmapAttributes( hbm, dwFlags );
}
/*
* @unimplemented
* @implemented
*/
HBITMAP
WINAPI
ClearBitmapAttributes(HBITMAP hbm, DWORD dwFlags)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
if ( dwFlags & ~SC_BB_STOCKOBJ )
{
return NULL;
}
return NtGdiClearBitmapAttributes( hbm, dwFlags );;
}
/*
* @unimplemented
*
*/
HBITMAP
WINAPI
GdiConvertBitmapV5(
HBITMAP in_format_BitMap,
HBITMAP src_BitMap,
INT bpp,
INT unuse)
{
/* FIXME guessing the prototypes */
/*
* it have create a new bitmap with desired in format,
* then convert it src_bitmap to new format
* and return it as HBITMAP
*/
return FALSE;
}

View File

@ -340,39 +340,45 @@ SetBrushOrgEx(HDC hdc,
}
/*
* @unimplemented
* @implemented
*/
DWORD
WINAPI
GetBrushAttributes(HBRUSH hbr)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
if ( GDI_HANDLE_IS_STOCKOBJ(hbr) )
{
return SC_BB_STOCKOBJ;
}
return 0;
}
/*
* @unimplemented
* @implemented
*/
HBRUSH
WINAPI
SetBrushAttributes(HBRUSH hbm, DWORD dwFlags)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
if ( dwFlags & ~SC_BB_STOCKOBJ )
{
return NULL;
}
return NtGdiSetBrushAttributes(hbm, dwFlags);
}
/*
* @unimplemented
* @implemented
*/
HBRUSH
WINAPI
ClearBrushAttributes(HBRUSH hbm, DWORD dwFlags)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
if ( dwFlags & ~SC_BB_STOCKOBJ )
{
return NULL;
}
return NtGdiClearBrushAttributes(hbm, dwFlags);
}
/*

View File

@ -106,12 +106,12 @@ SetColorSpace(
{
HCOLORSPACE rhCS = GetColorSpace(hDC);
if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_DC)
if (GDI_HANDLE_GET_TYPE(hDC) == GDILoObjType_LO_DC_TYPE)
{
if (NtGdiSetColorSpace(hDC, hCS)) return rhCS;
}
#if 0
if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_METADC)
if (GDI_HANDLE_GET_TYPE(hDC) != GDILoObjType_LO_METADC16_TYPE)
{
PLDC pLDC = GdiGetLDC(hDC);
if ( !pLDC )
@ -119,7 +119,7 @@ SetColorSpace(
SetLastError(ERROR_INVALID_HANDLE);
return NULL;
}
if (pLDC->iType == LDC_EMFLDC)
if (pLDC->iType == LDC_EMFLDC && !EMFDC_SetColorSpace( pLDC, hCS ))
{
return NULL;
}
@ -327,3 +327,26 @@ SetICMMode(
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/*
* @unimplemented
*
*/
HBITMAP
WINAPI
GdiConvertBitmapV5(
HBITMAP in_format_BitMap,
HBITMAP src_BitMap,
INT bpp,
INT unuse)
{
/* FIXME guessing the prototypes */
/*
* it have create a new bitmap with desired in format,
* then convert it src_bitmap to new format
* and return it as HBITMAP
*/
return FALSE;
}

View File

@ -543,7 +543,13 @@ NtGdiSetBrushAttributes(
_In_ HBRUSH hbr,
_In_ DWORD dwFlags)
{
FIXME("NtGdiSetBrushAttributes is unimplemented\n");
if ( dwFlags & SC_BB_STOCKOBJ )
{
if (GDIOBJ_ConvertToStockObj((HGDIOBJ*)&hbr))
{
return hbr;
}
}
return NULL;
}
@ -554,7 +560,13 @@ NtGdiClearBrushAttributes(
_In_ HBRUSH hbr,
_In_ DWORD dwFlags)
{
FIXME("NtGdiClearBrushAttributes is unimplemented\n");
if ( dwFlags & SC_BB_STOCKOBJ )
{
if (GDIOBJ_ConvertFromStockObj((HGDIOBJ*)&hbr))
{
return hbr;
}
}
return NULL;
}

View File

@ -1484,6 +1484,40 @@ GDIOBJ_ConvertToStockObj(HGDIOBJ *phObj)
return TRUE;
}
BOOL
NTAPI
GDIOBJ_ConvertFromStockObj(HGDIOBJ *phObj)
{
PENTRY pentry;
POBJ pobj;
/* Reference the handle entry */
pentry = ENTRY_ReferenceEntryByHandle(*phObj, 0);
if (!pentry)
{
DPRINT1("GDIOBJ: Requested handle 0x%p is not valid.\n", *phObj);
return FALSE;
}
/* Update the entry */
pentry->FullUnique &= ~GDI_ENTRY_STOCK_MASK;
pentry->ObjectOwner.ulObj = 0;
/* Get the pointer to the BASEOBJECT */
pobj = pentry->einfo.pobj;
/* Calculate the new handle */
pobj->hHmgr = (HGDIOBJ)((ULONG_PTR)pobj->hHmgr & ~GDI_HANDLE_STOCK_MASK);
/* Return the new handle */
*phObj = pobj->hHmgr;
/* Dereference the handle */
GDIOBJ_vDereferenceObject(pobj);
return TRUE;
}
POBJ NTAPI
GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize)
{

View File

@ -195,6 +195,7 @@ GDIOBJ_pvGetObjectAttr(
POBJ pobj);
BOOL NTAPI GDIOBJ_ConvertToStockObj(HGDIOBJ *hObj);
BOOL NTAPI GDIOBJ_ConvertFromStockObj(HGDIOBJ *phObj);
POBJ NTAPI GDIOBJ_AllocObjWithHandle(ULONG ObjectType, ULONG cjSize);
PGDIOBJ NTAPI GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ObjectType);
PVOID NTAPI GDI_MapHandleTable(PEPROCESS Process);

View File

@ -174,16 +174,23 @@
#define LDC_INIT_PAGE 0x00000080
#define LDC_STARTPAGE 0x00000100
#define LDC_NEXTBAND 0x00000200
#define LDC_FONTHASH 0x00001000
#define LDC_CLOCKWISE 0x00002000
#define LDC_NEWFONT 0x00008000
#define LDC_KILL_DOCUMENT 0x00010000
#define LDC_META_PRINT 0x00020000
#define LDC_DIRECT 0x00040000
#define LDC_RESET_BANDING 0x00080000
#define LDC_DOWNLOADFONTS 0x00100000
#define LDC_RESETDC 0x00200000
#define LDC_UFIMAP 0x00400000
#define LDC_INFODC 0x01000000 /* If CreateIC was passed. */
#define LDC_DEVCAPS 0x02000000
#define LDC_XPS_PASS 0x08000000 // Guessing, not sure.
#define LDC_ATENDPAGE 0x10000000
#define LDC_COLORPAGE 0x20000000
#define UFIHASHTABLESIZE 64
/* DC_ATTR Xform Flags */
#define METAFILE_TO_WORLD_IDENTITY 0x00000001
@ -210,6 +217,8 @@
#define ATTR_RGN_VALID 0x00000010
#define ATTR_RGN_DIRTY 0x00000020
/* Set/Clear Bitmap/Brush Stock Attribute */
#define SC_BB_STOCKOBJ 1
/* TYPES *********************************************************************/