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
b8aad9d3
Commit
b8aad9d3
authored
Jun 02, 2011
by
Aric Stewart
Committed by
Alexandre Julliard
Jun 03, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
usp10: Add Devanagari script.
parent
397c3ac5
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
286 additions
and
1 deletion
+286
-1
shape.c
dlls/usp10/shape.c
+259
-0
usp10.c
dlls/usp10/tests/usp10.c
+10
-0
usp10.c
dlls/usp10/usp10.c
+14
-1
usp10_internal.h
dlls/usp10/usp10_internal.h
+3
-0
No files found.
dlls/usp10/shape.c
View file @
b8aad9d3
...
...
@@ -44,6 +44,7 @@ static void ContextualShape_Arabic(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *p
static
void
ContextualShape_Syriac
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
WCHAR
*
pwcChars
,
INT
cChars
,
WORD
*
pwOutGlyphs
,
INT
*
pcGlyphs
,
INT
cMaxGlyphs
,
WORD
*
pwLogClust
);
static
void
ContextualShape_Phags_pa
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
WCHAR
*
pwcChars
,
INT
cChars
,
WORD
*
pwOutGlyphs
,
INT
*
pcGlyphs
,
INT
cMaxGlyphs
,
WORD
*
pwLogClust
);
static
void
ContextualShape_Sinhala
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
WCHAR
*
pwcChars
,
INT
cChars
,
WORD
*
pwOutGlyphs
,
INT
*
pcGlyphs
,
INT
cMaxGlyphs
,
WORD
*
pwLogClust
);
static
void
ContextualShape_Devanagari
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
WCHAR
*
pwcChars
,
INT
cChars
,
WORD
*
pwOutGlyphs
,
INT
*
pcGlyphs
,
INT
cMaxGlyphs
,
WORD
*
pwLogClust
);
typedef
VOID
(
*
ShapeCharGlyphPropProc
)(
HDC
,
ScriptCache
*
,
SCRIPT_ANALYSIS
*
,
const
WCHAR
*
,
const
INT
,
const
WORD
*
,
const
INT
,
WORD
*
,
SCRIPT_CHARPROP
*
,
SCRIPT_GLYPHPROP
*
);
...
...
@@ -53,6 +54,7 @@ static void ShapeCharGlyphProp_Arabic( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSI
static
void
ShapeCharGlyphProp_Thai
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
);
static
void
ShapeCharGlyphProp_None
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
);
static
void
ShapeCharGlyphProp_Tibet
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
);
static
void
ShapeCharGlyphProp_Devanagari
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
);
extern
const
unsigned
short
wine_shaping_table
[];
extern
const
unsigned
short
wine_shaping_forms
[
LAST_ARABIC_CHAR
-
FIRST_ARABIC_CHAR
+
1
][
4
];
...
...
@@ -286,6 +288,12 @@ typedef struct tagVowelComponents
WCHAR
parts
[
3
];
}
VowelComponents
;
typedef
struct
tagConsonantComponents
{
WCHAR
parts
[
3
];
WCHAR
output
;
}
ConsonantComponents
;
/* the orders of joined_forms and contextual_features need to line up */
static
const
char
*
contextual_features
[]
=
{
...
...
@@ -379,6 +387,44 @@ static const char* required_lao_features[] =
NULL
};
static
const
char
*
required_devanagari_features
[]
=
{
"nukt"
,
"akhn"
,
"rphf"
,
"blwf"
,
"half"
,
"vatu"
,
"pres"
,
"abvs"
,
"blws"
,
"psts"
,
"haln"
,
NULL
};
static
OPENTYPE_FEATURE_RECORD
devanagari_features
[]
=
{
/* Localized forms */
{
MS_MAKE_TAG
(
'l'
,
'o'
,
'c'
,
'l'
),
1
},
/* Base forms */
{
MS_MAKE_TAG
(
'n'
,
'u'
,
'k'
,
't'
),
1
},
{
MS_MAKE_TAG
(
'a'
,
'k'
,
'h'
,
'n'
),
1
},
{
MS_MAKE_TAG
(
'r'
,
'p'
,
'h'
,
'f'
),
1
},
{
MS_MAKE_TAG
(
'r'
,
'k'
,
'r'
,
'f'
),
1
},
{
MS_MAKE_TAG
(
'b'
,
'l'
,
'w'
,
'f'
),
1
},
{
MS_MAKE_TAG
(
'h'
,
'a'
,
'l'
,
'f'
),
1
},
{
MS_MAKE_TAG
(
'v'
,
'a'
,
't'
,
'u'
),
1
},
{
MS_MAKE_TAG
(
'c'
,
'j'
,
'c'
,
't'
),
1
},
/* Presentation forms */
{
MS_MAKE_TAG
(
'p'
,
'r'
,
'e'
,
's'
),
1
},
{
MS_MAKE_TAG
(
'a'
,
'b'
,
'v'
,
's'
),
1
},
{
MS_MAKE_TAG
(
'b'
,
'l'
,
'w'
,
's'
),
1
},
{
MS_MAKE_TAG
(
'p'
,
's'
,
't'
,
's'
),
1
},
{
MS_MAKE_TAG
(
'h'
,
'a'
,
'l'
,
'n'
),
1
},
{
MS_MAKE_TAG
(
'c'
,
'a'
,
'l'
,
't'
),
1
},
};
typedef
struct
ScriptShapeDataTag
{
TEXTRANGE_PROPERTIES
defaultTextRange
;
const
char
**
requiredFeatures
;
...
...
@@ -415,6 +461,8 @@ static const ScriptShapeData ShapingData[] =
{{
thai_features
,
1
},
NULL
,
"thai"
,
""
,
NULL
,
ShapeCharGlyphProp_Thai
},
{{
thai_features
,
1
},
required_lao_features
,
"lao"
,
""
,
NULL
,
ShapeCharGlyphProp_Thai
},
{{
thai_features
,
1
},
required_lao_features
,
"lao"
,
""
,
NULL
,
ShapeCharGlyphProp_Thai
},
{{
devanagari_features
,
15
},
required_devanagari_features
,
"deva"
,
"dev2"
,
ContextualShape_Devanagari
,
ShapeCharGlyphProp_Devanagari
},
{{
devanagari_features
,
15
},
required_devanagari_features
,
"deva"
,
"dev2"
,
ContextualShape_Devanagari
,
ShapeCharGlyphProp_Devanagari
},
};
static
INT
GSUB_is_glyph_covered
(
LPCVOID
table
,
UINT
glyph
)
...
...
@@ -1538,6 +1586,35 @@ static void DecomposeVowels(HDC hdc, WCHAR *pwOutChars, INT *pcChars, const Vowe
}
}
static
void
ComposeConsonants
(
HDC
hdc
,
WCHAR
*
pwOutChars
,
INT
*
pcChars
,
const
ConsonantComponents
consonants
[])
{
int
i
;
int
cWalk
;
for
(
cWalk
=
0
;
cWalk
<
*
pcChars
;
cWalk
++
)
{
for
(
i
=
0
;
consonants
[
i
].
output
!=
0x0
;
i
++
)
{
int
j
;
for
(
j
=
0
;
j
+
cWalk
<
*
pcChars
&&
consonants
[
i
].
parts
[
j
]
!=
0x0
;
j
++
)
if
(
pwOutChars
[
cWalk
+
j
]
!=
consonants
[
i
].
parts
[
j
])
break
;
if
(
consonants
[
i
].
parts
[
j
]
==
0x0
)
/* matched all */
{
int
k
;
j
--
;
pwOutChars
[
cWalk
]
=
consonants
[
i
].
output
;
for
(
k
=
cWalk
+
1
;
k
<
*
pcChars
-
j
;
k
++
)
pwOutChars
[
k
]
=
pwOutChars
[
k
+
j
];
*
pcChars
=
*
pcChars
-
j
;
break
;
}
}
cWalk
++
;
}
}
static
void
Reorder_Ra_follows_base
(
LPWSTR
pwChar
,
INT
start
,
INT
main
,
INT
end
,
lexical_function
lexical
)
{
if
(
start
!=
main
&&
end
>
start
+
1
&&
lexical
(
pwChar
[
start
])
==
lex_Ra
&&
lexical
(
pwChar
[
start
+
1
])
==
lex_Halant
)
...
...
@@ -1554,6 +1631,26 @@ static void Reorder_Ra_follows_base(LPWSTR pwChar, INT start, INT main, INT end,
}
}
static
void
Reorder_Ra_follows_mantra_post
(
LPWSTR
pwChar
,
INT
start
,
INT
main
,
INT
end
,
lexical_function
lexical
)
{
if
(
start
!=
main
&&
end
>
start
+
1
&&
lexical
(
pwChar
[
start
])
==
lex_Ra
&&
lexical
(
pwChar
[
start
+
1
])
==
lex_Halant
)
{
int
j
,
loc
;
WORD
Ra
=
pwChar
[
start
];
WORD
H
=
pwChar
[
start
+
1
];
for
(
loc
=
main
;
loc
>
end
;
loc
++
)
if
(
lexical
(
pwChar
[
loc
])
==
lex_Mantra_post
)
break
;
if
(
loc
==
end
)
loc
=
main
;
TRACE
(
"Doing reorder of Ra to %i
\n
"
,
loc
);
for
(
j
=
start
;
j
<
loc
-
1
;
j
++
)
pwChar
[
j
]
=
pwChar
[
j
+
2
];
pwChar
[
loc
-
1
]
=
Ra
;
pwChar
[
loc
]
=
H
;
}
}
static
void
Reorder_Mantra_precede_base
(
LPWSTR
pwChar
,
INT
start
,
INT
main
,
INT
end
,
lexical_function
lexical
)
{
int
i
;
...
...
@@ -1576,6 +1673,28 @@ static void Reorder_Mantra_precede_base(LPWSTR pwChar, INT start, INT main, INT
}
}
static
void
Reorder_Mantra_precede_syllable
(
LPWSTR
pwChar
,
INT
start
,
INT
main
,
INT
end
,
lexical_function
lexical
)
{
int
i
;
/* reorder Mantras */
if
(
end
>
main
)
{
for
(
i
=
1
;
i
<=
end
-
main
;
i
++
)
{
if
(
lexical
(
pwChar
[
main
+
i
])
==
lex_Mantra_pre
)
{
int
j
;
WCHAR
c
=
pwChar
[
main
+
i
];
TRACE
(
"Doing reorder of %x to %i
\n
"
,
c
,
start
);
for
(
j
=
main
+
i
;
j
>
start
;
j
--
)
pwChar
[
j
]
=
pwChar
[
j
-
1
];
pwChar
[
start
]
=
c
;
}
}
}
}
static
void
Reorder_Like_Sinhala
(
LPWSTR
pwChar
,
INT
start
,
INT
main
,
INT
end
,
lexical_function
lexical
)
{
TRACE
(
"Syllable (%i..%i..%i)
\n
"
,
start
,
main
,
end
);
...
...
@@ -1588,6 +1707,18 @@ static void Reorder_Like_Sinhala(LPWSTR pwChar, INT start, INT main, INT end, le
Reorder_Mantra_precede_base
(
pwChar
,
start
,
main
,
end
,
lexical
);
}
static
void
Reorder_Like_Devanagari
(
LPWSTR
pwChar
,
INT
start
,
INT
main
,
INT
end
,
lexical_function
lexical
)
{
TRACE
(
"Syllable (%i..%i..%i)
\n
"
,
start
,
main
,
end
);
if
(
start
==
main
&&
main
==
end
)
return
;
main
=
Indic_FindBaseConsonant
(
pwChar
,
start
,
main
,
end
,
lexical
);
if
(
lexical
(
pwChar
[
main
])
==
lex_Vowel
)
return
;
Reorder_Ra_follows_mantra_post
(
pwChar
,
start
,
main
,
end
,
lexical
);
Reorder_Mantra_precede_syllable
(
pwChar
,
start
,
main
,
end
,
lexical
);
}
static
int
sinhala_lex
(
WCHAR
c
)
{
switch
(
c
)
...
...
@@ -1654,6 +1785,79 @@ static void ContextualShape_Sinhala(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *
HeapFree
(
GetProcessHeap
(),
0
,
input
);
}
static
int
devanagari_lex
(
WCHAR
c
)
{
switch
(
c
)
{
case
0x0951
:
case
0x0952
:
case
0x0903
:
return
lex_Modifier
;
case
0x0930
:
return
lex_Ra
;
case
0x093C
:
return
lex_Nukta
;
case
0x0940
:
case
0x093E
:
return
lex_Mantra_post
;
case
0x093F
:
return
lex_Mantra_pre
;
case
0x094D
:
return
lex_Halant
;
case
0x0972
:
return
lex_Vowel
;
case
0x200C
:
return
lex_ZWNJ
;
case
0x200D
:
return
lex_ZWJ
;
default:
if
(
c
>=
0x0901
&&
c
<=
0x0902
)
return
lex_Mantra_above
;
else
if
(
c
>=
0x0904
&&
c
<=
0x0914
)
return
lex_Vowel
;
else
if
(
c
>=
0x0915
&&
c
<=
0x0939
)
return
lex_Consonant
;
else
if
(
c
>=
0x0941
&&
c
<=
0x0944
)
return
lex_Mantra_below
;
else
if
(
c
>=
0x0945
&&
c
<=
0x0948
)
return
lex_Mantra_above
;
else
if
(
c
>=
0x0949
&&
c
<=
0x094C
)
return
lex_Mantra_post
;
else
if
(
c
>=
0x0953
&&
c
<=
0x0954
)
return
lex_Modifier
;
else
if
(
c
>=
0x0958
&&
c
<=
0x095F
)
return
lex_Consonant
;
else
if
(
c
>=
0x0960
&&
c
<=
0x0961
)
return
lex_Vowel
;
else
if
(
c
>=
0x0962
&&
c
<=
0x0963
)
return
lex_Mantra_below
;
else
if
(
c
>=
0x097B
&&
c
<=
0x097C
)
return
lex_Consonant
;
else
if
(
c
>=
0x097E
&&
c
<=
0x097F
)
return
lex_Consonant
;
else
return
lex_Generic
;
}
}
static
const
ConsonantComponents
Devanagari_consonants
[]
=
{
{{
0x0928
,
0x093C
,
0x00000
},
0x0929
},
{{
0x0930
,
0x093C
,
0x00000
},
0x0931
},
{{
0x0933
,
0x093C
,
0x00000
},
0x0934
},
{{
0x0915
,
0x093C
,
0x00000
},
0x0958
},
{{
0x0916
,
0x093C
,
0x00000
},
0x0959
},
{{
0x0917
,
0x093C
,
0x00000
},
0x095A
},
{{
0x091C
,
0x093C
,
0x00000
},
0x095B
},
{{
0x0921
,
0x093C
,
0x00000
},
0x095C
},
{{
0x0922
,
0x093C
,
0x00000
},
0x095D
},
{{
0x092B
,
0x093C
,
0x00000
},
0x095E
},
{{
0x092F
,
0x093C
,
0x00000
},
0x095F
}};
static
void
ContextualShape_Devanagari
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
WCHAR
*
pwcChars
,
INT
cChars
,
WORD
*
pwOutGlyphs
,
INT
*
pcGlyphs
,
INT
cMaxGlyphs
,
WORD
*
pwLogClust
)
{
int
cCount
=
cChars
;
WCHAR
*
input
;
if
(
*
pcGlyphs
!=
cChars
)
{
ERR
(
"Number of Glyphs and Chars need to match at the beginning
\n
"
);
return
;
}
input
=
HeapAlloc
(
GetProcessHeap
(),
0
,
cChars
*
sizeof
(
WCHAR
));
memcpy
(
input
,
pwcChars
,
cChars
*
sizeof
(
WCHAR
));
/* Step 1: Compose Consonant and Nukta */
ComposeConsonants
(
hdc
,
input
,
&
cCount
,
Devanagari_consonants
);
TRACE
(
"New composed string %s (%i)
\n
"
,
debugstr_wn
(
input
,
cCount
),
cCount
);
/* Step 2: Reorder within Syllables */
Indic_ReorderCharacters
(
input
,
cCount
,
devanagari_lex
,
Reorder_Like_Devanagari
);
TRACE
(
"reordered string %s
\n
"
,
debugstr_wn
(
input
,
cCount
));
GetGlyphIndicesW
(
hdc
,
input
,
cCount
,
pwOutGlyphs
,
0
);
*
pcGlyphs
=
cCount
;
HeapFree
(
GetProcessHeap
(),
0
,
input
);
}
static
void
ShapeCharGlyphProp_Default
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
)
{
int
i
,
k
;
...
...
@@ -1962,6 +2166,61 @@ static void ShapeCharGlyphProp_Tibet( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS
}
}
static
void
ShapeCharGlyphProp_BaseIndic
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
,
lexical_function
lexical
)
{
int
i
,
k
;
for
(
i
=
0
;
i
<
cGlyphs
;
i
++
)
{
int
char_index
[
20
];
int
char_count
=
0
;
for
(
k
=
0
;
k
<
cChars
;
k
++
)
{
if
(
pwLogClust
[
k
]
==
i
)
{
char_index
[
char_count
]
=
k
;
char_count
++
;
}
}
if
(
char_count
==
0
)
{
FIXME
(
"No chars in this glyph? Must be an error
\n
"
);
continue
;
}
if
(
char_count
==
1
&&
pwcChars
[
char_index
[
0
]]
==
0x0020
)
/* space */
{
pGlyphProp
[
i
].
sva
.
uJustification
=
SCRIPT_JUSTIFY_BLANK
;
pCharProp
[
char_index
[
0
]].
fCanGlyphAlone
=
1
;
}
else
pGlyphProp
[
i
].
sva
.
uJustification
=
SCRIPT_JUSTIFY_NONE
;
pGlyphProp
[
i
].
sva
.
fClusterStart
=
0
;
for
(
k
=
0
;
k
<
char_count
&&
!
pGlyphProp
[
i
].
sva
.
fClusterStart
;
k
++
)
switch
(
lexical
(
pwcChars
[
char_index
[
k
]]))
{
case
lex_Mantra_pre
:
case
lex_Mantra_post
:
case
lex_Mantra_above
:
case
lex_Mantra_below
:
case
lex_Modifier
:
break
;
default:
pGlyphProp
[
i
].
sva
.
fClusterStart
=
1
;
break
;
}
}
UpdateClustersFromGlyphProp
(
cGlyphs
,
cChars
,
pwLogClust
,
pGlyphProp
);
}
static
void
ShapeCharGlyphProp_Devanagari
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
)
{
ShapeCharGlyphProp_BaseIndic
(
hdc
,
psc
,
psa
,
pwcChars
,
cChars
,
pwGlyphs
,
cGlyphs
,
pwLogClust
,
pCharProp
,
pGlyphProp
,
devanagari_lex
);
}
void
SHAPE_CharGlyphProp
(
HDC
hdc
,
ScriptCache
*
psc
,
SCRIPT_ANALYSIS
*
psa
,
const
WCHAR
*
pwcChars
,
const
INT
cChars
,
const
WORD
*
pwGlyphs
,
const
INT
cGlyphs
,
WORD
*
pwLogClust
,
SCRIPT_CHARPROP
*
pCharProp
,
SCRIPT_GLYPHPROP
*
pGlyphProp
)
{
if
(
ShapingData
[
psa
->
eScript
].
charGlyphPropProc
)
...
...
dlls/usp10/tests/usp10.c
View file @
b8aad9d3
...
...
@@ -126,6 +126,7 @@ static inline void _test_items_ok(LPCWSTR string, DWORD cchString,
#define thai_tag MS_MAKE_TAG('t','h','a','i')
#define hebr_tag MS_MAKE_TAG('h','e','b','r')
#define syrc_tag MS_MAKE_TAG('s','y','r','c')
#define deva_tag MS_MAKE_TAG('d','e','v','a')
static
void
test_ScriptItemize
(
void
)
{
...
...
@@ -207,6 +208,11 @@ static void test_ScriptItemize( void )
static
const
WCHAR
test10
[]
=
{
0x0717
,
0x0718
,
0x071a
,
0x071b
,
0
};
static
const
itemTest
t101
[
2
]
=
{{{
0
,
0
,
0
,
0
,
0
},
0
,
1
,
1
,
1
,
syrc_tag
},{{
0
,
0
,
0
,
0
,
0
},
4
,
0
,
0
,
0
,
-
1
}};
/* Devanagari */
static
const
WCHAR
test11
[]
=
{
0x0926
,
0x0947
,
0x0935
,
0x0928
,
0x093e
,
0x0917
,
0x0930
,
0x0940
};
static
const
itemTest
t111
[
2
]
=
{{{
0
,
0
,
0
,
0
,
0
},
0
,
0
,
0
,
0
,
deva_tag
},{{
0
,
0
,
0
,
0
,
0
},
8
,
0
,
0
,
0
,
-
1
}};
static
const
itemTest
t112
[
2
]
=
{{{
0
,
0
,
0
,
0
,
0
},
0
,
0
,
0
,
2
,
deva_tag
},{{
0
,
0
,
0
,
0
,
0
},
8
,
0
,
0
,
0
,
-
1
}};
SCRIPT_ITEM
items
[
15
];
SCRIPT_CONTROL
Control
;
SCRIPT_STATE
State
;
...
...
@@ -249,6 +255,7 @@ static void test_ScriptItemize( void )
test_items_ok
(
test8
,
4
,
NULL
,
NULL
,
1
,
t81
,
FALSE
,
0
);
test_items_ok
(
test9
,
5
,
NULL
,
NULL
,
2
,
t91
,
FALSE
,
0
);
test_items_ok
(
test10
,
4
,
NULL
,
NULL
,
1
,
t101
,
FALSE
,
0
);
test_items_ok
(
test11
,
8
,
NULL
,
NULL
,
1
,
t111
,
FALSE
,
0
);
State
.
uBidiLevel
=
0
;
test_items_ok
(
test1
,
4
,
&
Control
,
&
State
,
1
,
t11
,
FALSE
,
0
);
...
...
@@ -265,6 +272,7 @@ static void test_ScriptItemize( void )
test_items_ok
(
test8
,
4
,
&
Control
,
&
State
,
1
,
t81
,
FALSE
,
0
);
test_items_ok
(
test9
,
5
,
&
Control
,
&
State
,
2
,
t91
,
FALSE
,
0
);
test_items_ok
(
test10
,
4
,
&
Control
,
&
State
,
1
,
t101
,
FALSE
,
0
);
test_items_ok
(
test11
,
8
,
&
Control
,
&
State
,
1
,
t111
,
FALSE
,
0
);
State
.
uBidiLevel
=
1
;
test_items_ok
(
test1
,
4
,
&
Control
,
&
State
,
1
,
t12
,
FALSE
,
0
);
...
...
@@ -281,6 +289,7 @@ static void test_ScriptItemize( void )
test_items_ok
(
test8
,
4
,
&
Control
,
&
State
,
1
,
t81
,
FALSE
,
0
);
test_items_ok
(
test9
,
5
,
&
Control
,
&
State
,
2
,
t92
,
FALSE
,
0
);
test_items_ok
(
test10
,
4
,
&
Control
,
&
State
,
1
,
t101
,
FALSE
,
0
);
test_items_ok
(
test11
,
8
,
&
Control
,
&
State
,
1
,
t112
,
FALSE
,
0
);
State
.
uBidiLevel
=
1
;
Control
.
fMergeNeutralItems
=
TRUE
;
...
...
@@ -298,6 +307,7 @@ static void test_ScriptItemize( void )
test_items_ok
(
test8
,
4
,
&
Control
,
&
State
,
1
,
t81
,
FALSE
,
0
);
test_items_ok
(
test9
,
5
,
&
Control
,
&
State
,
1
,
t93
,
FALSE
,
2
);
test_items_ok
(
test10
,
4
,
&
Control
,
&
State
,
1
,
t101
,
FALSE
,
0
);
test_items_ok
(
test11
,
8
,
&
Control
,
&
State
,
1
,
t112
,
FALSE
,
0
);
}
static
inline
void
_test_shape_ok
(
int
valid
,
HDC
hdc
,
LPCWSTR
string
,
...
...
dlls/usp10/usp10.c
View file @
b8aad9d3
...
...
@@ -77,6 +77,8 @@ static const scriptRange scriptRanges[] = {
{
Script_Arabic
,
0x750
,
0x77f
,
0
,
0
},
/* Thaana: U+0780–U+07BF */
{
Script_Thaana
,
0x780
,
0x7bf
,
0
,
0
},
/* Devanagari: U+0900–U+097F */
{
Script_Devanagari
,
0x900
,
0x97f
,
Script_Devanagari_Numeric
,
0
},
/* Sinhala: U+0D80–U+0DFF */
{
Script_Sinhala
,
0xd80
,
0xdff
,
0
,
0
},
/* Thai: U+0E00–U+0E7F */
...
...
@@ -87,6 +89,8 @@ static const scriptRange scriptRanges[] = {
{
Script_Tibetan
,
0xf00
,
0xfff
,
Script_Tibetan_Numeric
,
0
},
/* Georgian: U+10A0–U+10FF */
{
Script_Georgian
,
0x10a0
,
0x10ff
,
0
,
0
},
/* Vedic Extensions: U+1CD0-U+1CFF */
{
Script_Devanagari
,
0x1cd0
,
0x1cff
,
Script_Devanagari_Numeric
,
0
},
/* Phonetic Extensions: U+1D00–U+1DBF */
{
Script_Latin
,
0x1d00
,
0x1dbf
,
0
,
0
},
/* Latin Extended Additional: U+1E00–U+1EFF */
...
...
@@ -106,6 +110,8 @@ static const scriptRange scriptRanges[] = {
{
Script_Latin
,
0xa700
,
0xa7ff
,
0
,
0
},
/* Phags-pa: U+A840–U+A87F */
{
Script_Phags_pa
,
0xa840
,
0xa87f
,
0
,
0
},
/* Devanagari Extended: U+A8E0-U+A8FF */
{
Script_Devanagari
,
0xa8e0
,
0xa8ff
,
Script_Devanagari_Numeric
,
0
},
/* Latin Ligatures: U+FB00–U+FB06 */
{
Script_Latin
,
0xfb00
,
0xfb06
,
0
,
0
},
/* Armenian ligatures U+FB13..U+FB17 */
...
...
@@ -201,6 +207,12 @@ static const scriptData scriptInformation[] = {
{{
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
},
MS_MAKE_TAG
(
'l'
,
'a'
,
'o'
,
' '
)},
{{
Script_Devanagari
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_HINDI
,
0
,
1
,
0
,
1
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'd'
,
'e'
,
'v'
,
'a'
)},
{{
Script_Devanagari_Numeric
,
0
,
0
,
0
,
0
,
0
,
0
,
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
}},
{
LANG_HINDI
,
1
,
1
,
0
,
0
,
DEFAULT_CHARSET
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
},
MS_MAKE_TAG
(
'd'
,
'e'
,
'v'
,
'a'
)},
};
static
const
SCRIPT_PROPERTIES
*
script_props
[]
=
...
...
@@ -216,7 +228,8 @@ static const SCRIPT_PROPERTIES *script_props[] =
&
scriptInformation
[
16
].
props
,
&
scriptInformation
[
17
].
props
,
&
scriptInformation
[
18
].
props
,
&
scriptInformation
[
19
].
props
,
&
scriptInformation
[
20
].
props
,
&
scriptInformation
[
21
].
props
,
&
scriptInformation
[
22
].
props
,
&
scriptInformation
[
23
].
props
&
scriptInformation
[
22
].
props
,
&
scriptInformation
[
23
].
props
,
&
scriptInformation
[
24
].
props
,
&
scriptInformation
[
25
].
props
};
typedef
struct
{
...
...
dlls/usp10/usp10_internal.h
View file @
b8aad9d3
...
...
@@ -50,6 +50,9 @@
#define Script_Thai_Numeric 21
#define Script_Lao 22
#define Script_Lao_Numeric 23
/* Unicode Chapter 9 */
#define Script_Devanagari 24
#define Script_Devanagari_Numeric 25
#define GLYPH_BLOCK_SHIFT 8
#define GLYPH_BLOCK_SIZE (1UL << GLYPH_BLOCK_SHIFT)
...
...
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