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
9dd91d31
Commit
9dd91d31
authored
Jan 08, 2013
by
Aric Stewart
Committed by
Alexandre Julliard
Jan 08, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
usp10: Correct issues if a feature tag is duplicated between GSUB and GPOS.
Identified by Huw Davies.
parent
430bde34
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
44 additions
and
24 deletions
+44
-24
opentype.c
dlls/usp10/opentype.c
+19
-4
shape.c
dlls/usp10/shape.c
+19
-19
usp10_internal.h
dlls/usp10/usp10_internal.h
+6
-1
No files found.
dlls/usp10/opentype.c
View file @
9dd91d31
...
...
@@ -1949,6 +1949,7 @@ static void GSUB_initialize_feature_cache(LPCVOID table, LoadedLanguage *languag
language
->
features
[
i
].
lookups
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WORD
)
*
language
->
features
[
i
].
lookup_count
);
for
(
j
=
0
;
j
<
language
->
features
[
i
].
lookup_count
;
j
++
)
language
->
features
[
i
].
lookups
[
j
]
=
GET_BE_WORD
(
feature
->
LookupListIndex
[
j
]);
language
->
features
[
i
].
tableType
=
FEATURE_GSUB_TABLE
;
}
}
}
...
...
@@ -1989,6 +1990,7 @@ static void GPOS_expand_feature_cache(LPCVOID table, LoadedLanguage *language)
language
->
features
[
i
].
lookups
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WORD
)
*
language
->
features
[
i
].
lookup_count
);
for
(
j
=
0
;
j
<
language
->
features
[
i
].
lookup_count
;
j
++
)
language
->
features
[
i
].
lookups
[
j
]
=
GET_BE_WORD
(
feature
->
LookupListIndex
[
j
]);
language
->
features
[
i
].
tableType
=
FEATURE_GPOS_TABLE
;
}
}
}
...
...
@@ -2010,6 +2012,7 @@ static void GPOS_expand_feature_cache(LPCVOID table, LoadedLanguage *language)
language
->
features
[
idx
].
lookups
=
HeapAlloc
(
GetProcessHeap
(),
0
,
sizeof
(
WORD
)
*
language
->
features
[
idx
].
lookup_count
);
for
(
j
=
0
;
j
<
language
->
features
[
idx
].
lookup_count
;
j
++
)
language
->
features
[
idx
].
lookups
[
j
]
=
GET_BE_WORD
(
feature
->
LookupListIndex
[
j
]);
language
->
features
[
idx
].
tableType
=
FEATURE_GPOS_TABLE
;
}
language
->
feature_count
+=
count
;
}
...
...
@@ -2024,7 +2027,7 @@ static void _initialize_feature_cache(ScriptCache *psc, LoadedLanguage *language
}
}
HRESULT
OpenType_GetFontFeatureTags
(
ScriptCache
*
psc
,
OPENTYPE_TAG
script_tag
,
OPENTYPE_TAG
language_tag
,
BOOL
filtered
,
OPENTYPE_TAG
searchingFor
,
int
cMaxTags
,
OPENTYPE_TAG
*
pFeatureTags
,
int
*
pcTags
,
LoadedFeature
**
feature
)
HRESULT
OpenType_GetFontFeatureTags
(
ScriptCache
*
psc
,
OPENTYPE_TAG
script_tag
,
OPENTYPE_TAG
language_tag
,
BOOL
filtered
,
OPENTYPE_TAG
searchingFor
,
char
tableType
,
int
cMaxTags
,
OPENTYPE_TAG
*
pFeatureTags
,
int
*
pcTags
,
LoadedFeature
**
feature
)
{
int
i
;
HRESULT
rc
=
S_OK
;
...
...
@@ -2075,7 +2078,15 @@ HRESULT OpenType_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, O
_initialize_feature_cache
(
psc
,
language
);
*
pcTags
=
language
->
feature_count
;
if
(
tableType
)
{
*
pcTags
=
0
;
for
(
i
=
0
;
i
<
language
->
feature_count
;
i
++
)
if
(
language
->
features
[
i
].
tableType
==
tableType
)
*
pcTags
=
(
*
pcTags
)
+
1
;
}
else
*
pcTags
=
language
->
feature_count
;
if
(
!
searchingFor
&&
cMaxTags
<
*
pcTags
)
rc
=
E_OUTOFMEMORY
;
...
...
@@ -2085,11 +2096,15 @@ HRESULT OpenType_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, O
for
(
i
=
0
;
i
<
language
->
feature_count
;
i
++
)
{
if
(
i
<
cMaxTags
)
pFeatureTags
[
i
]
=
language
->
features
[
i
].
tag
;
{
if
(
!
tableType
||
language
->
features
[
i
].
tableType
==
tableType
)
pFeatureTags
[
i
]
=
language
->
features
[
i
].
tag
;
}
if
(
searchingFor
)
{
if
(
searchingFor
==
language
->
features
[
i
].
tag
)
if
((
searchingFor
==
language
->
features
[
i
].
tag
)
&&
(
!
tableType
||
language
->
features
[
i
].
tableType
==
tableType
))
{
pFeatureTags
[
0
]
=
language
->
features
[
i
].
tag
;
*
pcTags
=
1
;
...
...
dlls/usp10/shape.c
View file @
9dd91d31
...
...
@@ -602,7 +602,7 @@ static OPENTYPE_TAG get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCac
}
}
static
LoadedFeature
*
load_OT_feature
(
HDC
hdc
,
SCRIPT_ANALYSIS
*
psa
,
ScriptCache
*
psc
,
const
char
*
feat
)
static
LoadedFeature
*
load_OT_feature
(
HDC
hdc
,
SCRIPT_ANALYSIS
*
psa
,
ScriptCache
*
psc
,
c
har
tableType
,
c
onst
char
*
feat
)
{
LoadedFeature
*
feature
=
NULL
;
...
...
@@ -623,13 +623,13 @@ static LoadedFeature* load_OT_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache
language
=
MS_MAKE_TAG
(
'd'
,
'f'
,
'l'
,
't'
);
attempt
--
;
OpenType_GetFontFeatureTags
(
psc
,
script
,
language
,
FALSE
,
MS_MAKE_TAG
(
feat
[
0
],
feat
[
1
],
feat
[
2
],
feat
[
3
]),
1
,
&
tags
,
&
cTags
,
&
feature
);
OpenType_GetFontFeatureTags
(
psc
,
script
,
language
,
FALSE
,
MS_MAKE_TAG
(
feat
[
0
],
feat
[
1
],
feat
[
2
],
feat
[
3
]),
tableType
,
1
,
&
tags
,
&
cTags
,
&
feature
);
}
while
(
attempt
&&
!
feature
);
/* try in the default (latin) table */
if
(
!
feature
)
OpenType_GetFontFeatureTags
(
psc
,
MS_MAKE_TAG
(
'l'
,
'a'
,
't'
,
'n'
),
MS_MAKE_TAG
(
'd'
,
'f'
,
'l'
,
't'
),
FALSE
,
MS_MAKE_TAG
(
feat
[
0
],
feat
[
1
],
feat
[
2
],
feat
[
3
]),
1
,
&
tags
,
&
cTags
,
&
feature
);
OpenType_GetFontFeatureTags
(
psc
,
MS_MAKE_TAG
(
'l'
,
'a'
,
't'
,
'n'
),
MS_MAKE_TAG
(
'd'
,
'f'
,
'l'
,
't'
),
FALSE
,
MS_MAKE_TAG
(
feat
[
0
],
feat
[
1
],
feat
[
2
],
feat
[
3
]),
tableType
,
1
,
&
tags
,
&
cTags
,
&
feature
);
}
TRACE
(
"Feature %s located at %p
\n
"
,
debugstr_an
(
feat
,
4
),
feature
);
...
...
@@ -640,7 +640,7 @@ static INT apply_GSUB_feature_to_glyph(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCach
{
LoadedFeature
*
feature
;
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
feat
);
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
feat
);
if
(
!
feature
)
return
GSUB_E_NOFEATURE
;
...
...
@@ -825,7 +825,7 @@ static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, W
LoadedFeature
*
feature
;
int
lookup_index
;
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
feat
);
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
feat
);
if
(
!
feature
)
return
GSUB_E_NOFEATURE
;
...
...
@@ -2020,17 +2020,17 @@ static void ShapeIndicSyllables(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa,
{
int
c
;
int
overall_shift
=
0
;
LoadedFeature
*
locl
=
(
modern
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
"locl"
)
:
NULL
;
LoadedFeature
*
nukt
=
load_OT_feature
(
hdc
,
psa
,
psc
,
"nukt"
);
LoadedFeature
*
akhn
=
load_OT_feature
(
hdc
,
psa
,
psc
,
"akhn"
);
LoadedFeature
*
rkrf
=
(
modern
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
"rkrf"
)
:
NULL
;
LoadedFeature
*
pstf
=
load_OT_feature
(
hdc
,
psa
,
psc
,
"pstf"
);
LoadedFeature
*
vatu
=
(
!
rkrf
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
"vatu"
)
:
NULL
;
LoadedFeature
*
cjct
=
(
modern
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
"cjct"
)
:
NULL
;
BOOL
rphf
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
"rphf"
)
!=
NULL
);
BOOL
pref
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
"pref"
)
!=
NULL
);
BOOL
blwf
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
"blwf"
)
!=
NULL
);
BOOL
half
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
"half"
)
!=
NULL
);
LoadedFeature
*
locl
=
(
modern
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"locl"
)
:
NULL
;
LoadedFeature
*
nukt
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"nukt"
);
LoadedFeature
*
akhn
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"akhn"
);
LoadedFeature
*
rkrf
=
(
modern
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"rkrf"
)
:
NULL
;
LoadedFeature
*
pstf
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"pstf"
);
LoadedFeature
*
vatu
=
(
!
rkrf
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"vatu"
)
:
NULL
;
LoadedFeature
*
cjct
=
(
modern
)
?
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"cjct"
)
:
NULL
;
BOOL
rphf
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"rphf"
)
!=
NULL
);
BOOL
pref
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"pref"
)
!=
NULL
);
BOOL
blwf
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"blwf"
)
!=
NULL
);
BOOL
half
=
(
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GSUB_TABLE
,
"half"
)
!=
NULL
);
IndicSyllable
glyph_indexs
;
for
(
c
=
0
;
c
<
syllable_count
;
c
++
)
...
...
@@ -3307,7 +3307,7 @@ void SHAPE_ApplyOpenTypePositions(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *ps
{
LoadedFeature
*
feature
;
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
(
const
char
*
)
&
rpRangeProperties
->
potfRecords
[
i
].
tagFeature
);
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_GPOS_TABLE
,
(
const
char
*
)
&
rpRangeProperties
->
potfRecords
[
i
].
tagFeature
);
if
(
!
feature
)
continue
;
...
...
@@ -3330,7 +3330,7 @@ HRESULT SHAPE_CheckFontForRequiredFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANA
i
=
0
;
while
(
ShapingData
[
psa
->
eScript
].
requiredFeatures
[
i
])
{
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
ShapingData
[
psa
->
eScript
].
requiredFeatures
[
i
]);
feature
=
load_OT_feature
(
hdc
,
psa
,
psc
,
FEATURE_ALL_TABLES
,
ShapingData
[
psa
->
eScript
].
requiredFeatures
[
i
]);
if
(
feature
)
return
S_OK
;
i
++
;
...
...
@@ -3401,7 +3401,7 @@ HRESULT SHAPE_GetFontFeatureTags( HDC hdc, ScriptCache *psc,
filter
=
TRUE
;
}
hr
=
OpenType_GetFontFeatureTags
(
psc
,
tagScript
,
tagLangSys
,
filter
,
0x00000000
,
cMaxTags
,
pFeatureTags
,
pcTags
,
NULL
);
hr
=
OpenType_GetFontFeatureTags
(
psc
,
tagScript
,
tagLangSys
,
filter
,
0x00000000
,
FEATURE_ALL_TABLES
,
cMaxTags
,
pFeatureTags
,
pcTags
,
NULL
);
if
(
FAILED
(
hr
))
*
pcTags
=
0
;
...
...
dlls/usp10/usp10_internal.h
View file @
9dd91d31
...
...
@@ -128,8 +128,13 @@
#define GSUB_E_NOFEATURE -2
#define GSUB_E_NOGLYPH -1
#define FEATURE_ALL_TABLES 0
#define FEATURE_GSUB_TABLE 1
#define FEATURE_GPOS_TABLE 2
typedef
struct
{
OPENTYPE_TAG
tag
;
CHAR
tableType
;
LPCVOID
feature
;
INT
lookup_count
;
WORD
*
lookups
;
...
...
@@ -242,4 +247,4 @@ INT OpenType_apply_GSUB_lookup(LPCVOID table, INT lookup_index, WORD *glyphs, IN
INT
OpenType_apply_GPOS_lookup
(
LPOUTLINETEXTMETRICW
lpotm
,
LPLOGFONTW
lplogfont
,
INT
*
piAdvance
,
LPCVOID
table
,
INT
lookup_index
,
const
WORD
*
glyphs
,
INT
glyph_index
,
INT
write_dir
,
INT
glyph_count
,
GOFFSET
*
pGoffset
)
DECLSPEC_HIDDEN
;
HRESULT
OpenType_GetFontScriptTags
(
ScriptCache
*
psc
,
OPENTYPE_TAG
searchingFor
,
int
cMaxTags
,
OPENTYPE_TAG
*
pScriptTags
,
int
*
pcTags
)
DECLSPEC_HIDDEN
;
HRESULT
OpenType_GetFontLanguageTags
(
ScriptCache
*
psc
,
OPENTYPE_TAG
script_tag
,
OPENTYPE_TAG
searchingFor
,
int
cMaxTags
,
OPENTYPE_TAG
*
pLanguageTags
,
int
*
pcTags
)
DECLSPEC_HIDDEN
;
HRESULT
OpenType_GetFontFeatureTags
(
ScriptCache
*
psc
,
OPENTYPE_TAG
script_tag
,
OPENTYPE_TAG
language_tag
,
BOOL
filtered
,
OPENTYPE_TAG
searchingFor
,
int
cMaxTags
,
OPENTYPE_TAG
*
pFeatureTags
,
int
*
pcTags
,
LoadedFeature
**
feature
)
DECLSPEC_HIDDEN
;
HRESULT
OpenType_GetFontFeatureTags
(
ScriptCache
*
psc
,
OPENTYPE_TAG
script_tag
,
OPENTYPE_TAG
language_tag
,
BOOL
filtered
,
OPENTYPE_TAG
searchingFor
,
char
tableType
,
int
cMaxTags
,
OPENTYPE_TAG
*
pFeatureTags
,
int
*
pcTags
,
LoadedFeature
**
feature
)
DECLSPEC_HIDDEN
;
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