Merge pull request #3189 from stweil/pango_font_info_test

Enable pango_font_info_test and fix crash for MacOS with M1
This commit is contained in:
zdenop 2020-12-22 21:12:41 +01:00 committed by GitHub
commit b672eeee01
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 19 deletions

View File

@ -72,6 +72,19 @@ const int kDefaultResolution = 300;
std::string PangoFontInfo::fonts_dir_; std::string PangoFontInfo::fonts_dir_;
std::string PangoFontInfo::cache_dir_; std::string PangoFontInfo::cache_dir_;
static PangoGlyph get_glyph(PangoFont* font, gunichar wc) {
#if PANGO_VERSION_CHECK(1, 44, 0)
// pango_font_get_hb_font requires Pango 1.44 or newer.
hb_font_t* hb_font = pango_font_get_hb_font(font);
hb_codepoint_t glyph;
hb_font_get_nominal_glyph(hb_font, wc, &glyph);
#else
// Use deprecated pango_fc_font_get_glyph for older Pango versions.
PangoGlyph glyph = pango_fc_font_get_glyph(PANGO_FC_FONT(font), wc);
#endif
return glyph;
}
PangoFontInfo::PangoFontInfo() PangoFontInfo::PangoFontInfo()
: desc_(nullptr), resolution_(kDefaultResolution) { : desc_(nullptr), resolution_(kDefaultResolution) {
Clear(); Clear();
@ -327,8 +340,7 @@ bool PangoFontInfo::GetSpacingProperties(const std::string& utf8_char,
const UNICHAR::const_iterator it_end = UNICHAR::end(utf8_char.c_str(), const UNICHAR::const_iterator it_end = UNICHAR::end(utf8_char.c_str(),
utf8_char.length()); utf8_char.length());
for (UNICHAR::const_iterator it = it_begin; it != it_end; ++it) { for (UNICHAR::const_iterator it = it_begin; it != it_end; ++it) {
PangoGlyph glyph_index = pango_fc_font_get_glyph( PangoGlyph glyph_index = get_glyph(font, *it);
reinterpret_cast<PangoFcFont*>(font), *it);
if (!glyph_index) { if (!glyph_index) {
// Glyph for given unicode character doesn't exist in font. // Glyph for given unicode character doesn't exist in font.
g_object_unref(font); g_object_unref(font);
@ -402,15 +414,7 @@ bool PangoFontInfo::CanRenderString(const char* utf8_word, int len,
PangoGlyph dotted_circle_glyph; PangoGlyph dotted_circle_glyph;
PangoFont* font = run->item->analysis.font; PangoFont* font = run->item->analysis.font;
#ifdef _WIN32 dotted_circle_glyph = get_glyph(font, kDottedCircleGlyph);
PangoGlyphString* glyphs = pango_glyph_string_new();
const char s[] = "\xc2\xa7";
pango_shape(s, strlen(s), &(run->item->analysis), glyphs);
dotted_circle_glyph = glyphs->glyphs[0].glyph;
#else // TODO: Do we need separate solution for non win build?
dotted_circle_glyph = pango_fc_font_get_glyph(
reinterpret_cast<PangoFcFont*>(font), kDottedCircleGlyph);
#endif
if (TLOG_IS_ON(2)) { if (TLOG_IS_ON(2)) {
PangoFontDescription* desc = pango_font_describe(font); PangoFontDescription* desc = pango_font_describe(font);
@ -463,9 +467,6 @@ bool PangoFontInfo::CanRenderString(const char* utf8_word, int len,
if (bad_glyph) if (bad_glyph)
tlog(1, "Found illegal glyph!\n"); tlog(1, "Found illegal glyph!\n");
} }
#ifdef _WIN32
pango_glyph_string_free(glyphs);
#endif
} while (!bad_glyph && pango_layout_iter_next_run(run_iter)); } while (!bad_glyph && pango_layout_iter_next_run(run_iter));
pango_layout_iter_free(run_iter); pango_layout_iter_free(run_iter);

View File

@ -177,9 +177,7 @@ check_PROGRAMS += osd_test
endif # !DISABLED_LEGACY_ENGINE endif # !DISABLED_LEGACY_ENGINE
check_PROGRAMS += pagesegmode_test check_PROGRAMS += pagesegmode_test
if ENABLE_TRAINING if ENABLE_TRAINING
if TENSORFLOW
check_PROGRAMS += pango_font_info_test check_PROGRAMS += pango_font_info_test
endif # TENSORFLOW
endif # ENABLE_TRAINING endif # ENABLE_TRAINING
check_PROGRAMS += paragraphs_test check_PROGRAMS += paragraphs_test
if !DISABLED_LEGACY_ENGINE if !DISABLED_LEGACY_ENGINE
@ -363,15 +361,16 @@ endif # !DISABLED_LEGACY_ENGINE
pagesegmode_test_SOURCES = pagesegmode_test.cc pagesegmode_test_SOURCES = pagesegmode_test.cc
pagesegmode_test_LDADD = $(TRAINING_LIBS) $(LEPTONICA_LIBS) pagesegmode_test_LDADD = $(TRAINING_LIBS) $(LEPTONICA_LIBS)
if TENSORFLOW
pango_font_info_test_SOURCES = pango_font_info_test.cc pango_font_info_test_SOURCES = pango_font_info_test.cc
if TENSORFLOW
pango_font_info_test_SOURCES += third_party/utf/rune.c pango_font_info_test_SOURCES += third_party/utf/rune.c
pango_font_info_test_SOURCES += util/utf8/unicodetext.cc util/utf8/unilib.cc pango_font_info_test_SOURCES += util/utf8/unicodetext.cc
pango_font_info_test_SOURCES += util/utf8/unilib.cc
endif # TENSORFLOW
pango_font_info_test_LDADD = $(ABSEIL_LIBS) $(TRAINING_LIBS) $(LEPTONICA_LIBS) pango_font_info_test_LDADD = $(ABSEIL_LIBS) $(TRAINING_LIBS) $(LEPTONICA_LIBS)
pango_font_info_test_LDADD += $(ICU_I18N_LIBS) pango_font_info_test_LDADD += $(ICU_I18N_LIBS)
pango_font_info_test_LDADD += $(pangocairo_LIBS) pango_font_info_test_LDADD += $(pangocairo_LIBS)
pango_font_info_test_LDADD += $(pangoft2_LIBS) pango_font_info_test_LDADD += $(pangoft2_LIBS)
endif # TENSORFLOW
paragraphs_test_SOURCES = paragraphs_test.cc paragraphs_test_SOURCES = paragraphs_test.cc
paragraphs_test_LDADD = $(ABSEIL_LIBS) $(TESS_LIBS) paragraphs_test_LDADD = $(ABSEIL_LIBS) $(TESS_LIBS)

View File

@ -18,7 +18,9 @@
#include "pango_font_info.h" #include "pango_font_info.h"
#include "absl/strings/str_cat.h" // for absl::StrCat #include "absl/strings/str_cat.h" // for absl::StrCat
#include "gmock/gmock-matchers.h" // for EXPECT_THAT #include "gmock/gmock-matchers.h" // for EXPECT_THAT
#ifdef INCLUDE_TENSORFLOW
#include "util/utf8/unicodetext.h" // for UnicodeText #include "util/utf8/unicodetext.h" // for UnicodeText
#endif
DECLARE_STRING_PARAM_FLAG(fonts_dir); DECLARE_STRING_PARAM_FLAG(fonts_dir);
DECLARE_STRING_PARAM_FLAG(fontconfig_tmpdir); DECLARE_STRING_PARAM_FLAG(fontconfig_tmpdir);
@ -187,6 +189,7 @@ class FontUtilsTest : public ::testing::Test {
FLAGS_fontconfig_tmpdir = FLAGS_test_tmpdir; FLAGS_fontconfig_tmpdir = FLAGS_test_tmpdir;
} }
#ifdef INCLUDE_TENSORFLOW
void CountUnicodeChars(const char* utf8_text, void CountUnicodeChars(const char* utf8_text,
std::unordered_map<char32, int64_t>* ch_map) { std::unordered_map<char32, int64_t>* ch_map) {
ch_map->clear(); ch_map->clear();
@ -201,6 +204,7 @@ class FontUtilsTest : public ::testing::Test {
++(*ch_map)[*it]; ++(*ch_map)[*it];
} }
} }
#endif
}; };
TEST_F(FontUtilsTest, DoesFindAvailableFonts) { TEST_F(FontUtilsTest, DoesFindAvailableFonts) {
@ -234,6 +238,7 @@ TEST_F(FontUtilsTest, DoesListAvailableFonts) {
} }
} }
#ifdef INCLUDE_TENSORFLOW
TEST_F(FontUtilsTest, DoesFindBestFonts) { TEST_F(FontUtilsTest, DoesFindBestFonts) {
std::string fonts_list; std::string fonts_list;
std::unordered_map<char32, int64_t> ch_map; std::unordered_map<char32, int64_t> ch_map;
@ -252,6 +257,7 @@ TEST_F(FontUtilsTest, DoesFindBestFonts) {
EXPECT_EQ(1, font_flags.size()); EXPECT_EQ(1, font_flags.size());
EXPECT_STREQ("UnBatang", font_flags[0].first); EXPECT_STREQ("UnBatang", font_flags[0].first);
} }
#endif
TEST_F(FontUtilsTest, DoesSelectFont) { TEST_F(FontUtilsTest, DoesSelectFont) {
const char* kLangText[] = {kArabicText, kEngText, kHinText, kKorText, nullptr}; const char* kLangText[] = {kArabicText, kEngText, kHinText, kKorText, nullptr};