1cb93a386Sopenharmony_ci// Copyright 2021 Google LLC. 2cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 3cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 4cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 5cb93a386Sopenharmony_ci#include "include/core/SkEncodedImageFormat.h" 6cb93a386Sopenharmony_ci#include "include/core/SkFontMgr.h" 7cb93a386Sopenharmony_ci#include "include/core/SkFontStyle.h" 8cb93a386Sopenharmony_ci#include "include/core/SkImageEncoder.h" 9cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 10cb93a386Sopenharmony_ci#include "include/core/SkPoint.h" 11cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 12cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 13cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 14cb93a386Sopenharmony_ci#include "include/core/SkSpan.h" 15cb93a386Sopenharmony_ci#include "include/core/SkStream.h" 16cb93a386Sopenharmony_ci#include "include/core/SkString.h" 17cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 18cb93a386Sopenharmony_ci#include "include/core/SkTypes.h" 19cb93a386Sopenharmony_ci#include "tests/Test.h" 20cb93a386Sopenharmony_ci#include "tools/Resources.h" 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_ci#include "experimental/sktext/include/Text.h" 23cb93a386Sopenharmony_ci#include "experimental/sktext/src/Paint.h" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci#include <string.h> 26cb93a386Sopenharmony_ci#include <algorithm> 27cb93a386Sopenharmony_ci#include <limits> 28cb93a386Sopenharmony_ci#include <memory> 29cb93a386Sopenharmony_ci#include <string> 30cb93a386Sopenharmony_ci#include <utility> 31cb93a386Sopenharmony_ci#include <vector> 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_cistruct GrContextOptions; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci#define VeryLongCanvasWidth 1000000 36cb93a386Sopenharmony_ci#define TestCanvasWidth 1000 37cb93a386Sopenharmony_ci#define TestCanvasHeight 600 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciusing namespace skia::text; 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ciUNIX_ONLY_TEST(SkText_ShapedText_LTR, reporter) { 42cb93a386Sopenharmony_ci TrivialFontChain* fontChain = new TrivialFontChain("Roboto", 40.0f, SkFontStyle::Normal()); 43cb93a386Sopenharmony_ci if (fontChain->empty()) return; 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci std::u16string utf16(u"Hello world\nHello world"); 46cb93a386Sopenharmony_ci UnicodeText unicodeText(SkUnicode::Make(), SkSpan<uint16_t>((uint16_t*)utf16.data(), utf16.size())); 47cb93a386Sopenharmony_ci if (!unicodeText.getUnicode()) return; 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci FontBlock fontBlock(utf16.size(), sk_ref_sp<FontChain>(fontChain)); 50cb93a386Sopenharmony_ci auto fontResolvedText = unicodeText.resolveFonts(SkSpan<FontBlock>(&fontBlock, 1)); 51cb93a386Sopenharmony_ci auto shapedText = fontResolvedText->shape(&unicodeText, TextDirection::kLtr); 52cb93a386Sopenharmony_ci auto logicalRuns = shapedText->getLogicalRuns(); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci auto newLine = utf16.find_first_of(u"\n"); 55cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, logicalRuns.size() == 3); 56cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, logicalRuns[1].getRunType() == LogicalRunType::kLineBreak); 57cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, logicalRuns[1].getTextRange() == TextRange(newLine, newLine + 1)); 58cb93a386Sopenharmony_ci} 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ciUNIX_ONLY_TEST(SkText_ShapedText_RTL, reporter) { 61cb93a386Sopenharmony_ci sk_sp<TrivialFontChain> fontChain = sk_make_sp<TrivialFontChain>("Roboto", 40.0f, SkFontStyle::Normal()); 62cb93a386Sopenharmony_ci if (fontChain->empty()) return; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci std::u16string utf16(u"\u202EHELLO WORLD\nHELLO WORLD"); 65cb93a386Sopenharmony_ci UnicodeText unicodeText(SkUnicode::Make(), SkSpan<uint16_t>((uint16_t*)utf16.data(), utf16.size())); 66cb93a386Sopenharmony_ci if (!unicodeText.getUnicode()) return; 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci FontBlock fontBlock(utf16.size(), fontChain); 69cb93a386Sopenharmony_ci auto fontResolvedText = unicodeText.resolveFonts(SkSpan<FontBlock>(&fontBlock, 1)); 70cb93a386Sopenharmony_ci auto shapedText = fontResolvedText->shape(&unicodeText, TextDirection::kLtr); 71cb93a386Sopenharmony_ci auto logicalRuns = shapedText->getLogicalRuns(); 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci auto newLine = utf16.find_first_of(u"\n"); 74cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, logicalRuns.size() == 3); 75cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, logicalRuns[1].getRunType() == LogicalRunType::kLineBreak); 76cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, logicalRuns[1].getTextRange() == TextRange(newLine, newLine + 1)); 77cb93a386Sopenharmony_ci} 78