diff --git a/include/gdi.h b/include/gdi.h index fd2deaf6..ea965581 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -9091,6 +9091,7 @@ typedef enum { GLYPH_GRAVITY_POLICY_NATURAL, GLYPH_GRAVITY_POLICY_STRONG, GLYPH_GRAVITY_POLICY_LINE, + GLYPH_GRAVITY_POLICY_MIXED, } GlyphGravityPolicy; /** Get the vertical orientation property of a Unicode character */ @@ -9107,6 +9108,7 @@ MG_EXPORT UVerticalOrient GUIAPI UCharGetVerticalOrientation(Uchar32 uc); * pass %GLYPH_GRAVITY_AUTO and %GLYPH_GRAVITY_POLICY_STRONG in. * * \param script The script type to query + * \param vertical TRUE for vertical layout * \param base_gravity The base gravity of the layout * \param policy The gravity policy * @@ -9116,7 +9118,7 @@ MG_EXPORT UVerticalOrient GUIAPI UCharGetVerticalOrientation(Uchar32 uc); * Since: 3.4.0 */ MG_EXPORT GlyphGravity GUIAPI ScriptGetGlyphGravity(ScriptType script, - GlyphGravity base_gravity, GlyphGravityPolicy policy); + BOOL vertical, GlyphGravity base_gravity, GlyphGravityPolicy policy); /** * \fn GlyphGravity GUIAPI ScriptGetGlyphGravityForWide (ScriptType script, @@ -9136,6 +9138,7 @@ MG_EXPORT GlyphGravity GUIAPI ScriptGetGlyphGravity(ScriptType script, * preferred gravity of @script. * * \param script The script type to query + * \param vertical TRUE for vertical layout. * \param wide TRUE for wide characters as returned by IsUCharWide() * \param base_gravity The base gravity of the paragraph * \param policy The gravity policy @@ -9146,7 +9149,8 @@ MG_EXPORT GlyphGravity GUIAPI ScriptGetGlyphGravity(ScriptType script, * Since: 3.4.0 */ GlyphGravity ScriptGetGlyphGravityForWide (ScriptType script, - BOOL wide, GlyphGravity base_gravity, GlyphGravityPolicy policy); + BOOL vertical, BOOL wide, + GlyphGravity base_gravity, GlyphGravityPolicy policy); /** @} end of unicode_ops */ @@ -12254,6 +12258,8 @@ MG_EXPORT int GUIAPI UChars2AChars(LOGFONT* logfont, const Uchar32* ucs, */ #define GRF_TEXT_ORIENTATION_MIXED 0x05000000 +#define GRF_TEXT_ORIENTATION_LINE 0x06000000 + #define GRF_LINE_EXTENT_MASK 0x00C00000 /** * The maximal line extent is fixed. diff --git a/src/font/unicode-script.c b/src/font/unicode-script.c index 92a89d94..3b17bce7 100644 --- a/src/font/unicode-script.c +++ b/src/font/unicode-script.c @@ -633,7 +633,7 @@ static inline ScriptTypeProperties get_script_properties (ScriptType script) return script_properties[script]; } -GlyphGravity ScriptGetGlyphGravity (ScriptType script, +GlyphGravity ScriptGetGlyphGravity (ScriptType script, BOOL vertical, GlyphGravity base_gravity, GlyphGravityPolicy hint) { ScriptTypeProperties props = get_script_properties (script); @@ -641,25 +641,18 @@ GlyphGravity ScriptGetGlyphGravity (ScriptType script, if (base_gravity == GLYPH_GRAVITY_AUTO) base_gravity = props.preferred_gravity; - return ScriptGetGlyphGravityForWide (script, props.wide, + return ScriptGetGlyphGravityForWide (script, vertical, props.wide, base_gravity, hint); } - -#define GLYPH_GRAVITY_IS_VERTICAL(gravity) \ - ((gravity) == GLYPH_GRAVITY_EAST || (gravity) == GLYPH_GRAVITY_WEST) - -GlyphGravity ScriptGetGlyphGravityForWide (ScriptType script, +GlyphGravity ScriptGetGlyphGravityForWide (ScriptType script, BOOL vertical, BOOL wide, GlyphGravity base_gravity, GlyphGravityPolicy hint) { ScriptTypeProperties props = get_script_properties (script); - BOOL vertical; if (base_gravity == GLYPH_GRAVITY_AUTO) base_gravity = props.preferred_gravity; - vertical = GLYPH_GRAVITY_IS_VERTICAL(base_gravity); - /* Everything is designed such that a system with no vertical support * renders everything correctly horizontally. So, if not in a vertical * gravity, base and resolved gravities are always the same. @@ -688,10 +681,17 @@ GlyphGravity ScriptGetGlyphGravityForWide (ScriptType script, case GLYPH_GRAVITY_POLICY_LINE: if ((base_gravity == GLYPH_GRAVITY_EAST) ^ - (props.horiz_dir == GLYPH_RUN_DIR_RTL)) + (props.horiz_dir == HORIZONTAL_DIRECTION_RTL)) return GLYPH_GRAVITY_SOUTH; else return GLYPH_GRAVITY_NORTH; + + case GLYPH_GRAVITY_POLICY_MIXED: + // CSS3: horizontal-only scripts are typeset sideways + if (props.vert_dir == VERTICAL_DIRECTION_NONE) + return GLYPH_GRAVITY_EAST; + else + return props.preferred_gravity; } } #endif /* _MGCHARSET_UNICODE */ diff --git a/src/newgdi/layout-utils.c b/src/newgdi/layout-utils.c index 7d696b46..79802089 100644 --- a/src/newgdi/layout-utils.c +++ b/src/newgdi/layout-utils.c @@ -135,6 +135,7 @@ static GlyphOrient resolve_glyph_orient(const LAYOUTINFO* layout, } gravity = ScriptGetGlyphGravityForWide(trun->st, + layout->rf & GRF_WRITING_MODE_VERTICAL_FLAG, trun->flags & TEXTRUN_FLAG_UPRIGHT, layout->grv_base, layout->grv_plc); diff --git a/src/newgdi/layoutinfo.c b/src/newgdi/layoutinfo.c index 5f5c6b90..750b69bd 100644 --- a/src/newgdi/layoutinfo.c +++ b/src/newgdi/layoutinfo.c @@ -124,6 +124,10 @@ LAYOUTINFO* GUIAPI CreateLayoutInfo( break; case GRF_TEXT_ORIENTATION_MIXED: layout->grv_base = GLYPH_GRAVITY_SOUTH; + layout->grv_plc = GLYPH_GRAVITY_POLICY_MIXED; + break; + case GRF_TEXT_ORIENTATION_LINE: + layout->grv_base = GLYPH_GRAVITY_EAST; layout->grv_plc = GLYPH_GRAVITY_POLICY_LINE; break; case GRF_TEXT_ORIENTATION_UPRIGHT: