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
f221aea6
Commit
f221aea6
authored
May 10, 2011
by
Aric Stewart
Committed by
Alexandre Julliard
May 11, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
usp10: Implement ScriptItemizeOpenType.
parent
1ac8f4d4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
102 additions
and
41 deletions
+102
-41
shape.c
dlls/usp10/shape.c
+0
-6
usp10.c
dlls/usp10/usp10.c
+95
-34
usp10.spec
dlls/usp10/usp10.spec
+1
-1
usp10_internal.h
dlls/usp10/usp10_internal.h
+6
-0
No files found.
dlls/usp10/shape.c
View file @
f221aea6
...
...
@@ -74,12 +74,6 @@ enum joined_forms {
#endif
/* These are all structures needed for the GSUB table */
#define MS_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
( ( (ULONG)_x4 << 24 ) | \
( (ULONG)_x3 << 16 ) | \
( (ULONG)_x2 << 8 ) | \
(ULONG)_x1 )
#define GSUB_TAG MS_MAKE_TAG('G', 'S', 'U', 'B')
#define GSUB_E_NOFEATURE -2
#define GSUB_E_NOGLYPH -1
...
...
dlls/usp10/usp10.c
View file @
f221aea6
...
...
@@ -124,58 +124,83 @@ typedef struct _scriptData
{
SCRIPT_ANALYSIS
a
;
SCRIPT_PROPERTIES
props
;
OPENTYPE_TAG
scriptTag
;
}
scriptData
;
/* the must be in order so that the index matches the Script value */
static
const
scriptData
scriptInformation
[]
=
{
{{
SCRIPT_UNDEFINED
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_NEUTRAL
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_NEUTRAL
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
0x00000000
},
{{
Script_Latin
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ENGLISH
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
}},
{
LANG_ENGLISH
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
},
MS_MAKE_TAG
(
'l'
,
'a'
,
't'
,
'n'
)},
{{
Script_CR
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_NEUTRAL
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_NEUTRAL
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
0x00000000
},
{{
Script_Numeric
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ENGLISH
,
1
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ENGLISH
,
1
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
0x00000000
},
{{
Script_Control
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ENGLISH
,
0
,
1
,
0
,
0
,
ANSI_CHARSET
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
}},
{
LANG_ENGLISH
,
0
,
1
,
0
,
0
,
ANSI_CHARSET
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
},
0x00000000
},
{{
Script_Punctuation
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_NEUTRAL
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_NEUTRAL
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
0x00000000
},
{{
Script_Arabic
,
1
,
1
,
0
,
0
,
0
,
0
,
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ARABIC
,
0
,
1
,
0
,
0
,
ARABIC_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
}},
{
LANG_ARABIC
,
0
,
1
,
0
,
0
,
ARABIC_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
0
},
MS_MAKE_TAG
(
'a'
,
'r'
,
'a'
,
'b'
)},
{{
Script_Arabic_Numeric
,
1
,
1
,
0
,
0
,
0
,
0
,
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ARABIC
,
1
,
1
,
0
,
0
,
ARABIC_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
}},
{
LANG_ARABIC
,
1
,
1
,
0
,
0
,
ARABIC_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
},
MS_MAKE_TAG
(
'a'
,
'r'
,
'a'
,
'b'
)},
{{
Script_Hebrew
,
1
,
1
,
0
,
0
,
0
,
0
,
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_HEBREW
,
0
,
1
,
0
,
1
,
HEBREW_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_HEBREW
,
0
,
1
,
0
,
1
,
HEBREW_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'h'
,
'e'
,
'b'
,
'r'
)},
{{
Script_Syriac
,
1
,
1
,
0
,
0
,
0
,
0
,
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_SYRIAC
,
0
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
}},
{
LANG_SYRIAC
,
0
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
},
MS_MAKE_TAG
(
's'
,
'y'
,
'r'
,
'c'
)},
{{
Script_Persian
,
1
,
1
,
0
,
0
,
0
,
0
,
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_PERSIAN
,
1
,
1
,
0
,
0
,
ARABIC_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_PERSIAN
,
1
,
1
,
0
,
0
,
ARABIC_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
's'
,
'y'
,
'r'
,
'c'
)},
{{
Script_Thaana
,
1
,
1
,
0
,
0
,
0
,
0
,
{
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_DIVEHI
,
0
,
1
,
0
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_DIVEHI
,
0
,
1
,
0
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
't'
,
'h'
,
'a'
,
'a'
)},
{{
Script_Greek
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_GREEK
,
0
,
0
,
0
,
0
,
GREEK_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_GREEK
,
0
,
0
,
0
,
0
,
GREEK_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'g'
,
'r'
,
'e'
,
'k'
)},
{{
Script_Cyrillic
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_RUSSIAN
,
0
,
0
,
0
,
0
,
RUSSIAN_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_RUSSIAN
,
0
,
0
,
0
,
0
,
RUSSIAN_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'c'
,
'y'
,
'r'
,
'l'
)},
{{
Script_Armenian
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_ARMENIAN
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
}},
{
LANG_ARMENIAN
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
},
MS_MAKE_TAG
(
'a'
,
'r'
,
'm'
,
'n'
)},
{{
Script_Georgian
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_GEORGIAN
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
}},
{
LANG_GEORGIAN
,
0
,
0
,
0
,
0
,
ANSI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
},
MS_MAKE_TAG
(
'g'
,
'e'
,
'o'
,
'r'
)},
{{
Script_Sinhala
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_SINHALESE
,
0
,
1
,
0
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_SINHALESE
,
0
,
1
,
0
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
's'
,
'i'
,
'n'
,
'h'
)},
{{
Script_Tibetan
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_TIBETAN
,
0
,
1
,
1
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
}},
{
LANG_TIBETAN
,
0
,
1
,
1
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
't'
,
'i'
,
'b'
,
't'
)},
{{
Script_Tibetan_Numeric
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_TIBETAN
,
1
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_TIBETAN
,
1
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
't'
,
'i'
,
'b'
,
't'
)},
{{
Script_Phags_pa
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_MONGOLIAN
,
0
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_MONGOLIAN
,
0
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'p'
,
'h'
,
'a'
,
'g'
)},
{{
Script_Thai
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_THAI
,
0
,
1
,
1
,
1
,
THAI_CHARSET
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
}},
{
LANG_THAI
,
0
,
1
,
1
,
1
,
THAI_CHARSET
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
},
MS_MAKE_TAG
(
't'
,
'h'
,
'a'
,
'i'
)},
{{
Script_Thai_Numeric
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_THAI
,
1
,
1
,
0
,
0
,
THAI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_THAI
,
1
,
1
,
0
,
0
,
THAI_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
't'
,
'h'
,
'a'
,
'i'
)},
{{
Script_Lao
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_LAO
,
0
,
1
,
1
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
}},
{
LANG_LAO
,
0
,
1
,
1
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'l'
,
'a'
,
'o'
,
' '
)},
{{
Script_Lao_Numeric
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_LAO
,
1
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_LAO
,
1
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'l'
,
'a'
,
'o'
,
' '
)},
};
static
const
SCRIPT_PROPERTIES
*
script_props
[]
=
...
...
@@ -576,26 +601,27 @@ HRESULT WINAPI ScriptApplyDigitSubstitution(const SCRIPT_DIGITSUBSTITUTE *sds,
}
/***********************************************************************
* ScriptItemize (USP10.@)
* ScriptItemize
OpenType
(USP10.@)
*
* Split a Unicode string into shapeable parts.
*
* PARAMS
* pwcInChars [I] String to split.
* cInChars [I] Number of characters in pwcInChars.
* cMaxItems [I] Maximum number of items to return.
* psControl [I] Pointer to a SCRIPT_CONTROL structure.
* psState [I] Pointer to a SCRIPT_STATE structure.
* pItems [O] Buffer to receive SCRIPT_ITEM structures.
* pcItems [O] Number of script items returned.
* pwcInChars [I] String to split.
* cInChars [I] Number of characters in pwcInChars.
* cMaxItems [I] Maximum number of items to return.
* psControl [I] Pointer to a SCRIPT_CONTROL structure.
* psState [I] Pointer to a SCRIPT_STATE structure.
* pItems [O] Buffer to receive SCRIPT_ITEM structures.
* pScriptTags [O] Buffer to receive OPENTYPE_TAGs.
* pcItems [O] Number of script items returned.
*
* RETURNS
* Success: S_OK
* Failure: Non-zero HRESULT value.
*/
HRESULT
WINAPI
ScriptItemize
(
const
WCHAR
*
pwcInChars
,
int
cInChars
,
int
cMaxItems
,
HRESULT
WINAPI
ScriptItemize
OpenType
(
const
WCHAR
*
pwcInChars
,
int
cInChars
,
int
cMaxItems
,
const
SCRIPT_CONTROL
*
psControl
,
const
SCRIPT_STATE
*
psState
,
SCRIPT_ITEM
*
pItems
,
int
*
pcItems
)
SCRIPT_ITEM
*
pItems
,
OPENTYPE_TAG
*
pScriptTags
,
int
*
pcItems
)
{
#define Numeric_space 0x0020
...
...
@@ -650,6 +676,7 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem
pItems
[
index
].
iCharPos
=
0
;
pItems
[
index
].
a
=
scriptInformation
[
get_char_script
(
pwcInChars
[
cnt
])].
a
;
pScriptTags
[
index
]
=
scriptInformation
[
get_char_script
(
pwcInChars
[
cnt
])].
scriptTag
;
if
(
strength
)
str
=
strength
[
cnt
];
...
...
@@ -702,6 +729,7 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem
memset
(
&
pItems
[
index
].
a
,
0
,
sizeof
(
SCRIPT_ANALYSIS
));
pItems
[
index
].
a
=
scriptInformation
[
New_Script
].
a
;
pScriptTags
[
index
]
=
scriptInformation
[
New_Script
].
scriptTag
;
if
(
levels
)
{
pItems
[
index
].
a
.
fRTL
=
odd
(
levels
[
cnt
]);
...
...
@@ -739,6 +767,39 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem
}
/***********************************************************************
* ScriptItemize (USP10.@)
*
* Split a Unicode string into shapeable parts.
*
* PARAMS
* pwcInChars [I] String to split.
* cInChars [I] Number of characters in pwcInChars.
* cMaxItems [I] Maximum number of items to return.
* psControl [I] Pointer to a SCRIPT_CONTROL structure.
* psState [I] Pointer to a SCRIPT_STATE structure.
* pItems [O] Buffer to receive SCRIPT_ITEM structures.
* pcItems [O] Number of script items returned.
*
* RETURNS
* Success: S_OK
* Failure: Non-zero HRESULT value.
*/
HRESULT
WINAPI
ScriptItemize
(
const
WCHAR
*
pwcInChars
,
int
cInChars
,
int
cMaxItems
,
const
SCRIPT_CONTROL
*
psControl
,
const
SCRIPT_STATE
*
psState
,
SCRIPT_ITEM
*
pItems
,
int
*
pcItems
)
{
OPENTYPE_TAG
*
discarded_tags
;
HRESULT
res
;
discarded_tags
=
heap_alloc
(
cMaxItems
*
sizeof
(
OPENTYPE_TAG
));
if
(
!
discarded_tags
)
return
E_OUTOFMEMORY
;
res
=
ScriptItemizeOpenType
(
pwcInChars
,
cInChars
,
cMaxItems
,
psControl
,
psState
,
pItems
,
discarded_tags
,
pcItems
);
heap_free
(
discarded_tags
);
return
res
;
}
/***********************************************************************
* ScriptStringAnalyse (USP10.@)
*
*/
...
...
dlls/usp10/usp10.spec
View file @
f221aea6
...
...
@@ -16,7 +16,7 @@
@ stdcall ScriptGetProperties(ptr long)
@ stdcall ScriptIsComplex(wstr long long)
@ stdcall ScriptItemize(wstr long long ptr ptr ptr ptr)
@ st
ub ScriptItemizeOpenType
@ st
dcall ScriptItemizeOpenType(wstr long long ptr ptr ptr ptr ptr)
@ stdcall ScriptJustify(ptr ptr long long long ptr)
@ stdcall ScriptLayout(long ptr ptr ptr)
@ stdcall ScriptPlace(ptr ptr ptr long ptr ptr ptr ptr ptr)
...
...
dlls/usp10/usp10_internal.h
View file @
f221aea6
...
...
@@ -18,6 +18,12 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*
*/
#define MS_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
( ( (ULONG)_x4 << 24 ) | \
( (ULONG)_x3 << 16 ) | \
( (ULONG)_x2 << 8 ) | \
(ULONG)_x1 )
#define Script_Latin 1
#define Script_CR 2
...
...
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