Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
385ceeb8
Commit
385ceeb8
authored
Nov 17, 2006
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winex11.drv: Avoid some direct accesses to the PALETTEOBJ structure.
parent
ed4f22ab
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
44 additions
and
35 deletions
+44
-35
palette.c
dlls/winex11.drv/palette.c
+44
-35
No files found.
dlls/winex11.drv/palette.c
View file @
385ceeb8
...
...
@@ -855,8 +855,9 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color )
break
;
case
1
:
/* PALETTEINDEX */
if
(
idx
>=
palPtr
->
logpalette
.
palNumEntries
)
{
PALETTEENTRY
entry
;
if
(
!
GetPaletteEntries
(
hPal
,
idx
,
1
,
&
entry
))
{
WARN
(
"PALETTEINDEX(%x) : idx %d is out of bounds, assuming black
\n
"
,
color
,
idx
);
GDI_ReleaseObj
(
hPal
);
...
...
@@ -869,8 +870,9 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color )
GDI_ReleaseObj
(
hPal
);
return
ret
;
}
color
=
*
(
COLORREF
*
)(
palPtr
->
logpalette
.
palPalEntry
+
idx
);
color
=
RGB
(
entry
.
peRed
,
entry
.
peGreen
,
entry
.
peBlue
);
break
;
}
default:
color
&=
0xffffff
;
...
...
@@ -1048,10 +1050,9 @@ static BOOL X11DRV_PALETTE_CheckSysColor( const PALETTEENTRY *sys_pal_template,
/***********************************************************************
* X11DRV_LookupSysPaletteExact
*/
static
int
X11DRV_LookupSysPaletteExact
(
COLORREF
col
)
static
int
X11DRV_LookupSysPaletteExact
(
BYTE
r
,
BYTE
g
,
BYTE
b
)
{
int
i
;
BYTE
r
=
GetRValue
(
col
),
g
=
GetGValue
(
col
),
b
=
GetBValue
(
col
);
for
(
i
=
0
;
i
<
palette_size
;
i
++
)
{
if
(
COLOR_sysPal
[
i
].
peFlags
&
PC_SYS_USED
)
/* skips gap */
...
...
@@ -1070,13 +1071,17 @@ static int X11DRV_LookupSysPaletteExact( COLORREF col )
* Set the color-mapping table for selected palette.
* Return number of entries which mapping has changed.
*/
static
UINT
X11DRV_PALETTE_SetMapping
(
PALETTEOBJ
*
palPtr
,
UINT
uStart
,
UINT
uNum
,
BOOL
mapOnly
)
static
UINT
X11DRV_PALETTE_SetMapping
(
HPALETTE
hpal
,
PALETTEOBJ
*
palPtr
,
BOOL
mapOnly
)
{
char
flag
;
int
prevMapping
=
(
palPtr
->
mapping
)
?
1
:
0
;
int
index
;
UINT
iRemapped
=
0
;
UINT
i
,
i
Remapped
=
0
;
int
*
mapping
;
PALETTEENTRY
entries
[
256
];
WORD
num_entries
;
if
(
!
GetObjectW
(
hpal
,
sizeof
(
num_entries
),
&
num_entries
))
return
0
;
/* reset dynamic system palette entries */
...
...
@@ -1085,11 +1090,9 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
/* initialize palette mapping table */
if
(
palPtr
->
mapping
)
mapping
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
palPtr
->
mapping
,
sizeof
(
int
)
*
palPtr
->
logpalette
.
palNumEntries
);
mapping
=
HeapReAlloc
(
GetProcessHeap
(),
0
,
palPtr
->
mapping
,
sizeof
(
int
)
*
num_entries
);
else
mapping
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
int
)
*
palPtr
->
logpalette
.
palNumEntries
);
mapping
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
int
)
*
num_entries
);
if
(
mapping
==
NULL
)
{
ERR
(
"Unable to allocate new mapping -- memory exhausted!
\n
"
);
...
...
@@ -1097,12 +1100,14 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
}
palPtr
->
mapping
=
mapping
;
if
(
uStart
>=
palPtr
->
logpalette
.
palNumEntries
)
return
0
;
if
(
uStart
+
uNum
>
palPtr
->
logpalette
.
palNumEntries
)
uNum
=
palPtr
->
logpalette
.
palNumEntries
-
uStart
;
if
(
num_entries
>
256
)
{
FIXME
(
"more than 256 entries not supported
\n
"
);
num_entries
=
256
;
}
if
(
!
(
num_entries
=
GetPaletteEntries
(
hpal
,
0
,
num_entries
,
entries
)))
return
0
;
for
(
uNum
+=
uStart
;
uStart
<
uNum
;
uStart
++
)
for
(
i
=
0
;
i
<
num_entries
;
i
++
)
{
index
=
-
1
;
flag
=
PC_SYS_USED
;
...
...
@@ -1110,9 +1115,9 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
/* Even though the docs say that only one flag is to be set,
* they are a bitmask. At least one app sets more than one at
* the same time. */
if
(
palPtr
->
logpalette
.
palPalEntry
[
uStart
].
peFlags
&
PC_EXPLICIT
)
{
if
(
entries
[
i
].
peFlags
&
PC_EXPLICIT
)
{
/* palette entries are indices into system palette */
index
=
*
(
WORD
*
)
(
palPtr
->
logpalette
.
palPalEntry
+
uStart
)
;
index
=
*
(
WORD
*
)
&
entries
[
i
]
;
if
(
index
>
255
||
(
index
>=
COLOR_gapStart
&&
index
<=
COLOR_gapEnd
)
)
{
WARN
(
"PC_EXPLICIT: idx %d out of system palette, assuming black.
\n
"
,
index
);
...
...
@@ -1120,14 +1125,14 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
}
if
(
X11DRV_PALETTE_PaletteToXPixel
)
index
=
X11DRV_PALETTE_PaletteToXPixel
[
index
];
}
else
{
if
(
palPtr
->
logpalette
.
palPalEntry
[
uStart
].
peFlags
&
PC_RESERVED
)
{
if
(
entries
[
i
].
peFlags
&
PC_RESERVED
)
{
/* forbid future mappings to this entry */
flag
|=
PC_SYS_RESERVED
;
}
if
(
!
(
palPtr
->
logpalette
.
palPalEntry
[
uStart
].
peFlags
&
PC_NOCOLLAPSE
)
)
{
if
(
!
(
entries
[
i
].
peFlags
&
PC_NOCOLLAPSE
)
)
{
/* try to collapse identical colors */
index
=
X11DRV_LookupSysPaletteExact
(
*
(
COLORREF
*
)(
palPtr
->
logpalette
.
palPalEntry
+
uStart
)
);
index
=
X11DRV_LookupSysPaletteExact
(
entries
[
i
].
peRed
,
entries
[
i
].
peGreen
,
entries
[
i
].
peBlue
);
}
if
(
index
<
0
)
...
...
@@ -1139,15 +1144,15 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
X11DRV_PALETTE_firstFree
=
X11DRV_PALETTE_freeList
[
index
];
color
.
pixel
=
(
X11DRV_PALETTE_PaletteToXPixel
)
?
X11DRV_PALETTE_PaletteToXPixel
[
index
]
:
index
;
color
.
red
=
palPtr
->
logpalette
.
palPalEntry
[
uStart
].
peRed
<<
8
;
color
.
green
=
palPtr
->
logpalette
.
palPalEntry
[
uStart
].
peGreen
<<
8
;
color
.
blue
=
palPtr
->
logpalette
.
palPalEntry
[
uStart
].
peBlue
<<
8
;
color
.
red
=
entries
[
i
].
peRed
<<
8
;
color
.
green
=
entries
[
i
].
peGreen
<<
8
;
color
.
blue
=
entries
[
i
].
peBlue
<<
8
;
color
.
flags
=
DoRed
|
DoGreen
|
DoBlue
;
wine_tsx11_lock
();
XStoreColor
(
gdi_display
,
X11DRV_PALETTE_PaletteXColormap
,
&
color
);
wine_tsx11_unlock
();
COLOR_sysPal
[
index
]
=
palPtr
->
logpalette
.
palPalEntry
[
uStart
];
COLOR_sysPal
[
index
]
=
entries
[
i
];
COLOR_sysPal
[
index
].
peFlags
=
flag
;
X11DRV_PALETTE_freeList
[
index
]
=
0
;
...
...
@@ -1155,23 +1160,23 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
}
else
if
(
X11DRV_PALETTE_PaletteFlags
&
X11DRV_PALETTE_VIRTUAL
)
{
index
=
X11DRV_PALETTE_ToPhysical
(
NULL
,
0x00ffffff
&
*
(
COLORREF
*
)(
palPtr
->
logpalette
.
palPalEntry
+
uStart
));
index
=
X11DRV_PALETTE_ToPhysical
(
NULL
,
RGB
(
entries
[
i
].
peRed
,
entries
[
i
].
peGreen
,
entries
[
i
].
peBlue
));
}
/* we have to map to existing entry in the system palette */
index
=
X11DRV_SysPaletteLookupPixel
(
*
(
COLORREF
*
)(
palPtr
->
logpalette
.
palPalEntry
+
uStart
),
TRUE
);
index
=
X11DRV_SysPaletteLookupPixel
(
RGB
(
entries
[
i
].
peRed
,
entries
[
i
].
peGreen
,
entries
[
i
].
peBlue
),
TRUE
);
}
if
(
X11DRV_PALETTE_PaletteToXPixel
)
index
=
X11DRV_PALETTE_PaletteToXPixel
[
index
];
}
if
(
!
prevMapping
||
palPtr
->
mapping
[
uStart
]
!=
index
)
iRemapped
++
;
palPtr
->
mapping
[
uStart
]
=
index
;
if
(
!
prevMapping
||
palPtr
->
mapping
[
i
]
!=
index
)
iRemapped
++
;
palPtr
->
mapping
[
i
]
=
index
;
TRACE
(
"entry %i (%x) -> pixel %i
\n
"
,
uStart
,
*
(
COLORREF
*
)(
palPtr
->
logpalette
.
palPalEntry
+
uStart
),
index
);
TRACE
(
"entry %i (%x) -> pixel %i
\n
"
,
i
,
*
(
COLORREF
*
)
&
entries
[
i
],
index
);
}
return
iRemapped
;
...
...
@@ -1252,7 +1257,7 @@ UINT X11DRV_RealizePalette( X11DRV_PDEVICE *physDev, HPALETTE hpal, BOOL primary
if
(
X11DRV_PALETTE_PaletteFlags
&
X11DRV_PALETTE_VIRTUAL
)
return
0
;
if
(
!
(
palPtr
=
GDI_GetObjPtr
(
hpal
,
PALETTE_MAGIC
)))
return
0
;
ret
=
X11DRV_PALETTE_SetMapping
(
palPtr
,
0
,
palPtr
->
logpalette
.
palNumEntries
,
!
primary
);
ret
=
X11DRV_PALETTE_SetMapping
(
hpal
,
palPtr
,
!
primary
);
GDI_ReleaseObj
(
hpal
);
return
ret
;
}
...
...
@@ -1272,10 +1277,14 @@ UINT X11DRV_RealizeDefaultPalette( X11DRV_PDEVICE *physDev )
{
/* lookup is needed to account for SetSystemPaletteUse() stuff */
int
i
,
index
;
PALETTEENTRY
entries
[
NB_RESERVED_COLORS
];
for
(
i
=
0
;
i
<
20
;
i
++
)
GetPaletteEntries
(
GetStockObject
(
DEFAULT_PALETTE
),
0
,
NB_RESERVED_COLORS
,
entries
);
for
(
i
=
0
;
i
<
NB_RESERVED_COLORS
;
i
++
)
{
index
=
X11DRV_PALETTE_LookupSystemXPixel
(
*
(
COLORREF
*
)(
palPtr
->
logpalette
.
palPalEntry
+
i
));
index
=
X11DRV_PALETTE_LookupSystemXPixel
(
RGB
(
entries
[
i
].
peRed
,
entries
[
i
].
peGreen
,
entries
[
i
].
peBlue
)
);
/* mapping is allocated in COLOR_InitPalette() */
if
(
index
!=
palPtr
->
mapping
[
i
]
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment