Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
core
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
LibreOffice
core
Commits
8f054454
Kaydet (Commit)
8f054454
authored
Eyl 26, 2016
tarafından
Khaled Hosny
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Support vertical text in CommonSalLayout
Change-Id: I52a71c9c21ad75c7cb9c8574e5e7e3b7c1c0c0c3
üst
2bfd8391
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
86 additions
and
11 deletions
+86
-11
CommonSalLayout.cxx
vcl/source/gdi/CommonSalLayout.cxx
+81
-11
cairotextrender.cxx
vcl/unx/generic/gdi/cairotextrender.cxx
+5
-0
No files found.
vcl/source/gdi/CommonSalLayout.cxx
Dosyayı görüntüle @
8f054454
...
@@ -212,12 +212,12 @@ struct HbScriptRun
...
@@ -212,12 +212,12 @@ struct HbScriptRun
{
{
int32_t
mnMin
;
int32_t
mnMin
;
int32_t
mnEnd
;
int32_t
mnEnd
;
hb_script_t
maScript
;
UScriptCode
maScript
;
HbScriptRun
(
int32_t
nMin
,
int32_t
nEnd
,
UScriptCode
aScript
)
HbScriptRun
(
int32_t
nMin
,
int32_t
nEnd
,
UScriptCode
aScript
)
:
mnMin
(
nMin
)
:
mnMin
(
nMin
)
,
mnEnd
(
nEnd
)
,
mnEnd
(
nEnd
)
,
maScript
(
hb_icu_script_to_script
(
aScript
)
)
,
maScript
(
aScript
)
{}
{}
};
};
...
@@ -307,6 +307,47 @@ void CommonSalLayout::DrawText(SalGraphics& rSalGraphics) const
...
@@ -307,6 +307,47 @@ void CommonSalLayout::DrawText(SalGraphics& rSalGraphics) const
rSalGraphics
.
DrawSalLayout
(
*
this
);
rSalGraphics
.
DrawSalLayout
(
*
this
);
}
}
/* https://drafts.csswg.org/css-writing-modes-3/#script-orientations */
static
int
GetVerticalFlagsForScript
(
UScriptCode
aScript
)
{
int
nFlag
=
GF_NONE
;
switch
(
aScript
)
{
/* ttb 0° */
case
USCRIPT_BOPOMOFO
:
case
USCRIPT_EGYPTIAN_HIEROGLYPHS
:
case
USCRIPT_HAN
:
case
USCRIPT_HANGUL
:
case
USCRIPT_HIRAGANA
:
case
USCRIPT_KATAKANA
:
case
USCRIPT_MEROITIC_CURSIVE
:
case
USCRIPT_MEROITIC_HIEROGLYPHS
:
case
USCRIPT_YI
:
nFlag
=
GF_ROTL
;
break
;
#if 0
/* ttb 90° */
case USCRIPT_MONGOLIAN:
case USCRIPT_PHAGS_PA:
nFlag = ??;
break;
/* ttb -90° */
case USCRIPT_ORKHON:
nFlag = ??;
break;
/* btt -90° */
case USCRIPT_MONGOLIAN:
nFlag = ??;
break;
#endif
default
:
break
;
}
return
nFlag
;
}
bool
CommonSalLayout
::
LayoutText
(
ImplLayoutArgs
&
rArgs
)
bool
CommonSalLayout
::
LayoutText
(
ImplLayoutArgs
&
rArgs
)
{
{
hb_script_t
aHbScript
=
HB_SCRIPT_INVALID
;
hb_script_t
aHbScript
=
HB_SCRIPT_INVALID
;
...
@@ -371,11 +412,19 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
...
@@ -371,11 +412,19 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
int
nMinRunPos
=
aScriptRun
.
mnMin
;
int
nMinRunPos
=
aScriptRun
.
mnMin
;
int
nEndRunPos
=
aScriptRun
.
mnEnd
;
int
nEndRunPos
=
aScriptRun
.
mnEnd
;
int
nRunLen
=
nEndRunPos
-
nMinRunPos
;
int
nRunLen
=
nEndRunPos
-
nMinRunPos
;
aHbScript
=
aScriptRun
.
maScript
;
aHbScript
=
hb_icu_script_to_script
(
aScriptRun
.
maScript
);
// hb_language_from_string() accept ISO639-3 language tag except for Chinese.
// hb_language_from_string() accept ISO639-3 language tag except for Chinese.
LanguageTag
&
rTag
=
rArgs
.
maLanguageTag
;
LanguageTag
&
rTag
=
rArgs
.
maLanguageTag
;
OString
sLanguage
=
OUStringToOString
(
rTag
.
getBcp47
(),
RTL_TEXTENCODING_ASCII_US
);
OString
sLanguage
=
OUStringToOString
(
rTag
.
getBcp47
(),
RTL_TEXTENCODING_ASCII_US
);
bool
bVertical
=
false
;
if
((
rArgs
.
mnFlags
&
SalLayoutFlags
::
Vertical
)
&&
GetVerticalFlagsForScript
(
aScriptRun
.
maScript
)
==
GF_ROTL
)
{
bVertical
=
true
;
}
int
nHbFlags
=
HB_BUFFER_FLAGS_DEFAULT
;
int
nHbFlags
=
HB_BUFFER_FLAGS_DEFAULT
;
if
(
nMinRunPos
==
0
)
if
(
nMinRunPos
==
0
)
nHbFlags
|=
HB_BUFFER_FLAG_BOT
;
/* Beginning-of-text */
nHbFlags
|=
HB_BUFFER_FLAG_BOT
;
/* Beginning-of-text */
...
@@ -387,7 +436,10 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
...
@@ -387,7 +436,10 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
static
hb_unicode_funcs_t
*
pHbUnicodeFuncs
=
getUnicodeFuncs
();
static
hb_unicode_funcs_t
*
pHbUnicodeFuncs
=
getUnicodeFuncs
();
hb_buffer_set_unicode_funcs
(
pHbBuffer
,
pHbUnicodeFuncs
);
hb_buffer_set_unicode_funcs
(
pHbBuffer
,
pHbUnicodeFuncs
);
#endif
#endif
hb_buffer_set_direction
(
pHbBuffer
,
bRightToLeft
?
HB_DIRECTION_RTL
:
HB_DIRECTION_LTR
);
if
(
bVertical
)
hb_buffer_set_direction
(
pHbBuffer
,
HB_DIRECTION_TTB
);
else
hb_buffer_set_direction
(
pHbBuffer
,
bRightToLeft
?
HB_DIRECTION_RTL
:
HB_DIRECTION_LTR
);
hb_buffer_set_script
(
pHbBuffer
,
aHbScript
);
hb_buffer_set_script
(
pHbBuffer
,
aHbScript
);
hb_buffer_set_language
(
pHbBuffer
,
hb_language_from_string
(
sLanguage
.
getStr
(),
-
1
));
hb_buffer_set_language
(
pHbBuffer
,
hb_language_from_string
(
sLanguage
.
getStr
(),
-
1
));
hb_buffer_set_flags
(
pHbBuffer
,
(
hb_buffer_flags_t
)
nHbFlags
);
hb_buffer_set_flags
(
pHbBuffer
,
(
hb_buffer_flags_t
)
nHbFlags
);
...
@@ -452,17 +504,35 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
...
@@ -452,17 +504,35 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
if
(
bDiacritic
)
if
(
bDiacritic
)
nGlyphFlags
|=
GlyphItem
::
IS_DIACRITIC
;
nGlyphFlags
|=
GlyphItem
::
IS_DIACRITIC
;
int32_t
nXOffset
=
pHbPositions
[
i
].
x_offset
>>
6
;
int32_t
nAdvance
,
nXOffset
,
nYOffset
;
int32_t
nYOffset
=
pHbPositions
[
i
].
y_offset
>>
6
;
if
(
bVertical
)
int32_t
nXAdvance
=
pHbPositions
[
i
].
x_advance
>>
6
;
{
int32_t
nYAdvance
=
pHbPositions
[
i
].
y_advance
>>
6
;
int
nVertFlag
;
#if 0 /* XXX: does not work as expected for Common script */
UErrorCode error = U_ZERO_ERROR;
nVertFlag = GetVerticalFlagsForScript(uscript_getScript(aChar, &error));
#else
nVertFlag
=
GetVerticalFlags
(
aChar
);
if
(
nVertFlag
==
GF_ROTR
)
nVertFlag
=
GF_ROTL
;
#endif
nGlyphIndex
|=
nVertFlag
;
nAdvance
=
-
pHbPositions
[
i
].
y_advance
>>
6
;
nXOffset
=
pHbPositions
[
i
].
y_offset
>>
6
;
nYOffset
=
-
pHbPositions
[
i
].
x_offset
>>
6
;
}
else
{
nAdvance
=
pHbPositions
[
i
].
x_advance
>>
6
;
nXOffset
=
pHbPositions
[
i
].
x_offset
>>
6
;
nYOffset
=
pHbPositions
[
i
].
y_offset
>>
6
;
}
Point
aNewPos
=
Point
(
aCurrPos
.
X
()
+
nXOffset
,
-
(
aCurrPos
.
Y
()
+
nYOffset
));
Point
aNewPos
=
Point
(
aCurrPos
.
X
()
+
nXOffset
,
-
(
aCurrPos
.
Y
()
+
nYOffset
));
const
GlyphItem
aGI
(
nCharPos
,
nGlyphIndex
,
aNewPos
,
nGlyphFlags
,
n
X
Advance
,
nXOffset
);
const
GlyphItem
aGI
(
nCharPos
,
nGlyphIndex
,
aNewPos
,
nGlyphFlags
,
nAdvance
,
nXOffset
);
AppendGlyph
(
aGI
);
AppendGlyph
(
aGI
);
aCurrPos
.
X
()
+=
nXAdvance
;
aCurrPos
.
X
()
+=
nAdvance
;
aCurrPos
.
Y
()
+=
nYAdvance
;
}
}
hb_buffer_destroy
(
pHbBuffer
);
hb_buffer_destroy
(
pHbBuffer
);
...
...
vcl/unx/generic/gdi/cairotextrender.cxx
Dosyayı görüntüle @
8f054454
...
@@ -323,6 +323,11 @@ void CairoTextRender::DrawServerFontLayout( const GenericSalLayout& rLayout, con
...
@@ -323,6 +323,11 @@ void CairoTextRender::DrawServerFontLayout( const GenericSalLayout& rLayout, con
{
{
ydiff
=
font_extents
.
ascent
/
nHeight
;
ydiff
=
font_extents
.
ascent
/
nHeight
;
xdiff
=
-
font_extents
.
descent
/
nHeight
;
xdiff
=
-
font_extents
.
descent
/
nHeight
;
if
(
SalLayout
::
UseCommonLayout
())
{
ydiff
-=
font_extents
.
descent
/
nHeight
;
xdiff
=
0
;
}
}
}
else
if
(
nGlyphRotation
==
-
1
)
else
if
(
nGlyphRotation
==
-
1
)
{
{
...
...
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