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
9db0d763
Commit
9db0d763
authored
Jan 08, 2020
by
Nikolay Sivov
Committed by
Alexandre Julliard
Jan 08, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
gdi32/tests: Remove some workarounds in font tests.
Signed-off-by:
Nikolay Sivov
<
nsivov@codeweavers.com
>
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
464bbdcf
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
34 additions
and
57 deletions
+34
-57
font.c
dlls/gdi32/tests/font.c
+34
-57
No files found.
dlls/gdi32/tests/font.c
View file @
9db0d763
...
...
@@ -42,15 +42,10 @@ static inline BOOL match_off_by_n(int a, int b, unsigned int n)
static
LONG
(
WINAPI
*
pGdiGetCharDimensions
)(
HDC
hdc
,
LPTEXTMETRICW
lptm
,
LONG
*
height
);
static
DWORD
(
WINAPI
*
pGdiGetCodePage
)(
HDC
hdc
);
static
BOOL
(
WINAPI
*
pGetCharABCWidthsI
)(
HDC
hdc
,
UINT
first
,
UINT
count
,
LPWORD
glyphs
,
LPABC
abc
);
static
BOOL
(
WINAPI
*
pGetCharABCWidthsA
)(
HDC
hdc
,
UINT
first
,
UINT
last
,
LPABC
abc
);
static
BOOL
(
WINAPI
*
pGetCharABCWidthsW
)(
HDC
hdc
,
UINT
first
,
UINT
last
,
LPABC
abc
);
static
BOOL
(
WINAPI
*
pGetCharABCWidthsFloatW
)(
HDC
hdc
,
UINT
first
,
UINT
last
,
LPABCFLOAT
abc
);
static
BOOL
(
WINAPI
*
pGetCharWidth32A
)(
HDC
hdc
,
UINT
first
,
UINT
last
,
LPINT
buffer
);
static
BOOL
(
WINAPI
*
pGetCharWidth32W
)(
HDC
hdc
,
UINT
first
,
UINT
last
,
LPINT
buffer
);
static
BOOL
(
WINAPI
*
pGetCharWidthInfo
)(
HDC
hdc
,
void
*
);
static
DWORD
(
WINAPI
*
pGetFontUnicodeRanges
)(
HDC
hdc
,
LPGLYPHSET
lpgs
);
static
DWORD
(
WINAPI
*
pGetGlyphIndicesA
)(
HDC
hdc
,
LPCSTR
lpstr
,
INT
count
,
LPWORD
pgi
,
DWORD
flags
);
static
DWORD
(
WINAPI
*
pGetGlyphIndicesW
)(
HDC
hdc
,
LPCWSTR
lpstr
,
INT
count
,
LPWORD
pgi
,
DWORD
flags
);
static
BOOL
(
WINAPI
*
pGetTextExtentExPointI
)(
HDC
hdc
,
const
WORD
*
indices
,
INT
count
,
INT
max_ext
,
LPINT
nfit
,
LPINT
dxs
,
LPSIZE
size
);
...
...
@@ -89,15 +84,10 @@ static void init(void)
pGdiGetCharDimensions
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GdiGetCharDimensions"
);
pGdiGetCodePage
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GdiGetCodePage"
);
pGetCharABCWidthsI
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharABCWidthsI"
);
pGetCharABCWidthsA
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharABCWidthsA"
);
pGetCharABCWidthsW
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharABCWidthsW"
);
pGetCharABCWidthsFloatW
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharABCWidthsFloatW"
);
pGetCharWidth32A
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharWidth32A"
);
pGetCharWidth32W
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharWidth32W"
);
pGetCharWidthInfo
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetCharWidthInfo"
);
pGetFontUnicodeRanges
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetFontUnicodeRanges"
);
pGetGlyphIndicesA
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetGlyphIndicesA"
);
pGetGlyphIndicesW
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetGlyphIndicesW"
);
pGetTextExtentExPointI
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GetTextExtentExPointI"
);
pGdiRealizationInfo
=
(
void
*
)
GetProcAddress
(
hgdi32
,
"GdiRealizationInfo"
);
...
...
@@ -1137,13 +1127,13 @@ static void ABCWidths_helper(const char* description, HDC hdc, WORD *glyphs, con
ABCFLOAT
abcf
[
1
];
BOOL
ret
=
FALSE
;
ret
=
p
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
abc
);
ret
=
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
abc
);
ok
(
ret
,
"%s: GetCharABCWidthsI should have succeeded
\n
"
,
description
);
ok
((
INT
)
abc
->
abcB
>
0
,
"%s: abcB should be positive
\n
"
,
description
);
ok
(
abc
->
abcA
*
base_abci
->
abcA
>=
0
,
"%s: abcA's sign should be unchanged
\n
"
,
description
);
ok
(
abc
->
abcC
*
base_abci
->
abcC
>=
0
,
"%s: abcC's sign should be unchanged
\n
"
,
description
);
ret
=
p
GetCharABCWidthsW
(
hdc
,
'i'
,
'i'
,
abc
);
ret
=
GetCharABCWidthsW
(
hdc
,
'i'
,
'i'
,
abc
);
ok
(
ret
,
"%s: GetCharABCWidthsW should have succeeded
\n
"
,
description
);
ok
((
INT
)
abc
->
abcB
>
0
,
"%s: abcB should be positive
\n
"
,
description
);
ok
(
abc
->
abcA
*
base_abcw
->
abcA
>=
0
,
"%s: abcA's sign should be unchanged
\n
"
,
description
);
...
...
@@ -1209,9 +1199,9 @@ static void test_GetCharABCWidths(void)
};
UINT
i
;
if
(
!
pGetCharABCWidths
A
||
!
pGetCharABCWidthsW
||
!
pGetCharABCWidthsFloatW
||
!
pGetCharABCWidthsI
)
if
(
!
pGetCharABCWidths
FloatW
)
{
win_skip
(
"GetCharABCWidths
A/W/I
not available on this platform
\n
"
);
win_skip
(
"GetCharABCWidths
FloatW is
not available on this platform
\n
"
);
return
;
}
...
...
@@ -1226,22 +1216,22 @@ static void test_GetCharABCWidths(void)
nb
=
pGetGlyphIndicesW
(
hdc
,
str
,
1
,
glyphs
,
0
);
ok
(
nb
==
1
,
"GetGlyphIndicesW should have returned 1
\n
"
);
ret
=
p
GetCharABCWidthsI
(
NULL
,
0
,
1
,
glyphs
,
abc
);
ret
=
GetCharABCWidthsI
(
NULL
,
0
,
1
,
glyphs
,
abc
);
ok
(
!
ret
,
"GetCharABCWidthsI should have failed
\n
"
);
ret
=
p
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
NULL
);
ret
=
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
NULL
);
ok
(
!
ret
,
"GetCharABCWidthsI should have failed
\n
"
);
ret
=
p
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
abc
);
ret
=
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
abc
);
ok
(
ret
,
"GetCharABCWidthsI should have succeeded
\n
"
);
ret
=
p
GetCharABCWidthsW
(
NULL
,
'a'
,
'a'
,
abc
);
ret
=
GetCharABCWidthsW
(
NULL
,
'a'
,
'a'
,
abc
);
ok
(
!
ret
,
"GetCharABCWidthsW should have failed
\n
"
);
ret
=
p
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
NULL
);
ret
=
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
NULL
);
ok
(
!
ret
,
"GetCharABCWidthsW should have failed
\n
"
);
ret
=
p
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
abc
);
ret
=
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
abc
);
ok
(
!
ret
,
"GetCharABCWidthsW should have failed
\n
"
);
ret
=
pGetCharABCWidthsFloatW
(
NULL
,
'a'
,
'a'
,
abcf
);
...
...
@@ -1274,16 +1264,15 @@ static void test_GetCharABCWidths(void)
memset
(
a
,
0
,
sizeof
a
);
memset
(
w
,
0
,
sizeof
w
);
hfont
=
SelectObject
(
hdc
,
hfont
);
ok
(
pGetCharABCWidthsA
(
hdc
,
c
[
i
].
a
,
c
[
i
].
a
+
1
,
a
)
&&
pGetCharABCWidthsW
(
hdc
,
c
[
i
].
w
,
c
[
i
].
w
+
1
,
w
)
&&
memcmp
(
a
,
w
,
sizeof
a
)
==
0
,
"GetCharABCWidthsA and GetCharABCWidthsW should return same widths. charset = %u
\n
"
,
c
[
i
].
cs
);
ok
(
GetCharABCWidthsA
(
hdc
,
c
[
i
].
a
,
c
[
i
].
a
+
1
,
a
)
&&
GetCharABCWidthsW
(
hdc
,
c
[
i
].
w
,
c
[
i
].
w
+
1
,
w
)
&&
!
memcmp
(
a
,
w
,
sizeof
(
a
)),
"GetCharABCWidthsA and GetCharABCWidthsW should return same widths. charset = %u
\n
"
,
c
[
i
].
cs
);
memset
(
a
,
0xbb
,
sizeof
a
);
ret
=
p
GetCharABCWidthsA
(
hdc
,
code
,
code
,
a
);
ret
=
GetCharABCWidthsA
(
hdc
,
code
,
code
,
a
);
ok
(
ret
,
"GetCharABCWidthsA should have succeeded
\n
"
);
memset
(
full
,
0xcc
,
sizeof
full
);
ret
=
p
GetCharABCWidthsA
(
hdc
,
0x00
,
code
,
full
);
ret
=
GetCharABCWidthsA
(
hdc
,
0x00
,
code
,
full
);
ok
(
ret
,
"GetCharABCWidthsA should have succeeded
\n
"
);
ok
(
memcmp
(
&
a
[
0
],
&
full
[
code
],
sizeof
(
ABC
))
==
0
,
"GetCharABCWidthsA info should match. codepage = %u
\n
"
,
c
[
i
].
cs
);
...
...
@@ -1291,13 +1280,13 @@ static void test_GetCharABCWidths(void)
for
(
j
=
0
;
j
<
ARRAY_SIZE
(
range
);
++
j
)
{
memset
(
full
,
0xdd
,
sizeof
full
);
ret
=
p
GetCharABCWidthsA
(
hdc
,
range
[
j
].
first
,
range
[
j
].
last
,
full
);
ret
=
GetCharABCWidthsA
(
hdc
,
range
[
j
].
first
,
range
[
j
].
last
,
full
);
ok
(
ret
==
c
[
i
].
r
[
j
],
"GetCharABCWidthsA %x - %x should have %s
\n
"
,
range
[
j
].
first
,
range
[
j
].
last
,
c
[
i
].
r
[
j
]
?
"succeeded"
:
"failed"
);
if
(
ret
)
{
UINT
last
=
range
[
j
].
last
-
range
[
j
].
first
;
ret
=
p
GetCharABCWidthsA
(
hdc
,
range
[
j
].
last
,
range
[
j
].
last
,
a
);
ret
=
GetCharABCWidthsA
(
hdc
,
range
[
j
].
last
,
range
[
j
].
last
,
a
);
ok
(
ret
&&
memcmp
(
&
full
[
last
],
&
a
[
0
],
sizeof
(
ABC
))
==
0
,
"GetCharABCWidthsA %x should match. codepage = %u
\n
"
,
range
[
j
].
last
,
c
[
i
].
cs
);
...
...
@@ -1318,12 +1307,12 @@ static void test_GetCharABCWidths(void)
ret
=
pGetCharABCWidthsFloatW
(
hdc
,
' '
,
' '
,
abcf
);
ok
(
ret
,
"GetCharABCWidthsFloatW should have succeeded
\n
"
);
ok
(
abcf
[
0
].
abcfB
==
1
.
0
,
"got %f
\n
"
,
abcf
[
0
].
abcfB
);
ret
=
p
GetCharABCWidthsW
(
hdc
,
' '
,
' '
,
abcw
);
ret
=
GetCharABCWidthsW
(
hdc
,
' '
,
' '
,
abcw
);
ok
(
ret
,
"GetCharABCWidthsW should have succeeded
\n
"
);
ok
(
abcw
[
0
].
abcB
==
1
,
"got %u
\n
"
,
abcw
[
0
].
abcB
);
/* 1) prepare unrotated font metrics */
ret
=
p
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
abcw
);
ret
=
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
abcw
);
ok
(
ret
,
"GetCharABCWidthsW should have succeeded
\n
"
);
DeleteObject
(
SelectObject
(
hdc
,
hfont
));
...
...
@@ -1331,7 +1320,7 @@ static void test_GetCharABCWidths(void)
lf
.
lfEscapement
=
lf
.
lfOrientation
=
900
;
hfont
=
CreateFontIndirectA
(
&
lf
);
hfont
=
SelectObject
(
hdc
,
hfont
);
ret
=
p
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
abc
);
ret
=
GetCharABCWidthsW
(
hdc
,
'a'
,
'a'
,
abc
);
ok
(
ret
,
"GetCharABCWidthsW should have succeeded
\n
"
);
/* 3) compare ABC results */
...
...
@@ -1409,9 +1398,9 @@ static void test_GetCharABCWidths(void)
nb
=
pGetGlyphIndicesW
(
hdc
,
str
,
1
,
glyphs
,
0
);
ok
(
nb
==
1
,
"GetGlyphIndicesW should have returned 1
\n
"
);
ret
=
p
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
abc
);
ret
=
GetCharABCWidthsI
(
hdc
,
0
,
1
,
glyphs
,
abc
);
ok
(
ret
,
"GetCharABCWidthsI should have succeeded
\n
"
);
ret
=
p
GetCharABCWidthsW
(
hdc
,
'i'
,
'i'
,
abcw
);
ret
=
GetCharABCWidthsW
(
hdc
,
'i'
,
'i'
,
abcw
);
ok
(
ret
,
"GetCharABCWidthsW should have succeeded
\n
"
);
ret
=
pGetCharABCWidthsFloatW
(
hdc
,
'i'
,
'i'
,
abcf
);
ok
(
ret
,
"GetCharABCWidthsFloatW should have succeeded
\n
"
);
...
...
@@ -2423,8 +2412,8 @@ static void test_SetTextJustification(void)
testJustification
(
hdc
,
testText
,
&
clientArea
);
if
(
!
pGet
GlyphIndicesA
||
!
pGet
TextExtentExPointI
)
goto
done
;
p
GetGlyphIndicesA
(
hdc
,
"A "
,
2
,
indices
,
0
);
if
(
!
pGetTextExtentExPointI
)
goto
done
;
GetGlyphIndicesA
(
hdc
,
"A "
,
2
,
indices
,
0
);
SetTextJustification
(
hdc
,
0
,
0
);
GetTextExtentPoint32A
(
hdc
,
" "
,
1
,
&
expect
);
...
...
@@ -2576,7 +2565,7 @@ static BOOL get_glyph_indices(INT charset, UINT code_page, WORD *idx, UINT count
for
(
i
=
0
;
i
<
count
;
i
++
)
ansi_buf
[
i
]
=
(
BYTE
)(
i
+
128
);
SetLastError
(
0xdeadbeef
);
ret
=
p
GetGlyphIndicesA
(
hdc
,
ansi_buf
,
count
,
idx
,
0
);
ret
=
GetGlyphIndicesA
(
hdc
,
ansi_buf
,
count
,
idx
,
0
);
ok
(
ret
==
count
,
"GetGlyphIndicesA expected %d got %d, error %u
\n
"
,
count
,
ret
,
GetLastError
());
}
...
...
@@ -2604,7 +2593,7 @@ static void test_font_charset(void)
};
int
i
;
if
(
!
pGetGlyphIndices
A
||
!
pGetGlyphIndices
W
)
if
(
!
pGetGlyphIndicesW
)
{
win_skip
(
"Skipping the font charset test on a Win9x platform
\n
"
);
return
;
...
...
@@ -3231,9 +3220,6 @@ static void test_negative_width(HDC hdc, const LOGFONTA *lf)
LOGFONTA
lf2
=
*
lf
;
WORD
idx
;
if
(
!
pGetGlyphIndicesA
)
return
;
/* negative widths are handled just as positive ones */
lf2
.
lfWidth
=
-
lf
->
lfWidth
;
...
...
@@ -3244,7 +3230,7 @@ static void test_negative_width(HDC hdc, const LOGFONTA *lf)
hfont_prev
=
SelectObject
(
hdc
,
hfont
);
ret
=
p
GetGlyphIndicesA
(
hdc
,
"x"
,
1
,
&
idx
,
GGI_MARK_NONEXISTING_GLYPHS
);
ret
=
GetGlyphIndicesA
(
hdc
,
"x"
,
1
,
&
idx
,
GGI_MARK_NONEXISTING_GLYPHS
);
if
(
ret
==
GDI_ERROR
||
idx
==
0xffff
)
{
SelectObject
(
hdc
,
hfont_prev
);
...
...
@@ -4049,10 +4035,6 @@ static void test_GetTextMetrics(void)
HDC
hdc
;
INT
enumed
;
/* Report only once */
if
(
!
pGetGlyphIndicesA
)
win_skip
(
"GetGlyphIndicesA is unavailable, negative width will not be checked
\n
"
);
hdc
=
GetDC
(
0
);
memset
(
&
lf
,
0
,
sizeof
(
lf
));
...
...
@@ -6560,9 +6542,9 @@ static void test_GetCharWidth32(void)
INT
bufferW
;
HWND
hwnd
;
if
(
!
pGetCharWidth32
A
||
!
pGetCharWidth32
W
)
if
(
!
pGetCharWidth32W
)
{
win_skip
(
"GetCharWidth32
A/
W not available on this platform
\n
"
);
win_skip
(
"GetCharWidth32W not available on this platform
\n
"
);
return
;
}
...
...
@@ -6576,7 +6558,7 @@ static void test_GetCharWidth32(void)
ret
=
pGetCharWidth32W
(
hdc
,
'a'
,
'a'
,
&
bufferW
);
ok
(
ret
,
"GetCharWidth32W should have succeeded
\n
"
);
ret
=
p
GetCharWidth32A
(
hdc
,
'a'
,
'a'
,
&
bufferA
);
ret
=
GetCharWidth32A
(
hdc
,
'a'
,
'a'
,
&
bufferA
);
ok
(
ret
,
"GetCharWidth32A should have succeeded
\n
"
);
ok
(
bufferA
==
bufferW
,
"Widths should be the same
\n
"
);
ok
(
bufferA
>
0
,
" Width should be greater than zero
\n
"
);
...
...
@@ -6669,11 +6651,6 @@ static void test_fake_bold_font(void)
int
i
;
DWORD
r
;
if
(
!
pGetCharWidth32A
||
!
pGetCharABCWidthsA
)
{
win_skip
(
"GetCharWidth32A/GetCharABCWidthA is not available on this platform
\n
"
);
return
;
}
/* Test outline font */
memset
(
&
lf
,
0
,
sizeof
(
lf
));
strcpy
(
lf
.
lfFaceName
,
"Wingdings"
);
...
...
@@ -6691,7 +6668,7 @@ static void test_fake_bold_font(void)
ret
=
GetTextMetricsA
(
hdc
,
&
data
[
i
].
tm
);
ok
(
ret
,
"got %d
\n
"
,
ret
);
ret
=
p
GetCharABCWidthsA
(
hdc
,
0x76
,
0x76
,
&
data
[
i
].
abc
);
ret
=
GetCharABCWidthsA
(
hdc
,
0x76
,
0x76
,
&
data
[
i
].
abc
);
ok
(
ret
,
"got %d
\n
"
,
ret
);
data
[
i
].
w
=
data
[
i
].
abc
.
abcA
+
data
[
i
].
abc
.
abcB
+
data
[
i
].
abc
.
abcC
;
r
=
GetGlyphOutlineA
(
hdc
,
0x76
,
GGO_METRICS
,
&
data
[
i
].
gm
,
0
,
NULL
,
&
x2_mat
);
...
...
@@ -6742,7 +6719,7 @@ static void test_fake_bold_font(void)
ret
=
GetTextMetricsA
(
hdc
,
&
data
[
i
].
tm
);
ok
(
ret
,
"got %d
\n
"
,
ret
);
ret
=
p
GetCharWidth32A
(
hdc
,
0x76
,
0x76
,
&
data
[
i
].
w
);
ret
=
GetCharWidth32A
(
hdc
,
0x76
,
0x76
,
&
data
[
i
].
w
);
ok
(
ret
,
"got %d
\n
"
,
ret
);
SelectObject
(
hdc
,
hfont_old
);
...
...
@@ -6804,7 +6781,7 @@ static void test_bitmap_font_glyph_index(void)
CHARSETINFO
ci
;
BYTE
chr
=
'\xA9'
;
if
(
!
pGetGlyphIndicesW
||
!
pGetGlyphIndicesA
)
{
if
(
!
pGetGlyphIndicesW
)
{
win_skip
(
"GetGlyphIndices is unavailable
\n
"
);
return
;
}
...
...
@@ -6889,7 +6866,7 @@ static void test_bitmap_font_glyph_index(void)
ret
=
ExtTextOutA
(
hdc
,
100
,
0
,
0
,
NULL
,
(
LPCSTR
)
&
chr
,
1
,
NULL
);
break
;
case
1
:
ret
=
p
GetGlyphIndicesA
(
hdc
,
(
LPCSTR
)
&
chr
,
1
,
&
code
,
0
);
ret
=
GetGlyphIndicesA
(
hdc
,
(
LPCSTR
)
&
chr
,
1
,
&
code
,
0
);
ok
(
ret
,
"GetGlyphIndices failed
\n
"
);
ok
(
code
==
chr
,
"expected %02x, got %02x (%s:%d)
\n
"
,
chr
,
code
,
lf
.
lfFaceName
,
tm
.
tmCharSet
);
ret
=
ExtTextOutA
(
hdc
,
100
,
0
,
ETO_GLYPH_INDEX
,
NULL
,
(
LPCSTR
)
&
code
,
1
,
NULL
);
...
...
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