mirror of
https://github.com/reactos/reactos.git
synced 2025-07-29 12:02:49 +00:00
GetObject rewrite part 2 (NtGdiExtGetObjectW, ...)
- hanlde GDI_OBJECT_TYPE_EXTPEN - PALETTEOBJ* -> PPALGDI - fix return value of BITMAP_GetObject & BRUSH_GetObject - implement PALETTE_GetObject - handle cases where the buffer gets filled partly svn path=/trunk/; revision=26474
This commit is contained in:
parent
a3c8ac67d5
commit
a21f8262bf
5 changed files with 87 additions and 72 deletions
|
@ -47,6 +47,8 @@ INT STDCALL PALETTE_SetMapping(PALOBJ* palPtr, UINT uStart, UINT uNum, BOO
|
|||
#endif
|
||||
INT FASTCALL PALETTE_ToPhysical (PDC dc, COLORREF color);
|
||||
|
||||
INT FASTCALL PALETTE_GetObject(PPALGDI pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer);
|
||||
|
||||
PPALETTEENTRY FASTCALL ReturnSystemPalette (VOID);
|
||||
|
||||
#endif /* _WIN32K_PALETTE_H */
|
||||
|
|
|
@ -1561,19 +1561,25 @@ BITMAPOBJ_CopyBitmap(HBITMAP hBitmap)
|
|||
INT STDCALL
|
||||
BITMAP_GetObject(BITMAPOBJ * bmp, INT Count, LPVOID buffer)
|
||||
{
|
||||
if( buffer == NULL ) return sizeof(BITMAP);
|
||||
if (Count < sizeof(BITMAP)) return 0;
|
||||
if ((UINT)Count < sizeof(BITMAP)) return 0;
|
||||
if( buffer == NULL )
|
||||
{
|
||||
if ((UINT)Count < sizeof(DIBSECTION))
|
||||
{
|
||||
return sizeof(BITMAP);
|
||||
}
|
||||
return sizeof(DIBSECTION);
|
||||
}
|
||||
|
||||
if(bmp->dib)
|
||||
{
|
||||
|
||||
if(Count < (INT) sizeof(DIBSECTION))
|
||||
if((UINT)Count < sizeof(DIBSECTION))
|
||||
{
|
||||
if (Count > (INT) sizeof(BITMAP)) Count = sizeof(BITMAP);
|
||||
Count = sizeof(BITMAP);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Count > (INT) sizeof(DIBSECTION)) Count = sizeof(DIBSECTION);
|
||||
Count = sizeof(DIBSECTION);
|
||||
}
|
||||
memcpy(buffer, bmp->dib, Count);
|
||||
return Count;
|
||||
|
@ -1581,7 +1587,8 @@ BITMAP_GetObject(BITMAPOBJ * bmp, INT Count, LPVOID buffer)
|
|||
else
|
||||
{
|
||||
BITMAP Bitmap;
|
||||
if (Count > (INT) sizeof(BITMAP)) Count = sizeof(BITMAP);
|
||||
|
||||
Count = sizeof(BITMAP);
|
||||
Bitmap.bmType = 0;
|
||||
Bitmap.bmWidth = bmp->SurfObj.sizlBitmap.cx;
|
||||
Bitmap.bmHeight = bmp->SurfObj.sizlBitmap.cy;
|
||||
|
|
|
@ -53,8 +53,8 @@ INT FASTCALL
|
|||
BRUSH_GetObject (PGDIBRUSHOBJ BrushObject, INT Count, LPLOGBRUSH Buffer)
|
||||
{
|
||||
if( Buffer == NULL ) return sizeof(BRUSHOBJ);
|
||||
if (Count < sizeof(BRUSHOBJ)) return 0;
|
||||
if (Count > sizeof(BRUSHOBJ)) Count = sizeof(BRUSHOBJ);
|
||||
if (Count == 0) return 0;
|
||||
if ((UINT)Count < sizeof(BRUSHOBJ)) return 0;
|
||||
|
||||
/* Set colour */
|
||||
Buffer->lbColor = BrushObject->BrushAttr.lbColor;
|
||||
|
|
|
@ -1755,123 +1755,117 @@ DC_GET_VAL( INT, NtGdiGetPolyFillMode, w.polyFillMode )
|
|||
|
||||
|
||||
INT FASTCALL
|
||||
IntGdiGetObject(HANDLE Handle, INT Count, LPVOID Buffer)
|
||||
IntGdiGetObject(HANDLE Handle, INT cbCount, LPVOID lpBuffer)
|
||||
{
|
||||
PVOID GdiObject;
|
||||
PVOID pGdiObject;
|
||||
INT Result = 0;
|
||||
DWORD ObjectType;
|
||||
DWORD dwObjectType;
|
||||
|
||||
GdiObject = GDIOBJ_LockObj(GdiHandleTable, Handle, GDI_OBJECT_TYPE_DONTCARE);
|
||||
if (NULL == GdiObject)
|
||||
pGdiObject = GDIOBJ_LockObj(GdiHandleTable, Handle, GDI_OBJECT_TYPE_DONTCARE);
|
||||
if (!pGdiObject)
|
||||
{
|
||||
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ObjectType = GDIOBJ_GetObjectType(Handle);
|
||||
switch (ObjectType)
|
||||
dwObjectType = GDIOBJ_GetObjectType(Handle);
|
||||
switch (dwObjectType)
|
||||
{
|
||||
|
||||
case GDI_OBJECT_TYPE_PEN:
|
||||
Result = PEN_GetObject((PGDIBRUSHOBJ) GdiObject, Count, (PLOGPEN) Buffer); // IntGdiCreatePenIndirect
|
||||
case GDI_OBJECT_TYPE_EXTPEN:
|
||||
Result = PEN_GetObject((PGDIBRUSHOBJ) pGdiObject, cbCount, (PLOGPEN) lpBuffer); // IntGdiCreatePenIndirect
|
||||
break;
|
||||
|
||||
case GDI_OBJECT_TYPE_BRUSH:
|
||||
Result = BRUSH_GetObject((PGDIBRUSHOBJ ) GdiObject, Count, (LPLOGBRUSH)Buffer);
|
||||
Result = BRUSH_GetObject((PGDIBRUSHOBJ ) pGdiObject, cbCount, (LPLOGBRUSH)lpBuffer);
|
||||
break;
|
||||
|
||||
case GDI_OBJECT_TYPE_BITMAP:
|
||||
Result = BITMAP_GetObject((BITMAPOBJ *) GdiObject, Count, Buffer);
|
||||
Result = BITMAP_GetObject((BITMAPOBJ *) pGdiObject, cbCount, lpBuffer);
|
||||
break;
|
||||
case GDI_OBJECT_TYPE_FONT:
|
||||
Result = FontGetObject((PTEXTOBJ) GdiObject, Count, Buffer);
|
||||
Result = FontGetObject((PTEXTOBJ) pGdiObject, cbCount, lpBuffer);
|
||||
#if 0
|
||||
// Fix the LOGFONT structure for the stock fonts
|
||||
if (FIRST_STOCK_HANDLE <= Handle && Handle <= LAST_STOCK_HANDLE)
|
||||
{
|
||||
FixStockFontSizeW(Handle, Count, Buffer);
|
||||
FixStockFontSizeW(Handle, cbCount, lpBuffer);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
#if 0
|
||||
|
||||
case GDI_OBJECT_TYPE_PALETTE:
|
||||
Result = PALETTE_GetObject((PALETTEOBJ *) GdiObject, Count, Buffer);
|
||||
Result = PALETTE_GetObject((PPALGDI) pGdiObject, cbCount, lpBuffer);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
DPRINT1("GDI object type 0x%08x not implemented\n", ObjectType);
|
||||
DPRINT1("GDI object type 0x%08x not implemented\n", dwObjectType);
|
||||
break;
|
||||
}
|
||||
|
||||
GDIOBJ_UnlockObjByPtr(GdiHandleTable, GdiObject);
|
||||
GDIOBJ_UnlockObjByPtr(GdiHandleTable, pGdiObject);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
INT STDCALL
|
||||
NtGdiExtGetObjectW(HANDLE handle, INT count, LPVOID buffer)
|
||||
NtGdiExtGetObjectW(HANDLE hGdiObj, INT cbCount, LPVOID lpUnsafeBuf)
|
||||
{
|
||||
INT Ret = 0;
|
||||
LPVOID SafeBuf;
|
||||
LPVOID lpSafeBuf;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
INT RetCount = 0;
|
||||
|
||||
/* From Wine: GetObject does not SetLastError() on a null object */
|
||||
if (!handle) return Ret;
|
||||
|
||||
RetCount = IntGdiGetObject(handle, 0, NULL);
|
||||
if ((count <= 0) || (!buffer))
|
||||
if (!hGdiObj)
|
||||
{
|
||||
return RetCount;
|
||||
return 0;
|
||||
}
|
||||
|
||||
_SEH_TRY
|
||||
if (!lpUnsafeBuf)
|
||||
{
|
||||
ProbeForWrite(buffer, count, 1);
|
||||
return IntGdiGetObject(hGdiObj, 0, NULL);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
|
||||
if (!cbCount)
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
return 0;
|
||||
}
|
||||
_SEH_END;
|
||||
|
||||
RetCount = IntGdiGetObject(hGdiObj, cbCount, NULL);
|
||||
if ((UINT)cbCount > RetCount)
|
||||
{
|
||||
cbCount = RetCount;
|
||||
}
|
||||
lpSafeBuf = ExAllocatePoolWithTag(PagedPool, RetCount, TAG_GDIOBJ);
|
||||
if(!lpSafeBuf)
|
||||
{
|
||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return 0;
|
||||
}
|
||||
RetCount = IntGdiGetObject(hGdiObj, cbCount, lpSafeBuf);
|
||||
if (RetCount)
|
||||
{
|
||||
_SEH_TRY
|
||||
{
|
||||
ProbeForWrite(lpUnsafeBuf, cbCount, 1);
|
||||
RtlCopyMemory(lpUnsafeBuf, lpSafeBuf, cbCount);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
}
|
||||
|
||||
ExFreePool(lpSafeBuf);
|
||||
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
return Ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((RetCount) && (count))
|
||||
{
|
||||
SafeBuf = ExAllocatePoolWithTag(PagedPool, count, TAG_GDIOBJ);
|
||||
if(!SafeBuf)
|
||||
{
|
||||
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return Ret;
|
||||
}
|
||||
Ret = IntGdiGetObject(handle, count, SafeBuf);
|
||||
|
||||
_SEH_TRY
|
||||
{
|
||||
/* pointer already probed! */
|
||||
RtlCopyMemory(buffer, SafeBuf, count);
|
||||
}
|
||||
_SEH_HANDLE
|
||||
{
|
||||
Status = _SEH_GetExceptionCode();
|
||||
}
|
||||
_SEH_END;
|
||||
|
||||
ExFreePool(SafeBuf);
|
||||
|
||||
if(!NT_SUCCESS(Status))
|
||||
{
|
||||
SetLastNtError(Status);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return Ret;
|
||||
return RetCount;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -339,4 +339,16 @@ INT STDCALL PALETTE_SetMapping(PALOBJ *palPtr, UINT uStart, UINT uNum, BOOL mapO
|
|||
}
|
||||
#endif
|
||||
|
||||
INT FASTCALL
|
||||
PALETTE_GetObject(PPALGDI pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer)
|
||||
{
|
||||
if (!lpBuffer)
|
||||
{
|
||||
return sizeof(WORD);
|
||||
}
|
||||
if ((UINT)cbCount < sizeof(WORD)) return 0;
|
||||
*((WORD*)lpBuffer) = (WORD)pGdiObject->NumColors;
|
||||
return sizeof(WORD);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue