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
d53ad9c3
Commit
d53ad9c3
authored
Mar 30, 2006
by
Dmitry Timoshkov
Committed by
Alexandre Julliard
Mar 30, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32: Add a test for WMF->EMF conversions performed by SetWinMetaFileBits.
These tests currently fail in Wine.
parent
70afa921
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
179 additions
and
9 deletions
+179
-9
metafile.c
dlls/gdi/tests/metafile.c
+179
-9
No files found.
dlls/gdi/tests/metafile.c
View file @
d53ad9c3
...
...
@@ -371,7 +371,7 @@ void test_SaveDC(void)
/* with the nominal results. */
/* Maximum size of sample metafiles in bytes. */
#define MF_BUFSIZE
256
#define MF_BUFSIZE
512
/* 8x8 bitmap data for a pattern brush */
static
const
unsigned
char
SAMPLE_PATTERN_BRUSH
[]
=
{
...
...
@@ -468,13 +468,137 @@ static const unsigned char EMF_TEXTOUT_ON_PATH_BITS[] =
0x14
,
0x00
,
0x00
,
0x00
};
static
const
unsigned
char
MF_LINETO_BITS
[]
=
{
0x01
,
0x00
,
0x09
,
0x00
,
0x00
,
0x03
,
0x11
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x13
,
0x02
,
0x0f
,
0x00
,
0x37
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
};
static
const
unsigned
char
EMF_LINETO_BITS
[]
=
{
0x01
,
0x00
,
0x00
,
0x00
,
0x6c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x37
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x61
,
0x06
,
0x00
,
0x00
,
0xb7
,
0x01
,
0x00
,
0x00
,
0x20
,
0x45
,
0x4d
,
0x46
,
0x00
,
0x00
,
0x01
,
0x00
,
0x38
,
0x01
,
0x00
,
0x00
,
0x0b
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x7c
,
0x01
,
0x00
,
0x00
,
0x2c
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x60
,
0xcc
,
0x05
,
0x00
,
0xe0
,
0x93
,
0x04
,
0x00
,
0x46
,
0x00
,
0x00
,
0x00
,
0x48
,
0x00
,
0x00
,
0x00
,
0x3a
,
0x00
,
0x00
,
0x00
,
0x47
,
0x44
,
0x49
,
0x43
,
0x01
,
0x00
,
0x00
,
0x80
,
0x00
,
0x03
,
0x00
,
0x00
,
0x60
,
0xe5
,
0xf4
,
0x73
,
0x00
,
0x00
,
0x00
,
0x00
,
0x22
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x09
,
0x00
,
0x00
,
0x03
,
0x11
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x13
,
0x02
,
0x0f
,
0x00
,
0x37
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x11
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x08
,
0x00
,
0x00
,
0x00
,
0x0b
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x09
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x36
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x37
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x00
,
0x25
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x07
,
0x00
,
0x00
,
0x80
,
0x25
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x80
,
0x30
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x80
,
0x4b
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x0e
,
0x00
,
0x00
,
0x00
,
0x14
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x14
,
0x00
,
0x00
,
0x00
};
static
const
unsigned
char
EMF_LINETO_MM_ANISOTROPIC_BITS
[]
=
{
0x01
,
0x00
,
0x00
,
0x00
,
0x6c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x37
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x64
,
0x00
,
0x00
,
0x00
,
0x64
,
0x00
,
0x00
,
0x00
,
0x20
,
0x45
,
0x4d
,
0x46
,
0x00
,
0x00
,
0x01
,
0x00
,
0x38
,
0x01
,
0x00
,
0x00
,
0x0b
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x7c
,
0x01
,
0x00
,
0x00
,
0x2c
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x60
,
0xcc
,
0x05
,
0x00
,
0xe0
,
0x93
,
0x04
,
0x00
,
0x46
,
0x00
,
0x00
,
0x00
,
0x48
,
0x00
,
0x00
,
0x00
,
0x3a
,
0x00
,
0x00
,
0x00
,
0x47
,
0x44
,
0x49
,
0x43
,
0x01
,
0x00
,
0x00
,
0x80
,
0x00
,
0x03
,
0x00
,
0x00
,
0xa4
,
0xfe
,
0xf4
,
0x73
,
0x00
,
0x00
,
0x00
,
0x00
,
0x22
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x09
,
0x00
,
0x00
,
0x03
,
0x11
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x13
,
0x02
,
0x0f
,
0x00
,
0x37
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x11
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x08
,
0x00
,
0x00
,
0x00
,
0x0b
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x09
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x36
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x37
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x00
,
0x25
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x07
,
0x00
,
0x00
,
0x80
,
0x25
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x80
,
0x30
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x80
,
0x4b
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x0e
,
0x00
,
0x00
,
0x00
,
0x14
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x14
,
0x00
,
0x00
,
0x00
};
static
const
unsigned
char
EMF_LINETO_MM_TEXT_BITS
[]
=
{
0x01
,
0x00
,
0x00
,
0x00
,
0x6c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x37
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x61
,
0x06
,
0x00
,
0x00
,
0xb7
,
0x01
,
0x00
,
0x00
,
0x20
,
0x45
,
0x4d
,
0x46
,
0x00
,
0x00
,
0x01
,
0x00
,
0xe4
,
0x00
,
0x00
,
0x00
,
0x09
,
0x00
,
0x00
,
0x00
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x7c
,
0x01
,
0x00
,
0x00
,
0x2c
,
0x01
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x60
,
0xcc
,
0x05
,
0x00
,
0xe0
,
0x93
,
0x04
,
0x00
,
0x0b
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x09
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x04
,
0x00
,
0x00
,
0x36
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x37
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x00
,
0x25
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x07
,
0x00
,
0x00
,
0x80
,
0x25
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x80
,
0x30
,
0x00
,
0x00
,
0x00
,
0x0c
,
0x00
,
0x00
,
0x00
,
0x0f
,
0x00
,
0x00
,
0x80
,
0x4b
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x05
,
0x00
,
0x00
,
0x00
,
0x0e
,
0x00
,
0x00
,
0x00
,
0x14
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x10
,
0x00
,
0x00
,
0x00
,
0x14
,
0x00
,
0x00
,
0x00
};
/* For debugging or dumping the raw metafiles produced by
* new test functions.
*/
static
INT
CALLBACK
mf_enum_proc
(
HDC
hdc
,
HANDLETABLE
*
ht
,
METARECORD
*
mr
,
INT
nobj
,
LPARAM
param
)
{
trace
(
"hdc %p, mr->rdFunction %
d
, mr->rdSize %lu, param %p
\n
"
,
trace
(
"hdc %p, mr->rdFunction %
04x
, mr->rdSize %lu, param %p
\n
"
,
hdc
,
mr
->
rdFunction
,
mr
->
rdSize
,
(
void
*
)
param
);
return
TRUE
;
}
...
...
@@ -485,7 +609,7 @@ static INT CALLBACK mf_enum_proc(HDC hdc, HANDLETABLE *ht, METARECORD *mr,
static
void
dump_mf_bits
(
const
HMETAFILE
mf
,
const
char
*
desc
)
{
char
buf
[
MF_BUFSIZE
];
BYTE
buf
[
MF_BUFSIZE
];
UINT
mfsize
,
i
;
mfsize
=
GetMetaFileBitsEx
(
mf
,
MF_BUFSIZE
,
buf
);
...
...
@@ -494,7 +618,7 @@ static void dump_mf_bits (const HMETAFILE mf, const char *desc)
printf
(
"MetaFile %s has bits:
\n
{
\n
"
,
desc
);
for
(
i
=
0
;
i
<
mfsize
;
i
++
)
{
printf
(
"0x%
.2hh
x"
,
buf
[
i
]);
printf
(
"0x%
02
x"
,
buf
[
i
]);
if
(
i
==
mfsize
-
1
)
printf
(
"
\n
"
);
else
if
(
i
%
8
==
7
)
...
...
@@ -610,7 +734,7 @@ static void dump_emf_records(const HENHMETAFILE mf, const char *desc)
UINT
mfsize
,
offset
;
mfsize
=
GetEnhMetaFileBits
(
mf
,
MF_BUFSIZE
,
buf
);
ok
(
mfsize
>
0
,
"%s: GetEnhMetaFileBits
failed
\n
"
,
desc
);
ok
(
mfsize
>
0
,
"%s: GetEnhMetaFileBits
error %ld
\n
"
,
desc
,
GetLastError
()
);
printf
(
"EMF %s has records:
\n
"
,
desc
);
...
...
@@ -619,7 +743,7 @@ static void dump_emf_records(const HENHMETAFILE mf, const char *desc)
while
(
offset
<
mfsize
)
{
EMR
*
emr
=
(
EMR
*
)(
emf
+
offset
);
trace
(
"emr->iType %ld, emr->nSize %lu
\n
"
,
emr
->
iType
,
emr
->
nSize
);
printf
(
"emr->iType %ld, emr->nSize %lu
\n
"
,
emr
->
iType
,
emr
->
nSize
);
/*trace("emr->iType 0x%04lx, emr->nSize 0x%04lx\n", emr->iType, emr->nSize);*/
offset
+=
emr
->
nSize
;
}
...
...
@@ -639,13 +763,22 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
int
diff
;
mfsize
=
GetEnhMetaFileBits
(
mf
,
MF_BUFSIZE
,
buf
);
ok
(
mfsize
>
0
,
"%s: GetEnhMetaFileBits
failed
\n
"
,
desc
);
ok
(
mfsize
>
0
,
"%s: GetEnhMetaFileBits
error %ld
\n
"
,
desc
,
GetLastError
()
);
if
(
mfsize
<
MF_BUFSIZE
)
{
if
(
mfsize
!=
bsize
&&
todo
)
{
todo_wine
ok
(
mfsize
==
bsize
,
"%s: mfsize=%d, bsize=%d
\n
"
,
desc
,
mfsize
,
bsize
);
}
else
ok
(
mfsize
==
bsize
,
"%s: mfsize=%d, bsize=%d
\n
"
,
desc
,
mfsize
,
bsize
);
}
else
ok
(
bsize
>=
MF_BUFSIZE
,
"%s: mfsize > bufsize (%d bytes), bsize=%d
\n
"
,
desc
,
mfsize
,
bsize
);
if
(
mfsize
!=
bsize
)
return
-
1
;
...
...
@@ -662,7 +795,7 @@ static int compare_emf_bits(const HENHMETAFILE mf, const unsigned char *bits,
ok
(
diff
==
0
,
"%s: mfsize=%d, bsize=%d, diff=%d
\n
"
,
desc
,
mfsize
,
bsize
,
diff
);
}
return
0
;
return
diff
;
}
else
{
...
...
@@ -1027,7 +1160,10 @@ static INT CALLBACK EmfEnumProc(HDC hdc, HANDLETABLE *lpHTable, const ENHMETAREC
* until a record is played which actually outputs something */
PlayEnhMetaFileRecord
(
hdc
,
lpHTable
,
lpEMFR
,
nObj
);
LPtoDP
(
hdc
,
mapping
,
2
);
trace
(
"Meta record: iType = %ld, (%ld,%ld)-(%ld,%ld)
\n
"
,
lpEMFR
->
iType
,
mapping
[
0
].
x
,
mapping
[
0
].
y
,
mapping
[
1
].
x
,
mapping
[
1
].
y
);
trace
(
"Meta record: iType %ld, nSize %ld, (%ld,%ld)-(%ld,%ld)
\n
"
,
lpEMFR
->
iType
,
lpEMFR
->
nSize
,
mapping
[
0
].
x
,
mapping
[
0
].
y
,
mapping
[
1
].
x
,
mapping
[
1
].
y
);
if
(
lpEMFR
->
iType
==
EMR_LINETO
)
{
INT
x0
,
y0
,
x1
,
y1
;
...
...
@@ -1069,6 +1205,13 @@ static HENHMETAFILE create_converted_emf(const METAFILEPICT *mfp)
ok
(
ret
,
"LineTo failed with error %ld
\n
"
,
GetLastError
());
hmf
=
CloseMetaFile
(
hdcMf
);
ok
(
hmf
!=
NULL
,
"CloseMetaFile failed with error %ld
\n
"
,
GetLastError
());
if
(
compare_mf_bits
(
hmf
,
MF_LINETO_BITS
,
sizeof
(
MF_LINETO_BITS
),
"mf_LineTo"
)
!=
0
)
{
dump_mf_bits
(
hmf
,
"mf_LineTo"
);
EnumMetaFile
(
0
,
hmf
,
mf_enum_proc
,
0
);
}
size
=
GetMetaFileBitsEx
(
hmf
,
0
,
NULL
);
ok
(
size
,
"GetMetaFileBitsEx failed with error %ld
\n
"
,
GetLastError
());
pBits
=
HeapAlloc
(
GetProcessHeap
(),
0
,
size
);
...
...
@@ -1090,7 +1233,16 @@ static void test_mf_conversions(void)
mfp
.
yExt
=
100
;
mfp
.
hMF
=
NULL
;
hemf
=
create_converted_emf
(
&
mfp
);
if
(
compare_emf_bits
(
hemf
,
EMF_LINETO_MM_ANISOTROPIC_BITS
,
sizeof
(
EMF_LINETO_MM_ANISOTROPIC_BITS
),
"emf_LineTo MM_ANISOTROPIC"
,
TRUE
)
!=
0
)
{
dump_emf_bits
(
hemf
,
"emf_LineTo MM_ANISOTROPIC"
);
dump_emf_records
(
hemf
,
"emf_LineTo MM_ANISOTROPIC"
);
}
EnumEnhMetaFile
(
hdcOffscreen
,
hemf
,
EmfEnumProc
,
&
mfp
,
&
rect
);
DeleteEnhMetaFile
(
hemf
);
DeleteDC
(
hdcOffscreen
);
}
...
...
@@ -1106,7 +1258,16 @@ static void test_mf_conversions(void)
mfp
.
yExt
=
0
;
mfp
.
hMF
=
NULL
;
hemf
=
create_converted_emf
(
&
mfp
);
if
(
compare_emf_bits
(
hemf
,
EMF_LINETO_MM_TEXT_BITS
,
sizeof
(
EMF_LINETO_MM_TEXT_BITS
),
"emf_LineTo MM_TEXT"
,
TRUE
)
!=
0
)
{
dump_emf_bits
(
hemf
,
"emf_LineTo MM_TEXT"
);
dump_emf_records
(
hemf
,
"emf_LineTo MM_TEXT"
);
}
EnumEnhMetaFile
(
hdcOffscreen
,
hemf
,
EmfEnumProc
,
&
mfp
,
&
rect
);
DeleteEnhMetaFile
(
hemf
);
DeleteDC
(
hdcOffscreen
);
}
...
...
@@ -1117,7 +1278,16 @@ static void test_mf_conversions(void)
HENHMETAFILE
hemf
;
RECT
rect
=
{
0
,
0
,
100
,
100
};
hemf
=
create_converted_emf
(
NULL
);
if
(
compare_emf_bits
(
hemf
,
EMF_LINETO_BITS
,
sizeof
(
EMF_LINETO_BITS
),
"emf_LineTo NULL"
,
TRUE
)
!=
0
)
{
dump_emf_bits
(
hemf
,
"emf_LineTo NULL"
);
dump_emf_records
(
hemf
,
"emf_LineTo NULL"
);
}
EnumEnhMetaFile
(
hdcOffscreen
,
hemf
,
EmfEnumProc
,
NULL
,
&
rect
);
DeleteEnhMetaFile
(
hemf
);
DeleteDC
(
hdcOffscreen
);
}
...
...
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