diff --git a/.mapping.json b/.mapping.json index b9c631158..774343e3f 100644 --- a/.mapping.json +++ b/.mapping.json @@ -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", diff --git a/client/android/div/src/main/java/com/yandex/div/core/util/text/CloudTextRangeBackgroundRenderer.kt b/client/android/div/src/main/java/com/yandex/div/core/util/text/CloudTextRangeBackgroundRenderer.kt new file mode 100644 index 000000000..8500b26d4 --- /dev/null +++ b/client/android/div/src/main/java/com/yandex/div/core/util/text/CloudTextRangeBackgroundRenderer.kt @@ -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 { + 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) { + 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) { + 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, + 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, 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, 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 + } +} diff --git a/client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundHelper.kt b/client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundHelper.kt index fe31e1428..127dfd0a0 100644 --- a/client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundHelper.kt +++ b/client/android/div/src/main/java/com/yandex/div/core/util/text/DivTextRangesBackgroundHelper.kt @@ -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) + } + } } } } diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..fefbca482 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..17ca903d5 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..14e5f4e17 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API24_HDPI_540x1200/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..4801c00b0 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..f1499afed Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..d97e11627 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..7bc2b4898 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..57fa48ff6 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..4b5a167e6 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API26_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..3622184c9 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..8fb152aa0 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..f51e1f7e1 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..7bc2b4898 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..57fa48ff6 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..4b5a167e6 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API28_XHDPI_720x1600/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..fbd05f2cb Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..a4cf7bf6d Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..040e35fe9 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..a89b05cf3 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..eaf653b8b Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..9251304ed Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API30_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..ef2e9372f Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..0a89e0122 Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..b1f9b411a Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewPixelCopy/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png new file mode 100644 index 000000000..cf7377bdb Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_range_with_cloud_background.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png new file mode 100644 index 000000000..a1177ba3e Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_alignment.png differ diff --git a/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png new file mode 100644 index 000000000..a6935aabf Binary files /dev/null and b/client/android/divkit-demo-app/src/screenshotTest/screenshots/API32_XXHDPI_1080x2400/viewRender/com.yandex.div.Div2ScreenshotTest/div-text/text_with_cloud_background_padding.png differ diff --git a/schema/div-cloud-background.json b/schema/div-cloud-background.json index 395efa136..178650f70 100644 --- a/schema/div-cloud-background.json +++ b/schema/div-cloud-background.json @@ -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": [ diff --git a/schema/translations.json b/schema/translations.json index 9db8e77cd..aa241a143 100644 --- a/schema/translations.json +++ b/schema/translations.json @@ -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": "Отступы от границы строки до границы фона." }, diff --git a/test_data/snapshot_test_data/div-text/text_range_with_cloud_background.json b/test_data/snapshot_test_data/div-text/text_range_with_cloud_background.json new file mode 100644 index 000000000..5f35b8559 --- /dev/null +++ b/test_data/snapshot_test_data/div-text/text_range_with_cloud_background.json @@ -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 + } + } + } + ] + } + ] + } + } + ] + } +} diff --git a/test_data/snapshot_test_data/div-text/text_with_cloud_background_alignment.json b/test_data/snapshot_test_data/div-text/text_with_cloud_background_alignment.json new file mode 100644 index 000000000..e87e397c6 --- /dev/null +++ b/test_data/snapshot_test_data/div-text/text_with_cloud_background_alignment.json @@ -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 + } + } + } + ] + } + ] + } + } + ] + } +} diff --git a/test_data/snapshot_test_data/div-text/text_with_cloud_background_padding.json b/test_data/snapshot_test_data/div-text/text_with_cloud_background_padding.json new file mode 100644 index 000000000..143a2fcf6 --- /dev/null +++ b/test_data/snapshot_test_data/div-text/text_with_cloud_background_padding.json @@ -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 + } + } + } + ] + } + ] + } + } + ] + } +}