mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 12:29:56 +00:00
Implement Delete/CreateColorSpace and Get/SetColorSpace.
svn path=/trunk/; revision=33522
This commit is contained in:
parent
3b144199de
commit
ba435ce3c6
9 changed files with 251 additions and 65 deletions
|
@ -39,6 +39,7 @@
|
||||||
<file>eng.c</file>
|
<file>eng.c</file>
|
||||||
<file>enhmfile.c</file>
|
<file>enhmfile.c</file>
|
||||||
<file>font.c</file>
|
<file>font.c</file>
|
||||||
|
<file>icm.c</file>
|
||||||
<file>linedda.c</file>
|
<file>linedda.c</file>
|
||||||
<file>metafile.c</file>
|
<file>metafile.c</file>
|
||||||
<file>painting.c</file>
|
<file>painting.c</file>
|
||||||
|
|
|
@ -637,34 +637,6 @@ CheckColorsInGamut(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
HCOLORSPACE
|
|
||||||
STDCALL
|
|
||||||
GetColorSpace(HDC hDc)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
HCOLORSPACE
|
|
||||||
STDCALL
|
|
||||||
SetColorSpace(
|
|
||||||
HDC a0,
|
|
||||||
HCOLORSPACE a1
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @implemented
|
* @implemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -85,21 +85,6 @@ GetLogColorSpaceA(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
HCOLORSPACE
|
|
||||||
STDCALL
|
|
||||||
CreateColorSpaceA(
|
|
||||||
LPLOGCOLORSPACEA a0
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -48,20 +48,6 @@ GetLogColorSpaceW(
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
HCOLORSPACE
|
|
||||||
STDCALL
|
|
||||||
CreateColorSpaceW(
|
|
||||||
LPLOGCOLORSPACEW a0
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @unimplemented
|
* @unimplemented
|
||||||
|
|
130
reactos/dll/win32/gdi32/objects/icm.c
Normal file
130
reactos/dll/win32/gdi32/objects/icm.c
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
#include "precomp.h"
|
||||||
|
|
||||||
|
#define NDEBUG
|
||||||
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
|
HCOLORSPACE
|
||||||
|
FASTCALL
|
||||||
|
IntCreateColorSpaceW(
|
||||||
|
LPLOGCOLORSPACEW lplcpw,
|
||||||
|
BOOL Ascii
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LOGCOLORSPACEEXW lcpeexw;
|
||||||
|
|
||||||
|
if ((lplcpw->lcsSignature != LCS_SIGNATURE) ||
|
||||||
|
(lplcpw->lcsVersion != 0x400) ||
|
||||||
|
(lplcpw->lcsSize != sizeof(LOGCOLORSPACEW)))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_COLORSPACE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
RtlCopyMemory(&lcpeexw.lcsColorSpace, lplcpw, sizeof(LOGCOLORSPACEW));
|
||||||
|
|
||||||
|
return NtGdiCreateColorSpace(&lcpeexw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
HCOLORSPACE
|
||||||
|
STDCALL
|
||||||
|
CreateColorSpaceW(
|
||||||
|
LPLOGCOLORSPACEW lplcpw
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return IntCreateColorSpaceW(lplcpw, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
HCOLORSPACE
|
||||||
|
STDCALL
|
||||||
|
CreateColorSpaceA(
|
||||||
|
LPLOGCOLORSPACEA lplcpa
|
||||||
|
)
|
||||||
|
{
|
||||||
|
LOGCOLORSPACEW lcpw;
|
||||||
|
|
||||||
|
if ((lplcpa->lcsSignature != LCS_SIGNATURE) ||
|
||||||
|
(lplcpa->lcsVersion != 0x400) ||
|
||||||
|
(lplcpa->lcsSize != sizeof(LOGCOLORSPACEA)))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_COLORSPACE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
lcpw.lcsSignature = lplcpa->lcsSignature;
|
||||||
|
lcpw.lcsVersion = lplcpa->lcsVersion;
|
||||||
|
lcpw.lcsSize = sizeof(LOGCOLORSPACEW);
|
||||||
|
lcpw.lcsCSType = lplcpa->lcsCSType;
|
||||||
|
lcpw.lcsIntent = lplcpa->lcsIntent;
|
||||||
|
lcpw.lcsEndpoints = lplcpa->lcsEndpoints;
|
||||||
|
lcpw.lcsGammaRed = lplcpa->lcsGammaRed;
|
||||||
|
lcpw.lcsGammaGreen = lplcpa->lcsGammaGreen;
|
||||||
|
lcpw.lcsGammaBlue = lplcpa->lcsGammaBlue;
|
||||||
|
|
||||||
|
RtlMultiByteToUnicodeN( lcpw.lcsFilename,
|
||||||
|
MAX_PATH,
|
||||||
|
NULL,
|
||||||
|
lplcpa->lcsFilename,
|
||||||
|
strlen(lplcpa->lcsFilename) + 1);
|
||||||
|
|
||||||
|
return IntCreateColorSpaceW(&lcpw, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
HCOLORSPACE
|
||||||
|
STDCALL
|
||||||
|
GetColorSpace(HDC hDC)
|
||||||
|
{
|
||||||
|
PDC_ATTR pDc_Attr;
|
||||||
|
|
||||||
|
if (!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr))
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return pDc_Attr->hColorSpace;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
HCOLORSPACE
|
||||||
|
STDCALL
|
||||||
|
SetColorSpace(
|
||||||
|
HDC hDC,
|
||||||
|
HCOLORSPACE hCS
|
||||||
|
)
|
||||||
|
{
|
||||||
|
HCOLORSPACE rhCS = GetColorSpace(hDC);
|
||||||
|
|
||||||
|
if (GDI_HANDLE_GET_TYPE(hDC) == GDI_OBJECT_TYPE_DC)
|
||||||
|
{
|
||||||
|
if (NtGdiSetColorSpace(hDC, hCS)) return rhCS;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_METADC)
|
||||||
|
{
|
||||||
|
PLDC pLDC = GdiGetLDC(hDC);
|
||||||
|
if ( !pLDC )
|
||||||
|
{
|
||||||
|
SetLastError(ERROR_INVALID_HANDLE);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (pLDC->iType == LDC_EMFLDC)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
|
@ -966,6 +966,10 @@ extern "C" {
|
||||||
#define LCS_GM_BUSINESS 1
|
#define LCS_GM_BUSINESS 1
|
||||||
#define LCS_GM_GRAPHICS 2
|
#define LCS_GM_GRAPHICS 2
|
||||||
#define LCS_GM_IMAGES 4
|
#define LCS_GM_IMAGES 4
|
||||||
|
#define LCS_GM_ABS_COLORIMETRIC 8
|
||||||
|
#define LCS_SIGNATURE 0x50534F43 // 'PSOC'
|
||||||
|
#define LCS_sRGB 'sRGB'
|
||||||
|
#define LCS_WINDOWS_COLOR_SPACE 'Win '
|
||||||
#define RASTER_FONTTYPE 1
|
#define RASTER_FONTTYPE 1
|
||||||
#define DEVICE_FONTTYPE 2
|
#define DEVICE_FONTTYPE 2
|
||||||
#define TRUETYPE_FONTTYPE 4
|
#define TRUETYPE_FONTTYPE 4
|
||||||
|
|
|
@ -10,10 +10,29 @@
|
||||||
|
|
||||||
#define NB_RESERVED_COLORS 20 /* number of fixed colors in system palette */
|
#define NB_RESERVED_COLORS 20 /* number of fixed colors in system palette */
|
||||||
|
|
||||||
|
typedef struct _COLORSPACE
|
||||||
|
{
|
||||||
|
BASEOBJECT BaseObject;
|
||||||
|
LOGCOLORSPACEW lcsColorSpace;
|
||||||
|
DWORD dwFlags;
|
||||||
|
} COLORSPACE, *PCOLORSPACE;
|
||||||
|
|
||||||
|
|
||||||
|
#define COLORSPACEOBJ_AllocCS() ((PCOLORSPACE) GDIOBJ_AllocObj(GDIObjType_ICMLCS_TYPE))
|
||||||
|
#define COLORSPACEOBJ_AllocCSWithHandle() ((PCOLORSPACE) GDIOBJ_AllocObjWithHandle (GDI_OBJECT_TYPE_COLORSPACE))
|
||||||
|
#define COLORSPACEOBJ_FreeCS(pCS) GDIOBJ_FreeObj((POBJ)pCS, GDIObjType_ICMLCS_TYPE)
|
||||||
|
#define COLORSPACEOBJ_FreeCSByHandle(hCS) GDIOBJ_FreeObjByHandle((HGDIOBJ)hCS, GDI_OBJECT_TYPE_COLORSPACE)
|
||||||
|
#define COLORSPACEOBJ_LockCS(hCS) ((PCOLORSPACE)GDIOBJ_LockObj((HGDIOBJ)hCS, GDI_OBJECT_TYPE_COLORSPACE))
|
||||||
|
#define COLORSPACEOBJ_UnlockCS(pCS) GDIOBJ_UnlockObjByPtr((POBJ)pCS)
|
||||||
|
|
||||||
|
extern HCOLORSPACE hStockColorSpace;
|
||||||
|
|
||||||
const PALETTEENTRY* FASTCALL COLOR_GetSystemPaletteTemplate (VOID);
|
const PALETTEENTRY* FASTCALL COLOR_GetSystemPaletteTemplate (VOID);
|
||||||
COLORREF STDCALL COLOR_LookupNearestColor (PALETTEENTRY* palPalEntry, INT size, COLORREF color);
|
COLORREF STDCALL COLOR_LookupNearestColor (PALETTEENTRY* palPalEntry, INT size, COLORREF color);
|
||||||
INT STDCALL COLOR_PaletteLookupExactIndex (PALETTEENTRY* palPalEntry, INT size, COLORREF col);
|
INT STDCALL COLOR_PaletteLookupExactIndex (PALETTEENTRY* palPalEntry, INT size, COLORREF col);
|
||||||
INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, XLATEOBJ *XlateObj, COLORREF col, BOOL skipReserved);
|
INT STDCALL COLOR_PaletteLookupPixel(PALETTEENTRY *palPalEntry, INT size, XLATEOBJ *XlateObj, COLORREF col, BOOL skipReserved);
|
||||||
UINT FASTCALL IntGdiRealizePalette (HDC);
|
UINT FASTCALL IntGdiRealizePalette (HDC);
|
||||||
|
HCOLORSPACE FASTCALL IntGdiCreateColorSpace(PLOGCOLORSPACEEXW);
|
||||||
|
BOOL FASTCALL IntGdiDeleteColorSpace(HCOLORSPACE);
|
||||||
|
|
||||||
#endif /* _WIN32K_COLOR_H */
|
#endif /* _WIN32K_COLOR_H */
|
||||||
|
|
|
@ -59,7 +59,7 @@ OBJ_TYPE_INFO ObjTypeInfo[] =
|
||||||
{0, sizeof(DC), TAG_CLIENTOBJ, GDI_CleanupDummy}, /* 06 CLIENTOBJ: METADC,... FIXME: don't use DC struct */
|
{0, sizeof(DC), TAG_CLIENTOBJ, GDI_CleanupDummy}, /* 06 CLIENTOBJ: METADC,... FIXME: don't use DC struct */
|
||||||
{0, 0, TAG_PATH, NULL}, /* 07 PATH, unused */
|
{0, 0, TAG_PATH, NULL}, /* 07 PATH, unused */
|
||||||
{1, sizeof(PALGDI), TAG_PALETTE, PALETTE_Cleanup}, /* 08 PAL */
|
{1, sizeof(PALGDI), TAG_PALETTE, PALETTE_Cleanup}, /* 08 PAL */
|
||||||
{0, 0, TAG_ICMLCS, NULL}, /* 09 ICMLCS, unused */
|
{1, sizeof(COLORSPACE), TAG_ICMLCS, GDI_CleanupDummy}, /* 09 ICMLCS, unused */
|
||||||
{1, sizeof(TEXTOBJ), TAG_LFONT, GDI_CleanupDummy}, /* 0a LFONT */
|
{1, sizeof(TEXTOBJ), TAG_LFONT, GDI_CleanupDummy}, /* 0a LFONT */
|
||||||
{0, 0, TAG_RFONT, NULL}, /* 0b RFONT, unused */
|
{0, 0, TAG_RFONT, NULL}, /* 0b RFONT, unused */
|
||||||
{0, 0, TAG_PFE, NULL}, /* 0c PFE, unused */
|
{0, 0, TAG_PFE, NULL}, /* 0c PFE, unused */
|
||||||
|
|
|
@ -16,20 +16,75 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id$ */
|
|
||||||
|
|
||||||
#include <w32k.h>
|
#include <w32k.h>
|
||||||
|
|
||||||
#define NDEBUG
|
#define NDEBUG
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
HCOLORSPACE hStockColorSpace = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
HCOLORSPACE
|
||||||
|
FASTCALL
|
||||||
|
IntGdiCreateColorSpace(
|
||||||
|
PLOGCOLORSPACEEXW pLogColorSpace)
|
||||||
|
{
|
||||||
|
PCOLORSPACE pCS;
|
||||||
|
HCOLORSPACE hCS;
|
||||||
|
|
||||||
|
pCS = COLORSPACEOBJ_AllocCSWithHandle();
|
||||||
|
hCS = pCS->BaseObject.hHmgr;
|
||||||
|
|
||||||
|
pCS->lcsColorSpace = pLogColorSpace->lcsColorSpace;
|
||||||
|
pCS->dwFlags = pLogColorSpace->dwFlags;
|
||||||
|
|
||||||
|
COLORSPACEOBJ_UnlockCS(pCS);
|
||||||
|
return hCS;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL
|
||||||
|
FASTCALL
|
||||||
|
IntGdiDeleteColorSpace(
|
||||||
|
HCOLORSPACE hColorSpace)
|
||||||
|
{
|
||||||
|
BOOL Ret = FALSE;
|
||||||
|
|
||||||
|
if ( hColorSpace != hStockColorSpace )
|
||||||
|
{
|
||||||
|
Ret = COLORSPACEOBJ_FreeCSByHandle(hColorSpace);
|
||||||
|
if ( !Ret ) SetLastWin32Error(ERROR_INVALID_PARAMETER);
|
||||||
|
}
|
||||||
|
return Ret;
|
||||||
|
}
|
||||||
|
|
||||||
HANDLE
|
HANDLE
|
||||||
APIENTRY
|
APIENTRY
|
||||||
NtGdiCreateColorSpace(
|
NtGdiCreateColorSpace(
|
||||||
IN PLOGCOLORSPACEEXW pLogColorSpace)
|
IN PLOGCOLORSPACEEXW pLogColorSpace)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
LOGCOLORSPACEEXW Safelcs;
|
||||||
return 0;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
_SEH_TRY
|
||||||
|
{
|
||||||
|
ProbeForRead( pLogColorSpace,
|
||||||
|
sizeof(LOGCOLORSPACEEXW),
|
||||||
|
1);
|
||||||
|
RtlCopyMemory(&Safelcs, pLogColorSpace, sizeof(LOGCOLORSPACEEXW));
|
||||||
|
}
|
||||||
|
_SEH_HANDLE
|
||||||
|
{
|
||||||
|
Status = _SEH_GetExceptionCode();
|
||||||
|
}
|
||||||
|
_SEH_END;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SetLastNtError(Status);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return IntGdiCreateColorSpace(&Safelcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
|
@ -37,8 +92,7 @@ APIENTRY
|
||||||
NtGdiDeleteColorSpace(
|
NtGdiDeleteColorSpace(
|
||||||
IN HANDLE hColorSpace)
|
IN HANDLE hColorSpace)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
return IntGdiDeleteColorSpace(hColorSpace);
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
|
@ -136,8 +190,43 @@ STDCALL
|
||||||
NtGdiSetColorSpace(IN HDC hdc,
|
NtGdiSetColorSpace(IN HDC hdc,
|
||||||
IN HCOLORSPACE hColorSpace)
|
IN HCOLORSPACE hColorSpace)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED;
|
PDC pDC;
|
||||||
return 0;
|
PDC_ATTR pDc_Attr;
|
||||||
|
PCOLORSPACE pCS;
|
||||||
|
|
||||||
|
pDC = DC_LockDc(hdc);
|
||||||
|
if (!pDC)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
pDc_Attr = pDC->pDc_Attr;
|
||||||
|
if(!pDc_Attr) pDc_Attr = &pDC->Dc_Attr;
|
||||||
|
|
||||||
|
if (pDc_Attr->hColorSpace == hColorSpace)
|
||||||
|
{
|
||||||
|
DC_UnlockDc(pDC);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
pCS = COLORSPACEOBJ_LockCS(hColorSpace);
|
||||||
|
if (!pCS)
|
||||||
|
{
|
||||||
|
SetLastWin32Error(ERROR_INVALID_HANDLE);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDC->DcLevel.pColorSpace)
|
||||||
|
{
|
||||||
|
GDIOBJ_ShareUnlockObjByPtr((POBJ) pDC->DcLevel.pColorSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDC->DcLevel.pColorSpace = pCS;
|
||||||
|
pDc_Attr->hColorSpace = hColorSpace;
|
||||||
|
|
||||||
|
COLORSPACEOBJ_UnlockCS(pCS);
|
||||||
|
DC_UnlockDc(pDC);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
|
|
Loading…
Reference in a new issue