Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
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-winehq
Commits
e166ec0b
Commit
e166ec0b
authored
Dec 22, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Recompute the background masks on every use to support PALETTEINDEX colors.
parent
9237638c
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
26 additions
and
56 deletions
+26
-56
dc.c
dlls/gdi32/dibdrv/dc.c
+3
-41
dibdrv.h
dlls/gdi32/dibdrv/dibdrv.h
+0
-3
graphics.c
dlls/gdi32/dibdrv/graphics.c
+5
-3
objects.c
dlls/gdi32/dibdrv/objects.c
+18
-9
No files found.
dlls/gdi32/dibdrv/dc.c
View file @
e166ec0b
...
...
@@ -262,13 +262,6 @@ static void update_fg_colors( dibdrv_physdev *pdev )
pdev
->
text_color
=
get_pixel_color
(
pdev
,
GetTextColor
(
pdev
->
dev
.
hdc
),
TRUE
);
}
static
void
update_masks
(
dibdrv_physdev
*
pdev
,
INT
rop
)
{
update_brush_rop
(
pdev
,
rop
);
if
(
GetBkMode
(
pdev
->
dev
.
hdc
)
==
OPAQUE
)
calc_and_xor_masks
(
rop
,
pdev
->
bkgnd_color
,
&
pdev
->
bkgnd_and
,
&
pdev
->
bkgnd_xor
);
}
/***********************************************************************
* add_extra_clipping_region
*
...
...
@@ -379,41 +372,12 @@ static COLORREF dibdrv_SetBkColor( PHYSDEV dev, COLORREF color )
PHYSDEV
next
=
GET_NEXT_PHYSDEV
(
dev
,
pSetBkColor
);
dibdrv_physdev
*
pdev
=
get_dibdrv_pdev
(
dev
);
pdev
->
bkgnd_color
=
get_pixel_color
(
pdev
,
color
,
FALSE
);
if
(
GetBkMode
(
dev
->
hdc
)
==
OPAQUE
)
calc_and_xor_masks
(
GetROP2
(
dev
->
hdc
),
pdev
->
bkgnd_color
,
&
pdev
->
bkgnd_and
,
&
pdev
->
bkgnd_xor
);
else
{
pdev
->
bkgnd_and
=
~
0u
;
pdev
->
bkgnd_xor
=
0
;
}
update_fg_colors
(
pdev
);
/* Only needed in the 1 bpp case */
return
next
->
funcs
->
pSetBkColor
(
next
,
color
);
}
/***********************************************************************
* dibdrv_SetBkMode
*/
static
INT
dibdrv_SetBkMode
(
PHYSDEV
dev
,
INT
mode
)
{
PHYSDEV
next
=
GET_NEXT_PHYSDEV
(
dev
,
pSetBkMode
);
dibdrv_physdev
*
pdev
=
get_dibdrv_pdev
(
dev
);
if
(
mode
==
OPAQUE
)
calc_and_xor_masks
(
GetROP2
(
dev
->
hdc
),
pdev
->
bkgnd_color
,
&
pdev
->
bkgnd_and
,
&
pdev
->
bkgnd_xor
);
else
{
pdev
->
bkgnd_and
=
~
0u
;
pdev
->
bkgnd_xor
=
0
;
}
return
next
->
funcs
->
pSetBkMode
(
next
,
mode
);
}
/***********************************************************************
* dibdrv_SetDeviceClipping
*/
static
void
dibdrv_SetDeviceClipping
(
PHYSDEV
dev
,
HRGN
rgn
)
...
...
@@ -438,10 +402,8 @@ static UINT dibdrv_SetDIBColorTable( PHYSDEV dev, UINT pos, UINT count, const RG
if
(
pdev
->
dib
.
color_table
)
{
pdev
->
bkgnd_color
=
get_pixel_color
(
pdev
,
GetBkColor
(
dev
->
hdc
),
FALSE
);
update_fg_colors
(
pdev
);
update_masks
(
pdev
,
GetROP2
(
dev
->
hdc
)
);
update_brush_rop
(
pdev
,
GetROP2
(
dev
->
hdc
)
);
}
return
next
->
funcs
->
pSetDIBColorTable
(
next
,
pos
,
count
,
colors
);
}
...
...
@@ -454,7 +416,7 @@ static INT dibdrv_SetROP2( PHYSDEV dev, INT rop )
PHYSDEV
next
=
GET_NEXT_PHYSDEV
(
dev
,
pSetROP2
);
dibdrv_physdev
*
pdev
=
get_dibdrv_pdev
(
dev
);
update_
masks
(
pdev
,
rop
);
update_
brush_rop
(
pdev
,
rop
);
return
next
->
funcs
->
pSetROP2
(
next
,
rop
);
}
...
...
@@ -575,7 +537,7 @@ const struct gdi_dc_funcs dib_driver =
dibdrv_SelectPen
,
/* pSelectPen */
NULL
,
/* pSetArcDirection */
dibdrv_SetBkColor
,
/* pSetBkColor */
dibdrv_SetBkMode
,
/* pSetBkMode */
NULL
,
/* pSetBkMode */
dibdrv_SetDCBrushColor
,
/* pSetDCBrushColor */
dibdrv_SetDCPenColor
,
/* pSetDCPenColor */
dibdrv_SetDIBColorTable
,
/* pSetDIBColorTable */
...
...
dlls/gdi32/dibdrv/dibdrv.h
View file @
e166ec0b
...
...
@@ -103,9 +103,6 @@ typedef struct dibdrv_physdev
HBITMAP
brush_pattern_bitmap
;
BOOL
(
*
brush_rects
)(
struct
dibdrv_physdev
*
pdev
,
dib_info
*
dib
,
int
num
,
const
RECT
*
rects
,
HRGN
clip
);
/* background */
DWORD
bkgnd_color
,
bkgnd_and
,
bkgnd_xor
;
/* text */
DWORD
text_color
;
struct
intensity_range
glyph_intensities
[
17
];
...
...
dlls/gdi32/dibdrv/graphics.c
View file @
e166ec0b
...
...
@@ -114,16 +114,18 @@ void update_aa_ranges( dibdrv_physdev *pdev )
*
* See the comment above get_pen_bkgnd_masks
*/
static
inline
void
get_text_bkgnd_masks
(
const
dibdrv_physdev
*
pdev
,
rop_mask
*
mask
)
static
inline
void
get_text_bkgnd_masks
(
dibdrv_physdev
*
pdev
,
rop_mask
*
mask
)
{
COLORREF
bg
=
GetBkColor
(
pdev
->
dev
.
hdc
);
mask
->
and
=
0
;
if
(
pdev
->
dib
.
bit_count
!=
1
)
mask
->
xor
=
pdev
->
bkgnd_color
;
mask
->
xor
=
get_pixel_color
(
pdev
,
bg
,
FALSE
)
;
else
{
mask
->
xor
=
~
pdev
->
text_color
;
if
(
GetTextColor
(
pdev
->
dev
.
hdc
)
==
GetBkColor
(
pdev
->
dev
.
hdc
)
)
if
(
GetTextColor
(
pdev
->
dev
.
hdc
)
==
bg
)
mask
->
xor
=
pdev
->
text_color
;
}
}
...
...
dlls/gdi32/dibdrv/objects.c
View file @
e166ec0b
...
...
@@ -180,8 +180,9 @@ DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
if
(
rgbquad_equal
(
&
fg_quad
,
pdev
->
dib
.
color_table
+
1
))
return
1
;
if
(
color
==
GetBkColor
(
pdev
->
dev
.
hdc
))
return
pdev
->
bkgnd_color
;
else
return
pdev
->
bkgnd_color
?
0
:
1
;
pixel
=
get_pixel_color
(
pdev
,
GetBkColor
(
pdev
->
dev
.
hdc
),
FALSE
);
if
(
color
==
GetBkColor
(
pdev
->
dev
.
hdc
))
return
pixel
;
else
return
!
pixel
;
}
/***************************************************************************
...
...
@@ -194,17 +195,25 @@ DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
*/
static
inline
void
get_pen_bkgnd_masks
(
dibdrv_physdev
*
pdev
,
DWORD
*
and
,
DWORD
*
xor
)
{
if
(
pdev
->
dib
.
bit_count
!=
1
||
GetBkMode
(
pdev
->
dev
.
hdc
)
==
TRANSPARENT
)
DWORD
color
;
if
(
GetBkMode
(
pdev
->
dev
.
hdc
)
==
TRANSPARENT
)
{
*
and
=
~
0u
;
*
xor
=
0
;
return
;
}
if
(
pdev
->
dib
.
bit_count
!=
1
)
{
*
and
=
pdev
->
bkgnd_and
;
*
xor
=
pdev
->
bkgnd_xor
;
color
=
get_pixel_color
(
pdev
,
GetBkColor
(
pdev
->
dev
.
hdc
),
FALSE
);
}
else
{
DWORD
color
=
get_pixel_color
(
pdev
,
pdev
->
pen_colorref
,
TRUE
);
color
=
get_pixel_color
(
pdev
,
pdev
->
pen_colorref
,
TRUE
);
if
(
pdev
->
pen_colorref
!=
GetBkColor
(
pdev
->
dev
.
hdc
))
color
=
!
color
;
calc_and_xor_masks
(
GetROP2
(
pdev
->
dev
.
hdc
),
color
,
and
,
xor
);
}
calc_and_xor_masks
(
GetROP2
(
pdev
->
dev
.
hdc
),
color
,
and
,
xor
);
}
static
inline
void
get_brush_bkgnd_masks
(
dibdrv_physdev
*
pdev
,
DWORD
*
and
,
DWORD
*
xor
)
...
...
@@ -213,8 +222,8 @@ static inline void get_brush_bkgnd_masks(dibdrv_physdev *pdev, DWORD *and, DWORD
if
(
GetBkMode
(
pdev
->
dev
.
hdc
)
==
TRANSPARENT
)
{
*
and
=
pdev
->
bkgnd_and
;
*
xor
=
pdev
->
bkgnd_xor
;
*
and
=
~
0u
;
*
xor
=
0
;
}
else
{
...
...
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