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_FontResolution1, 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"); 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 52cb93a386Sopenharmony_ci auto resolvedFonts = fontResolvedText->resolvedFonts(); 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts.size() == 1); 55cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts.front().textRange.width() == utf16.size()); 56cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts.front().typeface->uniqueID() == fontChain->getTypeface()->uniqueID()); 57cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts.front().size == 40.0f); 58cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts.front().style == SkFontStyle::Normal()); 59cb93a386Sopenharmony_ci} 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ciUNIX_ONLY_TEST(SkText_FontResolution3, reporter) { 62cb93a386Sopenharmony_ci MultipleFontChain* fontChain = new MultipleFontChain({ "Roboto", "Noto Color Emoji", "Noto Serif CJK JP" }, 40.0f, SkFontStyle::Normal()); 63cb93a386Sopenharmony_ci if (fontChain->count() < 3) return; 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci std::u16string utf16(u"English English 字典 字典 "); 66cb93a386Sopenharmony_ci UnicodeText unicodeText(SkUnicode::Make(), SkSpan<uint16_t>((uint16_t*)utf16.data(), utf16.size())); 67cb93a386Sopenharmony_ci if (!unicodeText.getUnicode()) return; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci FontBlock fontBlock(utf16.size(), sk_ref_sp<FontChain>(fontChain)); 70cb93a386Sopenharmony_ci auto fontResolvedText = unicodeText.resolveFonts(SkSpan<FontBlock>(&fontBlock, 1)); 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci auto resolvedFonts = fontResolvedText->resolvedFonts(); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci TextIndex prev = 0; 75cb93a386Sopenharmony_ci for (auto& rf : resolvedFonts) { 76cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, prev == rf.textRange.fStart); 77cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, rf.textRange.width() > 0.0f); 78cb93a386Sopenharmony_ci prev = rf.textRange.fEnd; 79cb93a386Sopenharmony_ci } 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts.size() == 8 /* 1English 3English spaces + 2Emoji + 2JP */); 82cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts[0].textRange.fStart == 0); 83cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts[7].textRange.fEnd == utf16.size()); 84cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts[0].size == 40.0f); 85cb93a386Sopenharmony_ci REPORTER_ASSERT(reporter, resolvedFonts[0].style == SkFontStyle::Normal()); 86cb93a386Sopenharmony_ci} 87