diff options
| author | 2024-11-06 00:57:21 +0000 | |
|---|---|---|
| committer | 2024-11-06 00:57:21 +0000 | |
| commit | c34632cdf2491ef114715aa9e0cb03c5b0d156af (patch) | |
| tree | 21ab2762a17ba5faf67aff1e85c62d3bb66ff50d | |
| parent | fd1412eec8f69aa45159b1e8df813344c3616e96 (diff) | |
| parent | da18d1599822ffbcfdc4bebc134e4b2599406e9f (diff) | |
Merge "Add vertical layout flag to Paint class" into main
| -rw-r--r-- | core/api/current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/text/flags/flags.aconfig | 7 | ||||
| -rw-r--r-- | graphics/java/android/graphics/Paint.java | 22 | ||||
| -rw-r--r-- | libs/hwui/hwui/MinikinUtils.cpp | 1 | ||||
| -rw-r--r-- | libs/hwui/hwui/Paint.h | 2 | ||||
| -rw-r--r-- | libs/hwui/hwui/PaintImpl.cpp | 11 |
6 files changed, 40 insertions, 4 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 1a53437b3364..a3ea19c384e7 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -16847,6 +16847,7 @@ package android.graphics { field @FlaggedApi("com.android.text.flags.letter_spacing_justification") public static final int TEXT_RUN_FLAG_LEFT_EDGE = 8192; // 0x2000 field @FlaggedApi("com.android.text.flags.letter_spacing_justification") public static final int TEXT_RUN_FLAG_RIGHT_EDGE = 16384; // 0x4000 field public static final int UNDERLINE_TEXT_FLAG = 8; // 0x8 + field @FlaggedApi("com.android.text.flags.vertical_text_layout") public static final int VERTICAL_TEXT_FLAG = 4096; // 0x1000 } public enum Paint.Align { diff --git a/core/java/android/text/flags/flags.aconfig b/core/java/android/text/flags/flags.aconfig index e830d89d3116..02923eda308e 100644 --- a/core/java/android/text/flags/flags.aconfig +++ b/core/java/android/text/flags/flags.aconfig @@ -202,3 +202,10 @@ flag { description: "Deprecate the Paint#elegantTextHeight API and stick it to true" bug: "349519475" } + +flag { + name: "vertical_text_layout" + namespace: "text" + description: "Make Paint class work for vertical layout text." + bug: "355296926" +} diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index b7a1c13c75c7..8bb32568ec5a 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -19,7 +19,7 @@ package android.graphics; import static com.android.text.flags.Flags.FLAG_FIX_LINE_HEIGHT_FOR_LOCALE; import static com.android.text.flags.Flags.FLAG_LETTER_SPACING_JUSTIFICATION; import static com.android.text.flags.Flags.FLAG_DEPRECATE_ELEGANT_TEXT_HEIGHT_API; - +import static com.android.text.flags.Flags.FLAG_VERTICAL_TEXT_LAYOUT; import android.annotation.ColorInt; import android.annotation.ColorLong; @@ -35,6 +35,7 @@ import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.compat.annotation.UnsupportedAppUsage; import android.graphics.fonts.FontVariationAxis; +import android.graphics.text.TextRunShaper; import android.os.Build; import android.os.LocaleList; import android.text.GraphicsOperations; @@ -269,7 +270,24 @@ public class Paint { public static final int EMBEDDED_BITMAP_TEXT_FLAG = 0x400; /** @hide bit mask for the flag forcing freetype's autohinter on for text */ public static final int AUTO_HINTING_TEXT_FLAG = 0x800; - /** @hide bit mask for the flag enabling vertical rendering for text */ + + /** + * A flat that controls text to be written in vertical orientation + * + * <p> + * This flag is used for telling the underlying text layout engine that the text is for vertical + * direction. By enabling this flag, text measurement, drawing and shaping APIs works for + * vertical text layout. For example, {@link Canvas#drawText(String, float, float, Paint)} draws + * text from top to bottom. {@link Paint#measureText(String)} returns vertical advances instead + * of horizontal advances. {@link TextRunShaper} shapes text vertically and report glyph IDs for + * vertical layout. + * + * <p> + * Do not set this flag for making {@link android.text.Layout}. The {@link android.text.Layout} + * class and its subclasses are designed for horizontal text only and does not work for vertical + * text. + */ + @FlaggedApi(FLAG_VERTICAL_TEXT_LAYOUT) public static final int VERTICAL_TEXT_FLAG = 0x1000; /** diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp index 9cd6e253140e..e5fb75575ac3 100644 --- a/libs/hwui/hwui/MinikinUtils.cpp +++ b/libs/hwui/hwui/MinikinUtils.cpp @@ -49,6 +49,7 @@ minikin::MinikinPaint MinikinUtils::prepareMinikinPaint(const Paint* paint, minikinPaint.fontStyle = resolvedFace->fStyle; minikinPaint.fontFeatureSettings = paint->getFontFeatureSettings(); minikinPaint.fontVariationSettings = paint->getFontVariationOverride(); + minikinPaint.verticalText = paint->isVerticalText(); const std::optional<minikin::FamilyVariant>& familyVariant = paint->getFamilyVariant(); if (familyVariant.has_value()) { diff --git a/libs/hwui/hwui/Paint.h b/libs/hwui/hwui/Paint.h index 7eb849fe6e3d..594ea31387ad 100644 --- a/libs/hwui/hwui/Paint.h +++ b/libs/hwui/hwui/Paint.h @@ -158,6 +158,7 @@ public: SkSamplingOptions sampling() const { return SkSamplingOptions(this->filterMode()); } + bool isVerticalText() const { return mVerticalText; } void setVariationOverride(minikin::VariationSettings&& varSettings) { mFontVariationOverride = std::move(varSettings); @@ -202,6 +203,7 @@ private: bool mUnderline = false; bool mDevKern = false; minikin::RunFlag mRunFlag = minikin::RunFlag::NONE; + bool mVerticalText = false; }; } // namespace android diff --git a/libs/hwui/hwui/PaintImpl.cpp b/libs/hwui/hwui/PaintImpl.cpp index 6dfcedc3d918..fa5325d90218 100644 --- a/libs/hwui/hwui/PaintImpl.cpp +++ b/libs/hwui/hwui/PaintImpl.cpp @@ -49,7 +49,8 @@ Paint::Paint(const Paint& paint) , mStrikeThru(paint.mStrikeThru) , mUnderline(paint.mUnderline) , mDevKern(paint.mDevKern) - , mRunFlag(paint.mRunFlag) {} + , mRunFlag(paint.mRunFlag) + , mVerticalText(paint.mVerticalText) {} Paint::~Paint() {} @@ -71,6 +72,7 @@ Paint& Paint::operator=(const Paint& other) { mUnderline = other.mUnderline; mDevKern = other.mDevKern; mRunFlag = other.mRunFlag; + mVerticalText = other.mVerticalText; return *this; } @@ -83,7 +85,8 @@ bool operator==(const Paint& a, const Paint& b) { a.mFamilyVariant == b.mFamilyVariant && a.mHyphenEdit == b.mHyphenEdit && a.mTypeface == b.mTypeface && a.mAlign == b.mAlign && a.mFilterBitmap == b.mFilterBitmap && a.mStrikeThru == b.mStrikeThru && - a.mUnderline == b.mUnderline && a.mDevKern == b.mDevKern && a.mRunFlag == b.mRunFlag; + a.mUnderline == b.mUnderline && a.mDevKern == b.mDevKern && a.mRunFlag == b.mRunFlag && + a.mVerticalText == b.mVerticalText; } void Paint::reset() { @@ -97,6 +100,7 @@ void Paint::reset() { mStrikeThru = false; mUnderline = false; mDevKern = false; + mVerticalText = false; mRunFlag = minikin::RunFlag::NONE; } @@ -135,6 +139,7 @@ static const uint32_t sForceAutoHinting = 0x800; // flags related to minikin::Paint static const uint32_t sUnderlineFlag = 0x08; static const uint32_t sStrikeThruFlag = 0x10; +static const uint32_t sVerticalTextFlag = 0x1000; static const uint32_t sTextRunLeftEdge = 0x2000; static const uint32_t sTextRunRightEdge = 0x4000; // flags no longer supported on native side (but mirrored for compatibility) @@ -190,6 +195,7 @@ uint32_t Paint::getJavaFlags() const { flags |= -(int)mUnderline & sUnderlineFlag; flags |= -(int)mDevKern & sDevKernFlag; flags |= -(int)mFilterBitmap & sFilterBitmapFlag; + flags |= -(int)mVerticalText & sVerticalTextFlag; if (mRunFlag & minikin::RunFlag::LEFT_EDGE) { flags |= sTextRunLeftEdge; } @@ -206,6 +212,7 @@ void Paint::setJavaFlags(uint32_t flags) { mUnderline = (flags & sUnderlineFlag) != 0; mDevKern = (flags & sDevKernFlag) != 0; mFilterBitmap = (flags & sFilterBitmapFlag) != 0; + mVerticalText = (flags & sVerticalTextFlag) != 0; std::underlying_type<minikin::RunFlag>::type rawFlag = minikin::RunFlag::NONE; if (flags & sTextRunLeftEdge) { |