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
7eab865d
Commit
7eab865d
authored
Nov 26, 2003
by
Mike McCormack
Committed by
Alexandre Julliard
Nov 26, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use the handle deletion mechanism in wmfs.
parent
5693ecd2
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
150 additions
and
59 deletions
+150
-59
graphics.c
dlls/gdi/mfdrv/graphics.c
+3
-3
init.c
dlls/gdi/mfdrv/init.c
+10
-16
metafiledrv.h
dlls/gdi/mfdrv/metafiledrv.h
+6
-2
objects.c
dlls/gdi/mfdrv/objects.c
+131
-38
No files found.
dlls/gdi/mfdrv/graphics.c
View file @
7eab865d
...
...
@@ -335,7 +335,7 @@ static INT16 MFDRV_CreateRegion(PHYSDEV dev, HRGN hrgn)
WARN
(
"MFDRV_WriteRecord failed
\n
"
);
return
-
1
;
}
return
MFDRV_AddHandle
DC
(
dev
);
return
MFDRV_AddHandle
(
dev
,
hrgn
);
}
...
...
@@ -378,7 +378,7 @@ MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush )
if
(
iRgn
==
-
1
)
return
FALSE
;
iBrush
=
MFDRV_CreateBrushIndirect
(
dev
,
hbrush
);
if
(
iBrush
==
-
1
)
if
(
!
iBrush
)
return
FALSE
;
return
MFDRV_MetaParam2
(
dev
,
META_FILLREGION
,
iRgn
,
iBrush
);
}
...
...
@@ -394,7 +394,7 @@ MFDRV_FrameRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush, INT x, INT y )
if
(
iRgn
==
-
1
)
return
FALSE
;
iBrush
=
MFDRV_CreateBrushIndirect
(
dev
,
hbrush
);
if
(
iBrush
==
-
1
)
if
(
!
iBrush
)
return
FALSE
;
return
MFDRV_MetaParam4
(
dev
,
META_FRAMEREGION
,
iRgn
,
iBrush
,
x
,
y
);
}
...
...
dlls/gdi/mfdrv/init.c
View file @
7eab865d
...
...
@@ -48,7 +48,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
NULL
,
/* pCreateDIBSection */
NULL
,
/* pDeleteBitmap */
NULL
,
/* pDeleteDC */
NULL
,
/* pDeleteObject */
MFDRV_DeleteObject
,
/* pDeleteObject */
NULL
,
/* pDescribePixelFormat */
NULL
,
/* pDeviceCapabilities */
MFDRV_Ellipse
,
/* pEllipse */
...
...
@@ -182,7 +182,10 @@ static DC *MFDRV_AllocMetaFile(void)
return
NULL
;
}
physDev
->
nextHandle
=
0
;
physDev
->
handles
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
HANDLE_LIST_INC
*
sizeof
(
physDev
->
handles
[
0
]));
physDev
->
handles_size
=
HANDLE_LIST_INC
;
physDev
->
cur_handles
=
0
;
physDev
->
hFile
=
0
;
physDev
->
mh
->
mtHeaderSize
=
sizeof
(
METAHEADER
)
/
sizeof
(
WORD
);
...
...
@@ -203,8 +206,13 @@ static BOOL MFDRV_DeleteDC( PHYSDEV dev )
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
DC
*
dc
=
physDev
->
dc
;
DWORD
index
;
if
(
physDev
->
mh
)
HeapFree
(
GetProcessHeap
(),
0
,
physDev
->
mh
);
for
(
index
=
0
;
index
<
physDev
->
handles_size
;
index
++
)
if
(
physDev
->
handles
[
index
])
GDI_hdc_not_using_object
(
physDev
->
handles
[
index
],
physDev
->
hdc
);
HeapFree
(
GetProcessHeap
(),
0
,
physDev
->
handles
);
HeapFree
(
GetProcessHeap
(),
0
,
physDev
);
dc
->
physDev
=
NULL
;
GDI_FreeObject
(
dc
->
hSelf
,
dc
);
...
...
@@ -533,20 +541,6 @@ BOOL MFDRV_MetaParam8(PHYSDEV dev, short func, short param1, short param2,
}
/******************************************************************
* MFDRV_AddHandleDC
*
* Note: this function assumes that we never delete objects.
* If we do someday, we'll need to maintain a table to re-use deleted
* handles.
*/
int
MFDRV_AddHandleDC
(
PHYSDEV
dev
)
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
physDev
->
mh
->
mtNoObjects
++
;
return
physDev
->
nextHandle
++
;
}
/**********************************************************************
* MFDRV_ExtEscape
*/
...
...
dlls/gdi/mfdrv/metafiledrv.h
View file @
7eab865d
...
...
@@ -35,10 +35,13 @@ typedef struct
HDC
hdc
;
DC
*
dc
;
METAHEADER
*
mh
;
/* Pointer to metafile header */
UINT
nextHandle
;
/* Next handle number */
UINT
handles_size
,
cur_handles
;
HGDIOBJ
*
handles
;
HANDLE
hFile
;
/* Handle for disk based MetaFile */
}
METAFILEDRV_PDEVICE
;
#define HANDLE_LIST_INC 20
extern
BOOL
MFDRV_MetaParam0
(
PHYSDEV
dev
,
short
func
);
extern
BOOL
MFDRV_MetaParam1
(
PHYSDEV
dev
,
short
func
,
short
param1
);
...
...
@@ -52,7 +55,7 @@ extern BOOL MFDRV_MetaParam8(PHYSDEV dev, short func, short param1, short param2
short
param3
,
short
param4
,
short
param5
,
short
param6
,
short
param7
,
short
param8
);
extern
BOOL
MFDRV_WriteRecord
(
PHYSDEV
dev
,
METARECORD
*
mr
,
DWORD
rlen
);
extern
int
MFDRV_AddHandleDC
(
PHYSDEV
dev
);
extern
UINT
MFDRV_AddHandle
(
PHYSDEV
dev
,
HGDIOBJ
obj
);
extern
INT16
MFDRV_CreateBrushIndirect
(
PHYSDEV
dev
,
HBRUSH
hBrush
);
/* Metafile driver functions */
...
...
@@ -68,6 +71,7 @@ extern BOOL MFDRV_Chord( PHYSDEV dev, INT left, INT top, INT right,
INT
bottom
,
INT
xstart
,
INT
ystart
,
INT
xend
,
INT
yend
);
extern
BOOL
MFDRV_CloseFigure
(
PHYSDEV
dev
);
extern
BOOL
MFDRV_DeleteObject
(
PHYSDEV
dev
,
HGDIOBJ
obj
);
extern
BOOL
MFDRV_Ellipse
(
PHYSDEV
dev
,
INT
left
,
INT
top
,
INT
right
,
INT
bottom
);
extern
BOOL
MFDRV_EndPath
(
PHYSDEV
dev
);
...
...
dlls/gdi/mfdrv/objects.c
View file @
7eab865d
...
...
@@ -29,6 +29,89 @@
WINE_DEFAULT_DEBUG_CHANNEL
(
metafile
);
/******************************************************************
* MFDRV_AddHandle
*/
UINT
MFDRV_AddHandle
(
PHYSDEV
dev
,
HGDIOBJ
obj
)
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
INT16
index
;
for
(
index
=
0
;
index
<
physDev
->
handles_size
;
index
++
)
if
(
physDev
->
handles
[
index
]
==
0
)
break
;
if
(
index
==
physDev
->
handles_size
)
{
physDev
->
handles_size
+=
HANDLE_LIST_INC
;
physDev
->
handles
=
HeapReAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
physDev
->
handles
,
physDev
->
handles_size
*
sizeof
(
physDev
->
handles
[
0
]));
}
physDev
->
handles
[
index
]
=
obj
;
physDev
->
cur_handles
++
;
if
(
physDev
->
cur_handles
>
physDev
->
mh
->
mtNoObjects
)
physDev
->
mh
->
mtNoObjects
++
;
return
index
;
/* index 0 is not reserved for metafiles */
}
/******************************************************************
* MFDRV_FindObject
*/
static
INT16
MFDRV_FindObject
(
PHYSDEV
dev
,
HGDIOBJ
obj
)
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
INT16
index
;
for
(
index
=
0
;
index
<
physDev
->
handles_size
;
index
++
)
if
(
physDev
->
handles
[
index
]
==
obj
)
break
;
if
(
index
==
physDev
->
handles_size
)
return
-
1
;
return
index
;
}
/******************************************************************
* MFDRV_DeleteObject
*/
BOOL
MFDRV_DeleteObject
(
PHYSDEV
dev
,
HGDIOBJ
obj
)
{
METARECORD
mr
;
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
INT16
index
;
BOOL
ret
=
TRUE
;
index
=
MFDRV_FindObject
(
dev
,
obj
);
if
(
index
<
0
)
return
0
;
mr
.
rdSize
=
sizeof
mr
/
2
;
mr
.
rdFunction
=
META_DELETEOBJECT
;
mr
.
rdParm
[
0
]
=
index
;
if
(
!
MFDRV_WriteRecord
(
dev
,
&
mr
,
mr
.
rdSize
*
2
))
ret
=
FALSE
;
physDev
->
handles
[
index
]
=
0
;
physDev
->
cur_handles
--
;
return
ret
;
}
/***********************************************************************
* MFDRV_SelectObject
*/
static
BOOL
MFDRV_SelectObject
(
PHYSDEV
dev
,
INT16
index
)
{
METARECORD
mr
;
mr
.
rdSize
=
sizeof
mr
/
2
;
mr
.
rdFunction
=
META_SELECTOBJECT
;
mr
.
rdParm
[
0
]
=
index
;
return
MFDRV_WriteRecord
(
dev
,
&
mr
,
mr
.
rdSize
*
2
);
}
/***********************************************************************
* MFDRV_SelectBitmap
...
...
@@ -45,11 +128,11 @@ HBITMAP MFDRV_SelectBitmap( PHYSDEV dev, HBITMAP hbitmap )
INT16
MFDRV_CreateBrushIndirect
(
PHYSDEV
dev
,
HBRUSH
hBrush
)
{
INT16
index
=
-
1
;
DWORD
size
;
METARECORD
*
mr
;
LOGBRUSH
logbrush
;
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
BOOL
r
;
if
(
!
GetObjectA
(
hBrush
,
sizeof
(
logbrush
),
&
logbrush
))
return
-
1
;
...
...
@@ -136,14 +219,14 @@ INT16 MFDRV_CreateBrushIndirect(PHYSDEV dev, HBRUSH hBrush )
}
default:
FIXME
(
"Unkonwn brush style %x
\n
"
,
logbrush
.
lbStyle
);
return
-
1
;
return
0
;
}
index
=
MFDRV_AddHandleDC
(
dev
);
if
(
!
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
))
index
=
-
1
;
r
=
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
);
HeapFree
(
GetProcessHeap
(),
0
,
mr
);
if
(
!
r
)
return
-
1
;
done:
return
index
;
return
MFDRV_AddHandle
(
dev
,
hBrush
)
;
}
...
...
@@ -152,39 +235,35 @@ done:
*/
HBRUSH
MFDRV_SelectBrush
(
PHYSDEV
dev
,
HBRUSH
hbrush
)
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
INT16
index
;
METARECORD
mr
;
index
=
MFDRV_FindObject
(
dev
,
hbrush
);
if
(
index
<
0
)
{
index
=
MFDRV_CreateBrushIndirect
(
dev
,
hbrush
);
if
(
index
==
-
1
)
return
0
;
mr
.
rdSize
=
sizeof
(
mr
)
/
2
;
mr
.
rdFunction
=
META_SELECTOBJECT
;
mr
.
rdParm
[
0
]
=
index
;
return
MFDRV_WriteRecord
(
dev
,
&
mr
,
mr
.
rdSize
*
2
)
?
hbrush
:
0
;
if
(
index
<
0
)
return
0
;
GDI_hdc_using_object
(
hbrush
,
physDev
->
hdc
);
}
return
MFDRV_SelectObject
(
dev
,
index
)
?
hbrush
:
HGDI_ERROR
;
}
/******************************************************************
* MFDRV_CreateFontIndirect
*/
static
BOOL
MFDRV_CreateFontIndirect
(
PHYSDEV
dev
,
HFONT
hFont
,
LOGFONT16
*
logfont
)
static
UINT16
MFDRV_CreateFontIndirect
(
PHYSDEV
dev
,
HFONT
hFont
,
LOGFONT16
*
logfont
)
{
int
index
;
char
buffer
[
sizeof
(
METARECORD
)
-
2
+
sizeof
(
LOGFONT16
)];
METARECORD
*
mr
=
(
METARECORD
*
)
&
buffer
;
mr
->
rdSize
=
(
sizeof
(
METARECORD
)
+
sizeof
(
LOGFONT16
)
-
2
)
/
2
;
mr
->
rdFunction
=
META_CREATEFONTINDIRECT
;
memcpy
(
&
(
mr
->
rdParm
),
logfont
,
sizeof
(
LOGFONT16
));
if
(
!
(
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
)))
return
FALSE
;
mr
->
rdSize
=
sizeof
(
METARECORD
)
/
2
;
mr
->
rdFunction
=
META_SELECTOBJECT
;
if
((
index
=
MFDRV_AddHandleDC
(
dev
))
==
-
1
)
return
FALSE
;
*
(
mr
->
rdParm
)
=
index
;
return
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
);
if
(
!
(
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
)))
return
0
;
return
MFDRV_AddHandle
(
dev
,
hFont
);
}
...
...
@@ -193,33 +272,37 @@ static BOOL MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONT16 *logfon
*/
HFONT
MFDRV_SelectFont
(
PHYSDEV
dev
,
HFONT
hfont
)
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
LOGFONT16
lf16
;
INT16
index
;
if
(
!
GetObject16
(
HFONT_16
(
hfont
),
sizeof
(
lf16
),
&
lf16
))
return
HGDI_ERROR
;
if
(
MFDRV_CreateFontIndirect
(
dev
,
hfont
,
&
lf16
))
return
0
;
index
=
MFDRV_FindObject
(
dev
,
hfont
);
if
(
index
<
0
)
{
if
(
!
GetObject16
(
HFONT_16
(
hfont
),
sizeof
(
lf16
),
&
lf16
))
return
HGDI_ERROR
;
index
=
MFDRV_CreateFontIndirect
(
dev
,
hfont
,
&
lf16
);
if
(
index
<
0
)
return
HGDI_ERROR
;
GDI_hdc_using_object
(
hfont
,
physDev
->
hdc
);
}
return
MFDRV_SelectObject
(
dev
,
index
)
?
hfont
:
HGDI_ERROR
;
}
/******************************************************************
* MFDRV_CreatePenIndirect
*/
static
BOOL
MFDRV_CreatePenIndirect
(
PHYSDEV
dev
,
HPEN
hPen
,
LOGPEN16
*
logpen
)
static
UINT16
MFDRV_CreatePenIndirect
(
PHYSDEV
dev
,
HPEN
hPen
,
LOGPEN16
*
logpen
)
{
int
index
;
char
buffer
[
sizeof
(
METARECORD
)
-
2
+
sizeof
(
*
logpen
)];
METARECORD
*
mr
=
(
METARECORD
*
)
&
buffer
;
mr
->
rdSize
=
(
sizeof
(
METARECORD
)
+
sizeof
(
*
logpen
)
-
2
)
/
2
;
mr
->
rdFunction
=
META_CREATEPENINDIRECT
;
memcpy
(
&
(
mr
->
rdParm
),
logpen
,
sizeof
(
*
logpen
));
if
(
!
(
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
)))
return
FALSE
;
mr
->
rdSize
=
sizeof
(
METARECORD
)
/
2
;
mr
->
rdFunction
=
META_SELECTOBJECT
;
if
((
index
=
MFDRV_AddHandleDC
(
dev
))
==
-
1
)
return
FALSE
;
*
(
mr
->
rdParm
)
=
index
;
return
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
);
if
(
!
(
MFDRV_WriteRecord
(
dev
,
mr
,
mr
->
rdSize
*
2
)))
return
0
;
return
MFDRV_AddHandle
(
dev
,
hPen
);
}
...
...
@@ -228,11 +311,21 @@ static BOOL MFDRV_CreatePenIndirect(PHYSDEV dev, HPEN hPen, LOGPEN16 *logpen)
*/
HPEN
MFDRV_SelectPen
(
PHYSDEV
dev
,
HPEN
hpen
)
{
METAFILEDRV_PDEVICE
*
physDev
=
(
METAFILEDRV_PDEVICE
*
)
dev
;
LOGPEN16
logpen
;
INT16
index
;
if
(
!
GetObject16
(
HPEN_16
(
hpen
),
sizeof
(
logpen
),
&
logpen
))
return
0
;
if
(
MFDRV_CreatePenIndirect
(
dev
,
hpen
,
&
logpen
))
return
hpen
;
index
=
MFDRV_FindObject
(
dev
,
hpen
);
if
(
index
<
0
)
{
if
(
!
GetObject16
(
HPEN_16
(
hpen
),
sizeof
(
logpen
),
&
logpen
))
return
0
;
index
=
MFDRV_CreatePenIndirect
(
dev
,
hpen
,
&
logpen
);
if
(
index
<
0
)
return
0
;
GDI_hdc_using_object
(
hpen
,
physDev
->
hdc
);
}
return
MFDRV_SelectObject
(
dev
,
index
)
?
hpen
:
HGDI_ERROR
;
}
...
...
@@ -258,7 +351,7 @@ static BOOL MFDRV_CreatePalette(PHYSDEV dev, HPALETTE hPalette, LOGPALETTE* logP
mr
->
rdSize
=
sizeof
(
METARECORD
)
/
sizeof
(
WORD
);
mr
->
rdFunction
=
META_SELECTPALETTE
;
if
((
index
=
MFDRV_AddHandle
DC
(
dev
))
==
-
1
)
ret
=
FALSE
;
if
((
index
=
MFDRV_AddHandle
(
dev
,
hPalette
))
==
-
1
)
ret
=
FALSE
;
else
{
*
(
mr
->
rdParm
)
=
index
;
...
...
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