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
6304a0f5
Commit
6304a0f5
authored
Jun 15, 2015
by
Nikolay Sivov
Committed by
Alexandre Julliard
Jun 15, 2015
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dwrite: Check format directions in CreateEllipsisTrimmingSign().
parent
de2ae5e1
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
112 additions
and
5 deletions
+112
-5
dwrite_private.h
dlls/dwrite/dwrite_private.h
+1
-1
layout.c
dlls/dwrite/layout.c
+46
-1
main.c
dlls/dwrite/main.c
+2
-2
layout.c
dlls/dwrite/tests/layout.c
+63
-1
No files found.
dlls/dwrite/dwrite_private.h
View file @
6304a0f5
...
@@ -103,7 +103,7 @@ extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT
...
@@ -103,7 +103,7 @@ extern HRESULT create_textformat(const WCHAR*,IDWriteFontCollection*,DWRITE_FONT
FLOAT
,
const
WCHAR
*
,
IDWriteTextFormat
**
)
DECLSPEC_HIDDEN
;
FLOAT
,
const
WCHAR
*
,
IDWriteTextFormat
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_textlayout
(
const
WCHAR
*
,
UINT32
,
IDWriteTextFormat
*
,
FLOAT
,
FLOAT
,
IDWriteTextLayout
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_textlayout
(
const
WCHAR
*
,
UINT32
,
IDWriteTextFormat
*
,
FLOAT
,
FLOAT
,
IDWriteTextLayout
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_gdicompat_textlayout
(
const
WCHAR
*
,
UINT32
,
IDWriteTextFormat
*
,
FLOAT
,
FLOAT
,
FLOAT
,
const
DWRITE_MATRIX
*
,
BOOL
,
IDWriteTextLayout
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_gdicompat_textlayout
(
const
WCHAR
*
,
UINT32
,
IDWriteTextFormat
*
,
FLOAT
,
FLOAT
,
FLOAT
,
const
DWRITE_MATRIX
*
,
BOOL
,
IDWriteTextLayout
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_trimmingsign
(
IDWriteInlineObject
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_trimmingsign
(
IDWrite
TextFormat
*
,
IDWrite
InlineObject
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_typography
(
IDWriteTypography
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_typography
(
IDWriteTypography
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_gdiinterop
(
IDWriteFactory2
*
,
IDWriteGdiInterop
**
)
DECLSPEC_HIDDEN
;
extern
HRESULT
create_gdiinterop
(
IDWriteFactory2
*
,
IDWriteGdiInterop
**
)
DECLSPEC_HIDDEN
;
extern
void
release_gdiinterop
(
IDWriteGdiInterop
*
)
DECLSPEC_HIDDEN
;
extern
void
release_gdiinterop
(
IDWriteGdiInterop
*
)
DECLSPEC_HIDDEN
;
...
...
dlls/dwrite/layout.c
View file @
6304a0f5
...
@@ -3439,12 +3439,47 @@ static const IDWriteInlineObjectVtbl dwritetrimmingsignvtbl = {
...
@@ -3439,12 +3439,47 @@ static const IDWriteInlineObjectVtbl dwritetrimmingsignvtbl = {
dwritetrimmingsign_GetBreakConditions
dwritetrimmingsign_GetBreakConditions
};
};
HRESULT
create_trimmingsign
(
IDWriteInlineObject
**
sign
)
static
inline
BOOL
is_reading_direction_horz
(
DWRITE_READING_DIRECTION
direction
)
{
return
(
direction
==
DWRITE_READING_DIRECTION_LEFT_TO_RIGHT
)
||
(
direction
==
DWRITE_READING_DIRECTION_RIGHT_TO_LEFT
);
}
static
inline
BOOL
is_reading_direction_vert
(
DWRITE_READING_DIRECTION
direction
)
{
return
(
direction
==
DWRITE_READING_DIRECTION_TOP_TO_BOTTOM
)
||
(
direction
==
DWRITE_READING_DIRECTION_BOTTOM_TO_TOP
);
}
static
inline
BOOL
is_flow_direction_horz
(
DWRITE_FLOW_DIRECTION
direction
)
{
return
(
direction
==
DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT
)
||
(
direction
==
DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT
);
}
static
inline
BOOL
is_flow_direction_vert
(
DWRITE_FLOW_DIRECTION
direction
)
{
return
(
direction
==
DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
)
||
(
direction
==
DWRITE_FLOW_DIRECTION_BOTTOM_TO_TOP
);
}
HRESULT
create_trimmingsign
(
IDWriteTextFormat
*
format
,
IDWriteInlineObject
**
sign
)
{
{
struct
dwrite_trimmingsign
*
This
;
struct
dwrite_trimmingsign
*
This
;
DWRITE_READING_DIRECTION
reading
;
DWRITE_FLOW_DIRECTION
flow
;
*
sign
=
NULL
;
*
sign
=
NULL
;
/* Validate reading/flow direction here, layout creation won't complain about
invalid combinations. */
reading
=
IDWriteTextFormat_GetReadingDirection
(
format
);
flow
=
IDWriteTextFormat_GetFlowDirection
(
format
);
if
((
is_reading_direction_horz
(
reading
)
&&
is_flow_direction_horz
(
flow
))
||
(
is_reading_direction_vert
(
reading
)
&&
is_flow_direction_vert
(
flow
)))
return
DWRITE_E_FLOWDIRECTIONCONFLICTS
;
This
=
heap_alloc
(
sizeof
(
struct
dwrite_trimmingsign
));
This
=
heap_alloc
(
sizeof
(
struct
dwrite_trimmingsign
));
if
(
!
This
)
return
E_OUTOFMEMORY
;
if
(
!
This
)
return
E_OUTOFMEMORY
;
...
@@ -3527,7 +3562,12 @@ static HRESULT WINAPI dwritetextformat_SetWordWrapping(IDWriteTextFormat1 *iface
...
@@ -3527,7 +3562,12 @@ static HRESULT WINAPI dwritetextformat_SetWordWrapping(IDWriteTextFormat1 *iface
static
HRESULT
WINAPI
dwritetextformat_SetReadingDirection
(
IDWriteTextFormat1
*
iface
,
DWRITE_READING_DIRECTION
direction
)
static
HRESULT
WINAPI
dwritetextformat_SetReadingDirection
(
IDWriteTextFormat1
*
iface
,
DWRITE_READING_DIRECTION
direction
)
{
{
struct
dwrite_textformat
*
This
=
impl_from_IDWriteTextFormat1
(
iface
);
struct
dwrite_textformat
*
This
=
impl_from_IDWriteTextFormat1
(
iface
);
TRACE
(
"(%p)->(%d)
\n
"
,
This
,
direction
);
TRACE
(
"(%p)->(%d)
\n
"
,
This
,
direction
);
if
((
UINT32
)
direction
>
DWRITE_READING_DIRECTION_BOTTOM_TO_TOP
)
return
E_INVALIDARG
;
This
->
format
.
readingdir
=
direction
;
This
->
format
.
readingdir
=
direction
;
return
S_OK
;
return
S_OK
;
}
}
...
@@ -3535,7 +3575,12 @@ static HRESULT WINAPI dwritetextformat_SetReadingDirection(IDWriteTextFormat1 *i
...
@@ -3535,7 +3575,12 @@ static HRESULT WINAPI dwritetextformat_SetReadingDirection(IDWriteTextFormat1 *i
static
HRESULT
WINAPI
dwritetextformat_SetFlowDirection
(
IDWriteTextFormat1
*
iface
,
DWRITE_FLOW_DIRECTION
direction
)
static
HRESULT
WINAPI
dwritetextformat_SetFlowDirection
(
IDWriteTextFormat1
*
iface
,
DWRITE_FLOW_DIRECTION
direction
)
{
{
struct
dwrite_textformat
*
This
=
impl_from_IDWriteTextFormat1
(
iface
);
struct
dwrite_textformat
*
This
=
impl_from_IDWriteTextFormat1
(
iface
);
TRACE
(
"(%p)->(%d)
\n
"
,
This
,
direction
);
TRACE
(
"(%p)->(%d)
\n
"
,
This
,
direction
);
if
((
UINT32
)
direction
>
DWRITE_FLOW_DIRECTION_RIGHT_TO_LEFT
)
return
E_INVALIDARG
;
This
->
format
.
flow
=
direction
;
This
->
format
.
flow
=
direction
;
return
S_OK
;
return
S_OK
;
}
}
...
...
dlls/dwrite/main.c
View file @
6304a0f5
...
@@ -1051,8 +1051,8 @@ static HRESULT WINAPI dwritefactory_CreateEllipsisTrimmingSign(IDWriteFactory2 *
...
@@ -1051,8 +1051,8 @@ static HRESULT WINAPI dwritefactory_CreateEllipsisTrimmingSign(IDWriteFactory2 *
IDWriteInlineObject
**
trimming_sign
)
IDWriteInlineObject
**
trimming_sign
)
{
{
struct
dwritefactory
*
This
=
impl_from_IDWriteFactory2
(
iface
);
struct
dwritefactory
*
This
=
impl_from_IDWriteFactory2
(
iface
);
FIXME
(
"(%p)->(%p %p): semi-stub
\n
"
,
This
,
format
,
trimming_sign
);
TRACE
(
"(%p)->(%p %p)
\n
"
,
This
,
format
,
trimming_sign
);
return
create_trimmingsign
(
trimming_sign
);
return
create_trimmingsign
(
format
,
trimming_sign
);
}
}
static
HRESULT
WINAPI
dwritefactory_CreateTextAnalyzer
(
IDWriteFactory2
*
iface
,
IDWriteTextAnalyzer
**
analyzer
)
static
HRESULT
WINAPI
dwritefactory_CreateTextAnalyzer
(
IDWriteFactory2
*
iface
,
IDWriteTextAnalyzer
**
analyzer
)
...
...
dlls/dwrite/tests/layout.c
View file @
6304a0f5
...
@@ -883,8 +883,19 @@ if (0) /* crashes on native */
...
@@ -883,8 +883,19 @@ if (0) /* crashes on native */
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
ok
(
before
==
DWRITE_BREAK_CONDITION_NEUTRAL
,
"got %d
\n
"
,
before
);
ok
(
before
==
DWRITE_BREAK_CONDITION_NEUTRAL
,
"got %d
\n
"
,
before
);
ok
(
after
==
DWRITE_BREAK_CONDITION_NEUTRAL
,
"got %d
\n
"
,
after
);
ok
(
after
==
DWRITE_BREAK_CONDITION_NEUTRAL
,
"got %d
\n
"
,
after
);
IDWriteInlineObject_Release
(
sign
);
IDWriteInlineObject_Release
(
sign
);
/* non-orthogonal flow/reading combination */
hr
=
IDWriteTextFormat_SetReadingDirection
(
format
,
DWRITE_READING_DIRECTION_LEFT_TO_RIGHT
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
hr
=
IDWriteTextFormat_SetFlowDirection
(
format
,
DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT
);
ok
(
hr
==
S_OK
||
broken
(
hr
==
E_INVALIDARG
)
/* vista, win7 */
,
"got 0x%08x
\n
"
,
hr
);
if
(
hr
==
S_OK
)
{
hr
=
IDWriteFactory_CreateEllipsisTrimmingSign
(
factory
,
format
,
&
sign
);
ok
(
hr
==
DWRITE_E_FLOWDIRECTIONCONFLICTS
,
"got 0x%08x
\n
"
,
hr
);
}
IDWriteTextFormat_Release
(
format
);
IDWriteTextFormat_Release
(
format
);
IDWriteFactory_Release
(
factory
);
IDWriteFactory_Release
(
factory
);
}
}
...
@@ -2362,6 +2373,56 @@ todo_wine {
...
@@ -2362,6 +2373,56 @@ todo_wine {
IDWriteFactory_Release
(
factory
);
IDWriteFactory_Release
(
factory
);
}
}
static
void
test_SetFlowDirection
(
void
)
{
static
const
WCHAR
strW
[]
=
{
'a'
,
'b'
,
'c'
,
'd'
,
0
};
DWRITE_READING_DIRECTION
reading
;
DWRITE_FLOW_DIRECTION
flow
;
IDWriteTextFormat
*
format
;
IDWriteTextLayout
*
layout
;
IDWriteFactory
*
factory
;
HRESULT
hr
;
factory
=
create_factory
();
hr
=
IDWriteFactory_CreateTextFormat
(
factory
,
tahomaW
,
NULL
,
DWRITE_FONT_WEIGHT_NORMAL
,
DWRITE_FONT_STYLE_NORMAL
,
DWRITE_FONT_STRETCH_NORMAL
,
10
.
0
,
enusW
,
&
format
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
flow
=
IDWriteTextFormat_GetFlowDirection
(
format
);
ok
(
flow
==
DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
,
"got %d
\n
"
,
flow
);
reading
=
IDWriteTextFormat_GetReadingDirection
(
format
);
ok
(
reading
==
DWRITE_READING_DIRECTION_LEFT_TO_RIGHT
,
"got %d
\n
"
,
reading
);
hr
=
IDWriteFactory_CreateTextLayout
(
factory
,
strW
,
4
,
format
,
500
.
0
,
1000
.
0
,
&
layout
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
IDWriteTextLayout_Release
(
layout
);
hr
=
IDWriteTextFormat_SetFlowDirection
(
format
,
DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT
);
ok
(
hr
==
S_OK
||
broken
(
hr
==
E_INVALIDARG
)
/* vista,win7 */
,
"got 0x%08x
\n
"
,
hr
);
if
(
hr
==
S_OK
)
{
hr
=
IDWriteFactory_CreateTextLayout
(
factory
,
strW
,
4
,
format
,
500
.
0
,
1000
.
0
,
&
layout
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
IDWriteTextLayout_Release
(
layout
);
hr
=
IDWriteTextFormat_SetReadingDirection
(
format
,
DWRITE_READING_DIRECTION_TOP_TO_BOTTOM
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
hr
=
IDWriteTextFormat_SetFlowDirection
(
format
,
DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
hr
=
IDWriteFactory_CreateTextLayout
(
factory
,
strW
,
4
,
format
,
500
.
0
,
1000
.
0
,
&
layout
);
ok
(
hr
==
S_OK
,
"got 0x%08x
\n
"
,
hr
);
IDWriteTextLayout_Release
(
layout
);
}
else
win_skip
(
"DWRITE_FLOW_DIRECTION_LEFT_TO_RIGHT is not supported
\n
"
);
IDWriteTextFormat_Release
(
format
);
IDWriteFactory_Release
(
factory
);
}
START_TEST
(
layout
)
START_TEST
(
layout
)
{
{
static
const
WCHAR
ctrlstrW
[]
=
{
0x202a
,
0
};
static
const
WCHAR
ctrlstrW
[]
=
{
0x202a
,
0
};
...
@@ -2399,6 +2460,7 @@ START_TEST(layout)
...
@@ -2399,6 +2460,7 @@ START_TEST(layout)
test_SetFontStretch
();
test_SetFontStretch
();
test_SetStrikethrough
();
test_SetStrikethrough
();
test_GetMetrics
();
test_GetMetrics
();
test_SetFlowDirection
();
IDWriteFactory_Release
(
factory
);
IDWriteFactory_Release
(
factory
);
}
}
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