Two working in house application require these API. Known as FolCOL and Reach.
}
/*
- * @unimplemented
+ * @implemented
*/
HBITMAP
APIENTRY
IN HBITMAP hbm,
IN DWORD dwFlags)
{
- UNIMPLEMENTED;
+ if ( dwFlags & SC_BB_STOCKOBJ )
+ {
+ if (GDIOBJ_ConvertFromStockObj((HGDIOBJ*)&hbm))
+ {
+ return hbm;
+ }
+ }
return NULL;
}
}
/*
- * @unimplemented
+ * @implemented
*/
HBITMAP
APIENTRY
IN HBITMAP hbm,
IN DWORD dwFlags)
{
- UNIMPLEMENTED;
+ if ( dwFlags & SC_BB_STOCKOBJ )
+ {
+ if (GDIOBJ_ConvertToStockObj((HGDIOBJ*)&hbm))
+ {
+ return hbm;
+ }
+ }
return NULL;
}
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,
}
/*
- * @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;
-}
}
/*
- * @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);
}
/*
{
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 )
SetLastError(ERROR_INVALID_HANDLE);
return NULL;
}
- if (pLDC->iType == LDC_EMFLDC)
+ if (pLDC->iType == LDC_EMFLDC && !EMFDC_SetColorSpace( pLDC, hCS ))
{
return NULL;
}
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;
+}
_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;
}
_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;
}
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)
{
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);
#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
#define ATTR_RGN_VALID 0x00000010
#define ATTR_RGN_DIRTY 0x00000020
+/* Set/Clear Bitmap/Brush Stock Attribute */
+#define SC_BB_STOCKOBJ 1
/* TYPES *********************************************************************/