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
8f929ae0
Commit
8f929ae0
authored
Dec 22, 2011
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Add a common helper for computing pen and brush masks.
parent
56532d0c
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
25 additions
and
55 deletions
+25
-55
dibdrv.h
dlls/gdi32/dibdrv/dibdrv.h
+0
-1
objects.c
dlls/gdi32/dibdrv/objects.c
+25
-54
No files found.
dlls/gdi32/dibdrv/dibdrv.h
View file @
8f929ae0
...
...
@@ -213,7 +213,6 @@ typedef struct
}
bres_params
;
extern
void
get_rop_codes
(
INT
rop
,
struct
rop_codes
*
codes
)
DECLSPEC_HIDDEN
;
extern
void
calc_and_xor_masks
(
INT
rop
,
DWORD
color
,
DWORD
*
and
,
DWORD
*
xor
)
DECLSPEC_HIDDEN
;
extern
void
update_brush_rop
(
dibdrv_physdev
*
pdev
,
INT
rop
)
DECLSPEC_HIDDEN
;
extern
void
reset_dash_origin
(
dibdrv_physdev
*
pdev
)
DECLSPEC_HIDDEN
;
extern
void
init_dib_info_from_bitmapinfo
(
dib_info
*
dib
,
const
BITMAPINFO
*
info
,
void
*
bits
,
enum
dib_info_flags
flags
)
DECLSPEC_HIDDEN
;
...
...
dlls/gdi32/dibdrv/objects.c
View file @
8f929ae0
...
...
@@ -94,7 +94,7 @@ void get_rop_codes(INT rop, struct rop_codes *codes)
codes
->
x2
=
rop2_xor_array
[
rop
-
1
][
1
];
}
void
calc_and_xor_masks
(
INT
rop
,
DWORD
color
,
DWORD
*
and
,
DWORD
*
xor
)
static
inline
void
calc_and_xor_masks
(
INT
rop
,
DWORD
color
,
DWORD
*
and
,
DWORD
*
xor
)
{
struct
rop_codes
codes
;
get_rop_codes
(
rop
,
&
codes
);
...
...
@@ -103,6 +103,11 @@ void calc_and_xor_masks(INT rop, DWORD color, DWORD *and, DWORD *xor)
*
xor
=
(
color
&
codes
.
x1
)
^
codes
.
x2
;
}
static
inline
void
calc_rop_masks
(
INT
rop
,
DWORD
color
,
rop_mask
*
masks
)
{
calc_and_xor_masks
(
rop
,
color
,
&
masks
->
and
,
&
masks
->
xor
);
}
static
inline
RGBQUAD
rgbquad_from_colorref
(
COLORREF
c
)
{
RGBQUAD
ret
;
...
...
@@ -186,58 +191,30 @@ DWORD get_pixel_color( dibdrv_physdev *pdev, COLORREF color, BOOL mono_fixup )
}
/***************************************************************************
* get_
pen_bkgnd
_masks
* get_
color
_masks
*
* Returns the pre-calculated bkgnd color masks unless the dib is 1 bpp.
* In this case since there are several fg sources (pen, brush, text)
* this makes pdev->bkgnd_color unusable. So here we take the inverse
* Returns the color masks unless the dib is 1 bpp. In this case since
* there are several fg sources (pen, brush, text) we take as bg the inverse
* of the relevant fg color (which is always set up correctly).
*/
static
inline
void
get_pen_bkgnd_masks
(
dibdrv_physdev
*
pdev
,
DWORD
*
and
,
DWORD
*
xor
)
static
inline
void
get_color_masks
(
dibdrv_physdev
*
pdev
,
UINT
rop
,
COLORREF
colorref
,
rop_mask
*
fg_mask
,
rop_mask
*
bg_mask
)
{
DWORD
color
;
DWORD
color
=
get_pixel_color
(
pdev
,
colorref
,
TRUE
);
calc_rop_masks
(
rop
,
color
,
fg_mask
);
if
(
GetBkMode
(
pdev
->
dev
.
hdc
)
==
TRANSPARENT
)
{
*
and
=
~
0u
;
*
xor
=
0
;
bg_mask
->
and
=
~
0u
;
bg_mask
->
xor
=
0
;
return
;
}
if
(
pdev
->
dib
.
bit_count
!=
1
)
{
color
=
get_pixel_color
(
pdev
,
GetBkColor
(
pdev
->
dev
.
hdc
),
FALSE
);
}
else
{
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
);
}
static
inline
void
get_brush_bkgnd_masks
(
dibdrv_physdev
*
pdev
,
DWORD
*
and
,
DWORD
*
xor
)
{
DWORD
color
;
if
(
pdev
->
dib
.
bit_count
!=
1
)
color
=
get_pixel_color
(
pdev
,
GetBkColor
(
pdev
->
dev
.
hdc
),
FALSE
);
else
if
(
colorref
!=
GetBkColor
(
pdev
->
dev
.
hdc
))
color
=
!
color
;
if
(
GetBkMode
(
pdev
->
dev
.
hdc
)
==
TRANSPARENT
)
{
*
and
=
~
0u
;
*
xor
=
0
;
}
else
{
if
(
pdev
->
dib
.
bit_count
==
1
)
{
if
(
pdev
->
brush_colorref
==
GetBkColor
(
pdev
->
dev
.
hdc
))
color
=
get_pixel_color
(
pdev
,
pdev
->
brush_colorref
,
TRUE
);
else
color
=
~
get_pixel_color
(
pdev
,
pdev
->
brush_colorref
,
TRUE
);
}
else
color
=
get_pixel_color
(
pdev
,
GetBkColor
(
pdev
->
dev
.
hdc
),
FALSE
);
calc_and_xor_masks
(
pdev
->
brush_rop
,
color
,
and
,
xor
);
}
calc_rop_masks
(
rop
,
color
,
bg_mask
);
}
static
inline
void
order_end_points
(
int
*
s
,
int
*
e
)
...
...
@@ -982,12 +959,9 @@ static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
static
BOOL
dashed_pen_lines
(
dibdrv_physdev
*
pdev
,
int
num
,
POINT
*
pts
,
BOOL
close
)
{
int
i
;
DWORD
color
;
color
=
get_pixel_color
(
pdev
,
pdev
->
pen_colorref
,
TRUE
);
get_pen_bkgnd_masks
(
pdev
,
&
pdev
->
dash_masks
[
0
].
and
,
&
pdev
->
dash_masks
[
0
].
xor
);
calc_and_xor_masks
(
GetROP2
(
pdev
->
dev
.
hdc
),
color
,
&
pdev
->
dash_masks
[
1
].
and
,
&
pdev
->
dash_masks
[
1
].
xor
);
get_color_masks
(
pdev
,
GetROP2
(
pdev
->
dev
.
hdc
),
pdev
->
pen_colorref
,
&
pdev
->
dash_masks
[
1
],
&
pdev
->
dash_masks
[
0
]
);
assert
(
num
>=
2
);
for
(
i
=
0
;
i
<
num
-
1
;
i
++
)
...
...
@@ -1287,7 +1261,7 @@ static BOOL wide_pen_lines(dibdrv_physdev *pdev, int num, POINT *pts, BOOL close
HRGN
region
;
DWORD
pen_color
=
get_pixel_color
(
pdev
,
pdev
->
pen_colorref
,
TRUE
);
calc_
and_xor_masks
(
GetROP2
(
pdev
->
dev
.
hdc
),
pen_color
,
&
color
.
and
,
&
color
.
x
or
);
calc_
rop_masks
(
GetROP2
(
pdev
->
dev
.
hdc
),
pen_color
,
&
col
or
);
region
=
get_wide_lines_region
(
pdev
,
num
,
pts
,
close
);
...
...
@@ -1455,7 +1429,7 @@ static BOOL solid_brush(dibdrv_physdev *pdev, dib_info *dib, int num, const RECT
rop_mask
brush_color
;
DWORD
color
=
get_pixel_color
(
pdev
,
pdev
->
brush_colorref
,
TRUE
);
calc_
and_xor_masks
(
pdev
->
brush_rop
,
color
,
&
brush_color
.
and
,
&
brush_color
.
x
or
);
calc_
rop_masks
(
pdev
->
brush_rop
,
color
,
&
brush_col
or
);
solid_rects
(
dib
,
num
,
rects
,
&
brush_color
,
region
);
return
TRUE
;
}
...
...
@@ -1519,7 +1493,7 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
dib_info
hatch
;
rop_mask
fg_mask
,
bg_mask
;
rop_mask_bits
mask_bits
;
DWORD
size
,
color
;
DWORD
size
;
BOOL
ret
;
assert
(
pdev
->
brush_and_bits
==
NULL
);
...
...
@@ -1553,10 +1527,7 @@ static BOOL create_hatch_brush_bits(dibdrv_physdev *pdev)
hatch
.
bits
.
free
=
hatch
.
bits
.
param
=
NULL
;
hatch
.
bits
.
is_copy
=
FALSE
;
color
=
get_pixel_color
(
pdev
,
pdev
->
brush_colorref
,
TRUE
);
calc_and_xor_masks
(
pdev
->
brush_rop
,
color
,
&
fg_mask
.
and
,
&
fg_mask
.
xor
);
get_brush_bkgnd_masks
(
pdev
,
&
bg_mask
.
and
,
&
bg_mask
.
xor
);
get_color_masks
(
pdev
,
pdev
->
brush_rop
,
pdev
->
brush_colorref
,
&
fg_mask
,
&
bg_mask
);
ret
=
pdev
->
brush_dib
.
funcs
->
create_rop_masks
(
&
pdev
->
brush_dib
,
&
hatch
,
&
fg_mask
,
&
bg_mask
,
&
mask_bits
);
if
(
!
ret
)
free_pattern_brush_bits
(
pdev
);
...
...
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