support cloud text background

commit_hash:60ec380cf4a8581a070ae3f077255a520eb8c974
This commit is contained in:
gulevsky
2024-10-14 17:33:44 +03:00
parent 870a17d1be
commit bcbe067b94
35 changed files with 916 additions and 8 deletions
+31
View File
@@ -1165,6 +1165,7 @@
"client/android/div/src/main/java/com/yandex/div/core/util/mask/FixedLengthInputMask.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/mask/FixedLengthInputMask.kt",
"client/android/div/src/main/java/com/yandex/div/core/util/mask/PhoneInputMask.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/mask/PhoneInputMask.kt",
"client/android/div/src/main/java/com/yandex/div/core/util/mask/TextDiff.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/mask/TextDiff.kt",
"client/android/div/src/main/java/com/yandex/div/core/util/text/CloudTextRangeBackgroundRenderer.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/text/CloudTextRangeBackgroundRenderer.kt",
"client/android/div/src/main/java/com/yandex/div/core/util/text/DivBackgroundSpan.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/text/DivBackgroundSpan.kt",
"client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundHelper.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundHelper.kt",
"client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundRenderer.kt":"divkit/public/client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundRenderer.kt",
@@ -2777,6 +2778,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -3706,6 +3710,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -4635,6 +4642,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -5564,6 +5574,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -6493,6 +6506,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -7422,6 +7438,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -8351,6 +8370,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -9280,6 +9302,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -10209,6 +10234,9 @@
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text-shadow.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_image_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_vertical_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/underline.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/variables-rendering.png",
"client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png":"divkit/public/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/vertical-alignments.png",
@@ -18483,6 +18511,9 @@
"test_data/snapshot_test_data/div-text/text-shadow.json":"divkit/public/test_data/snapshot_test_data/div-text/text-shadow.json",
"test_data/snapshot_test_data/div-text/text_image_vertical_alignment.json":"divkit/public/test_data/snapshot_test_data/div-text/text_image_vertical_alignment.json",
"test_data/snapshot_test_data/div-text/text_range_vertical_alignment.json":"divkit/public/test_data/snapshot_test_data/div-text/text_range_vertical_alignment.json",
"test_data/snapshot_test_data/div-text/text_range_with_cloud_background.json":"divkit/public/test_data/snapshot_test_data/div-text/text_range_with_cloud_background.json",
"test_data/snapshot_test_data/div-text/text_with_cloud_background_alignment.json":"divkit/public/test_data/snapshot_test_data/div-text/text_with_cloud_background_alignment.json",
"test_data/snapshot_test_data/div-text/text_with_cloud_background_padding.json":"divkit/public/test_data/snapshot_test_data/div-text/text_with_cloud_background_padding.json",
"test_data/snapshot_test_data/div-text/underline.json":"divkit/public/test_data/snapshot_test_data/div-text/underline.json",
"test_data/snapshot_test_data/div-text/variables-rendering.json":"divkit/public/test_data/snapshot_test_data/div-text/variables-rendering.json",
"test_data/snapshot_test_data/div-text/vertical-alignments.json":"divkit/public/test_data/snapshot_test_data/div-text/vertical-alignments.json",
@@ -0,0 +1,356 @@
package com.yandex.div.core.util.text
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Path
import android.graphics.Rect
import android.text.Layout
import android.util.DisplayMetrics
import androidx.annotation.ColorInt
import com.yandex.div.core.view2.divs.dpToPx
import com.yandex.div.core.view2.divs.unitToPx
import com.yandex.div.json.expressions.ExpressionResolver
import com.yandex.div2.DivCloudBackground
import com.yandex.div2.DivSizeUnit
import com.yandex.div2.DivTextRangeBackground
import com.yandex.div2.DivTextRangeBorder
import kotlin.math.abs
import kotlin.math.max
import kotlin.math.min
import kotlin.math.roundToInt
import kotlin.math.sign
internal class CloudTextRangeBackgroundRenderer(
private val context: Context,
private val expressionResolver: ExpressionResolver
) : DivTextRangesBackgroundRenderer() {
private val path = Path()
private val paint = Paint()
private val displayMetrics: DisplayMetrics
get() = context.resources.displayMetrics
override fun draw(
canvas: Canvas,
layout: Layout,
startLine: Int,
endLine: Int,
startOffset: Int,
endOffset: Int,
border: DivTextRangeBorder?,
background: DivTextRangeBackground?
) {
val cloudBackground = background?.value() as? DivCloudBackground ?: return
draw(canvas, layout, startLine, endLine, startOffset, endOffset, cloudBackground)
}
private fun draw(
canvas: Canvas,
layout: Layout,
startLine: Int,
endLine: Int,
startOffset: Int,
endOffset: Int,
background: DivCloudBackground
) {
val metrics = displayMetrics
val fillColor = background.color.evaluate(expressionResolver)
val cornerRadius = background.cornerRadius.evaluate(expressionResolver).dpToPx(metrics)
val unit = background.paddings?.unit?.evaluate(expressionResolver) ?: DivSizeUnit.DP
val padding = Rect(
background.paddings?.left?.evaluate(expressionResolver)?.unitToPx(metrics, unit) ?: 0,
background.paddings?.top?.evaluate(expressionResolver)?.unitToPx(metrics, unit) ?: 0,
background.paddings?.right?.evaluate(expressionResolver)?.unitToPx(metrics, unit) ?: 0,
background.paddings?.bottom?.evaluate(expressionResolver)?.unitToPx(metrics, unit) ?: 0
)
val lines = buildLines(layout, startLine, endLine, startOffset, endOffset, cornerRadius, padding)
if (lines.size < 2) {
drawLines(canvas, lines, 0, lines.size, cornerRadius, fillColor)
} else {
var componentStart = 0
var lineCount = 1
for (i in 0 until lines.size - 1) {
if (lines[i].left > lines[i + 1].right) {
drawLines(canvas, lines, componentStart, lineCount, cornerRadius, fillColor)
componentStart = i + 1
lineCount = 0
}
lineCount++
}
drawLines(canvas, lines, componentStart, lineCount, cornerRadius, fillColor)
}
}
private fun buildLines(
layout: Layout,
startLine: Int,
endLine: Int,
startOffset: Int,
endOffset: Int,
cornerRadius: Int,
padding: Rect
): Array<Rect> {
val lastLine = endLine - startLine
val lineCount = lastLine + 1
if (lineCount == 0) return emptyArray()
val lines = Array(lineCount) { index ->
Rect(
(if (index == 0) startOffset else layout.getLineLeft(startLine + index).roundToInt()) - padding.left,
layout.getLineTop(startLine + index) - padding.top,
(if (index == lastLine) endOffset else layout.getLineRight(startLine + index).roundToInt()) + padding.right,
layout.getLineBottom(startLine + index) + padding.bottom
)
}
coalesceInvisibleLeftBounds(lines)
coalesceInvisibleRightBounds(lines)
val leftBounds = IntArray(lineCount)
val rightBounds = IntArray(lineCount)
for (i in lines.indices) {
leftBounds[i] = -lines[i].left
rightBounds[i] = lines[i].right
}
coalesceCloseBounds(leftBounds, cornerRadius * 2)
coalesceCloseBounds(rightBounds, cornerRadius * 2)
for (i in lines.indices) {
lines[i].left = -leftBounds[i]
lines[i].right = rightBounds[i]
}
return lines
}
private fun coalesceInvisibleLeftBounds(lines: Array<Rect>) {
val lineCount = lines.size
var x = lines.first().left
var y = lines.first().top
for (i in lines.indices) {
val line = lines[i]
var visibleLineHeight = line.bottom - y
var j = i + 1
var nextX = Int.MIN_VALUE
while (j < lineCount && lines[j].top < line.bottom) {
if (lines[j].left <= line.left) {
visibleLineHeight -= line.bottom - lines[j].top
nextX = lines[j].left
break
}
j++
}
if (visibleLineHeight <= 0) {
line.left = max(x, nextX)
visibleLineHeight = 0
} else {
x = line.left
}
y += visibleLineHeight
}
}
private fun coalesceInvisibleRightBounds(lines: Array<Rect>) {
val lineCount = lines.size
var x = lines.first().right
var y = lines.first().top
for (i in lines.indices) {
val line = lines[i]
var visibleLineHeight = line.bottom - y
var j = i + 1
var nextX = Int.MAX_VALUE
while (j < lineCount && lines[j].top < line.bottom) {
if (lines[j].right >= line.right) {
visibleLineHeight -= line.bottom - lines[j].top
nextX = lines[j].right
break
}
j++
}
if (visibleLineHeight <= 0) {
line.right = min(x, nextX)
visibleLineHeight = 0
} else {
x = line.right
}
y += visibleLineHeight
}
}
private fun coalesceCloseBounds(lines: IntArray, minDelta: Int) {
var boundCoalesced: Boolean
var pass = 0
do {
boundCoalesced = false
val indices = if (pass % 2 == 0) lines.indices else lines.indices.reversed()
for (i in indices) {
val upDelta = if (i == 0) 0 else lines[i - 1] - lines[i]
val downDelta = if (i == lines.lastIndex) 0 else lines[i + 1] - lines[i]
val isStable = (upDelta <= 0 || upDelta >= minDelta) && (downDelta <= 0 || downDelta >= minDelta)
if (isStable) {
if (i != 0) {
if (upDelta < 0 && abs(upDelta) < minDelta) {
lines[i - 1] = lines[i]
boundCoalesced = true
}
}
if (i != lines.lastIndex) {
if (downDelta < 0 && abs(downDelta) < minDelta) {
lines[i + 1] = lines[i]
boundCoalesced = true
}
}
}
}
pass++
} while (boundCoalesced)
}
private fun drawLines(
canvas: Canvas,
lines: Array<Rect>,
start: Int,
lineCount: Int,
cornerRadius: Int,
@ColorInt fillColor: Int
) {
if (lineCount < 1) return
val firstLine = lines[start]
val lastLine = lines[start + lineCount - 1]
val leftSegments = buildLeftSegments(lines, start, lineCount)
val rightSegments = buildRightSegments(lines, start, lineCount)
path.reset()
val baseRadius = cornerRadius.toFloat()
var inRadius = min(baseRadius, min(firstLine.width() / 2.0f, rightSegments[OFFSET_SEGMENT_DELTA_Y] / 2.0f))
var outRadius = 0.0f
path.moveTo(firstLine.right.toFloat() - inRadius, firstLine.top.toFloat())
path.rQuadTo(0.9f * inRadius, 0.1f * inRadius, inRadius, inRadius)
for (i in rightSegments.indices step SEGMENT_VALUES) {
val isLastSegment = i >= rightSegments.size - SEGMENT_VALUES
val deltaX = rightSegments[i + OFFSET_SEGMENT_DELTA_X].toFloat()
val deltaY = rightSegments[i + OFFSET_SEGMENT_DELTA_Y].toFloat()
val nextDeltaY = if (isLastSegment) 0.0f else rightSegments[i + SEGMENT_VALUES + OFFSET_SEGMENT_DELTA_Y].toFloat()
outRadius = min(baseRadius, min(abs(deltaX) / 2.0f, deltaY / 2.0f))
path.rLineTo(0.0f, deltaY - inRadius - outRadius)
path.rQuadTo(0.1f * inRadius * deltaX.sign, 0.9f * outRadius, outRadius * deltaX.sign, outRadius)
if (!isLastSegment) {
inRadius = min(baseRadius, min(abs(deltaX) / 2.0f, nextDeltaY / 2.0f))
path.rLineTo(deltaX - (inRadius + outRadius) * deltaX.sign, 0.0f)
path.rQuadTo(0.9f * inRadius * deltaX.sign, 0.1f * inRadius, inRadius * deltaX.sign, inRadius)
}
}
inRadius = min(baseRadius, min(lastLine.width() / 2.0f, -leftSegments[OFFSET_SEGMENT_DELTA_Y] / 2.0f))
path.rLineTo(-lastLine.width().toFloat() + outRadius + inRadius, 0.0f)
path.rQuadTo(-0.9f * inRadius, -0.1f * inRadius, -inRadius, -inRadius)
for (i in leftSegments.indices step SEGMENT_VALUES) {
val isLastSegment = i >= leftSegments.size - SEGMENT_VALUES
val deltaX = leftSegments[i + OFFSET_SEGMENT_DELTA_X].toFloat()
val deltaY = leftSegments[i + OFFSET_SEGMENT_DELTA_Y].toFloat()
val nextDeltaY = if (isLastSegment) 0.0f else leftSegments[i + SEGMENT_VALUES + OFFSET_SEGMENT_DELTA_Y].toFloat()
outRadius = min(baseRadius, min(abs(deltaX) / 2.0f, -deltaY / 2.0f))
path.rLineTo(0.0f, deltaY + inRadius + outRadius)
path.rQuadTo(0.1f * outRadius * deltaX.sign, -0.9f * outRadius, outRadius * deltaX.sign, -outRadius)
if (!isLastSegment) {
inRadius = min(baseRadius, min(abs(deltaX) / 2.0f, -nextDeltaY / 2.0f))
path.rLineTo(deltaX - (inRadius + outRadius) * deltaX.sign, 0.0f)
path.rQuadTo(0.9f * inRadius * deltaX.sign, -0.1f * inRadius, inRadius * deltaX.sign, -inRadius)
}
}
path.close()
paint.color = fillColor
canvas.drawPath(path, paint)
}
private fun buildLeftSegments(lines: Array<Rect>, start: Int, lineCount: Int): IntArray {
val end = start + lineCount - 1
if (lineCount == 1) {
return IntArray(2).apply {
set(OFFSET_SEGMENT_DELTA_X, lines[end].width())
set(OFFSET_SEGMENT_DELTA_Y, -lines[end].height())
}
}
var x = lines[end].left
var y = lines[end].bottom
val segments = IntArray(lineCount * SEGMENT_VALUES)
var segmentIndex = 0
for (i in (start..end).reversed()) {
val line = lines[i]
if (line.left != x) {
segments[SEGMENT_VALUES * segmentIndex + OFFSET_SEGMENT_DELTA_X] = line.left - x
x = line.left
segmentIndex++
}
var deltaY = line.top - y
var j = i - 1
while (j >= start && lines[j].bottom > line.top) {
if (lines[j].left <= line.left) {
deltaY -= line.top - lines[j].bottom
break
}
j--
}
deltaY = deltaY.coerceAtMost(0)
segments[SEGMENT_VALUES * segmentIndex + OFFSET_SEGMENT_DELTA_Y] += deltaY
y += deltaY
}
segments[SEGMENT_VALUES * segmentIndex + OFFSET_SEGMENT_DELTA_X] = lines[start].width()
return segments.copyOf((segmentIndex + 1) * SEGMENT_VALUES)
}
private fun buildRightSegments(lines: Array<Rect>, start: Int, lineCount: Int): IntArray {
val end = start + lineCount - 1
if (lineCount == 1) {
return IntArray(2).apply {
set(OFFSET_SEGMENT_DELTA_X, -lines[start].width())
set(OFFSET_SEGMENT_DELTA_Y, lines[start].height())
}
}
var x = lines[start].right
var y = lines[start].top
val segments = IntArray(lineCount * SEGMENT_VALUES)
var segmentIndex = 0
for (i in start..end) {
val line = lines[i]
if (line.right != x) {
segments[SEGMENT_VALUES * segmentIndex + OFFSET_SEGMENT_DELTA_X] = line.right - x
x = line.right
segmentIndex++
}
var deltaY = line.bottom - y
var j = i + 1
while (j <= end && lines[j].top < line.bottom) {
if (lines[j].right >= line.right) {
deltaY -= line.bottom - lines[j].top
break
}
j++
}
deltaY = deltaY.coerceAtLeast(0)
segments[SEGMENT_VALUES * segmentIndex + OFFSET_SEGMENT_DELTA_Y] += deltaY
y += deltaY
}
segments[SEGMENT_VALUES * segmentIndex + OFFSET_SEGMENT_DELTA_X] = -lines[end].width()
return segments.copyOf((segmentIndex + 1) * SEGMENT_VALUES)
}
private companion object {
const val SEGMENT_VALUES = 2
const val OFFSET_SEGMENT_DELTA_X = 0
const val OFFSET_SEGMENT_DELTA_Y = 1
}
}
@@ -6,6 +6,7 @@ import android.text.SpannableStringBuilder
import android.text.Spanned
import android.view.View
import com.yandex.div.json.expressions.ExpressionResolver
import com.yandex.div2.DivTextRangeBackground
internal class DivTextRangesBackgroundHelper(
val view: View,
@@ -37,6 +38,13 @@ internal class DivTextRangesBackgroundHelper(
)
}
private val cloudBackgroundRenderer: CloudTextRangeBackgroundRenderer by lazy {
CloudTextRangeBackgroundRenderer(
context = view.context,
expressionResolver = resolver
)
}
fun draw(canvas: Canvas, text: Spanned, layout: Layout) {
spans.forEach { span ->
val spanStart = text.getSpanStart(span)
@@ -47,9 +55,18 @@ internal class DivTextRangesBackgroundHelper(
val startOffset = layout.getPrimaryHorizontal(spanStart).toInt()
val endOffset = layout.getPrimaryHorizontal(spanEnd).toInt()
val renderer = if (startLine == endLine) singleLineRenderer else multiLineRenderer
renderer.draw(canvas, layout, startLine, endLine, startOffset, endOffset,
span.border, span.background)
when (span.background) {
is DivTextRangeBackground.Cloud -> {
cloudBackgroundRenderer.draw(canvas, layout, startLine, endLine, startOffset, endOffset,
span.border, span.background)
}
else -> {
val renderer = if (startLine == endLine) singleLineRenderer else multiLineRenderer
renderer.draw(canvas, layout, startLine, endLine, startOffset, endOffset,
span.border, span.background)
}
}
}
}
}
+6 -4
View File
@@ -1,7 +1,9 @@
{
"type": "object",
"$description": "translations.json#/div_cloud_background",
"platforms": [],
"platforms": [
"android"
],
"properties": {
"type": {
"type": "string",
@@ -14,12 +16,12 @@
"$description": "translations.json#/div_cloud_background_color"
},
"corner_radius": {
"$ref": "div-fixed-size.json",
"$ref": "common.json#/non_negative_integer",
"$description": "translations.json#/div_cloud_background_corner_radius"
},
"padding": {
"paddings": {
"$ref": "div-edge-insets.json",
"$description": "translations.json#/div_cloud_background_padding"
"$description": "translations.json#/div_cloud_background_paddings"
}
},
"required": [
+1 -1
View File
@@ -667,7 +667,7 @@
"en": "Corner rounding radius.",
"ru": "Радиус скругления углов."
},
"div_cloud_background_padding": {
"div_cloud_background_paddings": {
"en": "Margins between line bounds and background.",
"ru": "Отступы от границы строки до границы фона."
},
@@ -0,0 +1,204 @@
{
"description": "Text range with cloud background",
"platforms": [
"android"
],
"templates": {
"title": {
"type": "text",
"font_size": 14,
"font_weight": "medium",
"text_color": "#586E75"
},
"test_text": {
"type": "text",
"width": {
"type": "fixed",
"value": 256
},
"paddings": {
"left": 16,
"top": 16,
"right": 16,
"bottom": 16
},
"background": [
{
"type": "solid",
"color": "#FDF6E3"
}
],
"border": {
"corner_radius": 12
},
"font_size": 16,
"font_weight": "medium",
"text_color": "#073642"
}
},
"card": {
"log_id": "text_range_with_cloud_background",
"states": [
{
"state_id": 0,
"div": {
"type": "container",
"paddings": {
"left": 16,
"top": 16,
"right": 16,
"bottom": 16
},
"background": [
{
"type": "solid",
"color": "#EEE8D5"
}
],
"items": [
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text range with cloud background"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"start": 12,
"end": 71,
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Disconnected text range"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"start": 51,
"end": 63,
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Weakly connected text range"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"start": 11,
"end": 40,
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Overlapping text ranges"
},
{
"type": "test_text",
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"start": 12,
"end": 71,
"background": {
"type": "cloud",
"color": "#40CB4B16",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
},
{
"start": 40,
"end": 99,
"background": {
"type": "cloud",
"color": "#40268BD2",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
}
]
}
}
]
}
}
@@ -0,0 +1,153 @@
{
"description": "Text with cloud background (alignment test)",
"platforms": [
"android"
],
"templates": {
"title": {
"type": "text",
"font_size": 14,
"font_weight": "medium",
"text_color": "#586E75"
},
"test_text": {
"type": "text",
"width": {
"type": "fixed",
"value": 256
},
"paddings": {
"left": 16,
"top": 16,
"right": 16,
"bottom": 16
},
"background": [
{
"type": "solid",
"color": "#FDF6E3"
}
],
"border": {
"corner_radius": 12
},
"font_size": 16,
"font_weight": "medium",
"text_color": "#073642"
}
},
"card": {
"log_id": "text_with_cloud_background_alignment",
"states": [
{
"state_id": 0,
"div": {
"type": "container",
"paddings": {
"left": 16,
"top": 16,
"right": 16,
"bottom": 16
},
"background": [
{
"type": "solid",
"color": "#EEE8D5"
}
],
"items": [
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text with cloud background: left alignment"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text with cloud background: center alignment"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text_alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text with cloud background: right alignment"
},
{
"type": "test_text",
"alignment_horizontal": "center",
"text_alignment_horizontal": "right",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 4,
"top": 4,
"right": 4,
"bottom": 4
}
}
}
]
}
]
}
}
]
}
}
@@ -0,0 +1,145 @@
{
"description": "Text with cloud background (padding test)",
"platforms": [
"android"
],
"templates": {
"title": {
"type": "text",
"font_size": 14,
"font_weight": "medium",
"text_color": "#586E75"
},
"test_text": {
"type": "text",
"width": {
"type": "fixed",
"value": 256
},
"paddings": {
"left": 16,
"top": 16,
"right": 16,
"bottom": 16
},
"background": [
{
"type": "solid",
"color": "#FDF6E3"
}
],
"border": {
"corner_radius": 12
},
"font_size": 16,
"font_weight": "medium",
"text_color": "#073642"
}
},
"card": {
"log_id": "text_with_cloud_background_padding",
"states": [
{
"state_id": 0,
"div": {
"type": "container",
"paddings": {
"left": 16,
"top": 16,
"right": 16,
"bottom": 16
},
"background": [
{
"type": "solid",
"color": "#EEE8D5"
}
],
"items": [
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text with cloud background: without padding"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text with cloud background: different padding"
},
{
"type": "test_text",
"margins": {
"bottom": 16
},
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 8,
"top": 12,
"right": 12,
"bottom": 0
}
}
}
]
},
{
"type": "title",
"margins": {
"bottom": 16
},
"text": "Text with cloud background: large padding"
},
{
"type": "test_text",
"alignment_horizontal": "center",
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"ranges": [
{
"background": {
"type": "cloud",
"color": "#20002B36",
"corner_radius": 12,
"paddings": {
"left": 12,
"top": 12,
"right": 12,
"bottom": 12
}
}
}
]
}
]
}
}
]
}
}