Implementation of BFont::Blocks

BFont::Blocks is now implemented in ServerFont, via a call through the
app_server.  It uses fontconfig to iterate through a charset of a font
and stores the defined blocks in a bitmap.

A new API was added, BFont::IncludesBlock, that will allow for arbitrary
testing of a given Unicode block. Since nothing is cached, searching
through an entire charset for a series of Unicode blocks can be quite
slow. In a given block there may be only 1 or 2 characters actually
defined so every character within a block needs to be checked until one
is found, which in a degenerate case will mean the entire block is
checked.

Signed-off-by: Axel Dörfler <[email protected]>
This commit is contained in:
dsizzle
2017-05-08 22:17:53 +02:00
committed by Axel Dörfler
parent b17d5d1c48
commit 9b6b158b88
11 changed files with 425 additions and 10 deletions
+12 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2005-2015, Haiku, Inc. All rights reserved.
* Copyright 2005-2016, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _FONT_H_
@@ -120,6 +120,15 @@ private:
};
struct unicode_block_range {
uint32 start;
uint32 end;
const unicode_block& block;
uint32 Count() const { return end + 1 - start; }
};
struct edge_info {
float left;
float right;
@@ -201,6 +210,7 @@ public:
bool IsFullAndHalfFixed() const;
BRect BoundingBox() const;
unicode_block Blocks() const;
bool IncludesBlock(uint32 start, uint32 end) const;
font_file_format FileFormat() const;
int32 CountTuned() const;
@@ -371,6 +381,7 @@ unicode_block::operator=(const unicode_block& block)
{
fData[0] = block.fData[0];
fData[1] = block.fData[1];
return *this;
}
+79 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2001-2009, Haiku, Inc. All rights reserved.
* Copyright 2001-2016, Haiku, Inc. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _UNICODEBLOCKOBJECTS_H
@@ -10,6 +10,8 @@
// Unicode block list with their unicode encoding range
//
// Original BeOS-compatible blocks
const unicode_block B_BASIC_LATIN_BLOCK( /* 0000 - 007F */ 0x0000000000000000LL, 0x0000000000000001LL);
const unicode_block B_LATIN1_SUPPLEMENT_BLOCK( /* 0080 - 00FF */ 0x0000000000000000LL, 0x0000000000000002LL);
const unicode_block B_LATIN_EXTENDED_A_BLOCK( /* 0100 - 017F */ 0x0000000000000000LL, 0x0000000000000004LL);
@@ -82,4 +84,80 @@ const unicode_block B_HALFWIDTH_AND_FULLWIDTH_FORMS_BLOCK( /* FF00 - FFEF */ 0
const unicode_block B_SPECIALS_BLOCK( /* FEFF and FFF0 - FFFF */ 0x0000000000000020LL, 0x0000000000000000LL);
const unicode_block B_TIBETAN_BLOCK( /* 0F00 - 0FBF */ 0x0000000000000040LL, 0x0000000000000000LL);
const unicode_block_range kUnicodeBlockMap[] = {
{0x0000, 0x007f, B_BASIC_LATIN_BLOCK },
{0x0080, 0x00ff, B_LATIN1_SUPPLEMENT_BLOCK },
{0x0100, 0x017f, B_LATIN_EXTENDED_A_BLOCK },
{0x0180, 0x024f, B_LATIN_EXTENDED_B_BLOCK },
{0x0250, 0x02af, B_IPA_EXTENSIONS_BLOCK },
{0x02b0, 0x02ff, B_SPACING_MODIFIER_LETTERS_BLOCK },
{0x0300, 0x036f, B_COMBINING_DIACRITICAL_MARKS_BLOCK },
{0x0370, 0x03cf, B_BASIC_GREEK_BLOCK },
{0x03d0, 0x03ff, B_GREEK_SYMBOLS_AND_COPTIC_BLOCK },
{0x0400, 0x04ff, B_CYRILLIC_BLOCK },
{0x0530, 0x058f, B_ARMENIAN_BLOCK },
{0x0590, 0x05cf, B_BASIC_HEBREW_BLOCK },
{0x05d0, 0x05ff, B_HEBREW_EXTENDED_BLOCK },
{0x0600, 0x0670, B_BASIC_ARABIC_BLOCK },
{0x0671, 0x06ff, B_ARABIC_EXTENDED_BLOCK },
{0x0900, 0x097f, B_DEVANAGARI_BLOCK },
{0x0980, 0x09ff, B_BENGALI_BLOCK },
{0x0a00, 0x0a7f, B_GURMUKHI_BLOCK },
{0x0a80, 0x0aff, B_GUJARATI_BLOCK },
{0x0b00, 0x0b7f, B_ORIYA_BLOCK },
{0x0b80, 0x0bff, B_TAMIL_BLOCK },
{0x0c00, 0x0c7f, B_TELUGU_BLOCK },
{0x0c80, 0x0cff, B_KANNADA_BLOCK},
{0x0d00, 0x0d7f, B_MALAYALAM_BLOCK},
{0x0e00, 0x0e7f, B_THAI_BLOCK},
{0x0e80, 0x0eff, B_LAO_BLOCK},
{0x0f00, 0x0fff, B_TIBETAN_BLOCK},
{0x10a0, 0x10ff, B_BASIC_GEORGIAN_BLOCK},
{0x1100, 0x11ff, B_HANGUL_JAMO_BLOCK},
{0x1e00, 0x1eff, B_LATIN_EXTENDED_ADDITIONAL_BLOCK},
{0x1f00, 0x1fff, B_GREEK_EXTENDED_BLOCK},
{0x2000, 0x206f, B_GENERAL_PUNCTUATION_BLOCK},
{0x2070, 0x209f, B_SUPERSCRIPTS_AND_SUBSCRIPTS_BLOCK},
{0x20a0, 0x20cf, B_CURRENCY_SYMBOLS_BLOCK},
{0x20d0, 0x20ff, B_COMBINING_MARKS_FOR_SYMBOLS_BLOCK},
{0x2100, 0x214f, B_LETTERLIKE_SYMBOLS_BLOCK},
{0x2150, 0x218f, B_NUMBER_FORMS_BLOCK},
{0x2190, 0x21ff, B_ARROWS_BLOCK},
{0x2200, 0x22ff, B_MATHEMATICAL_OPERATORS_BLOCK},
{0x2300, 0x23ff, B_MISCELLANEOUS_TECHNICAL_BLOCK},
{0x2400, 0x243f, B_CONTROL_PICTURES_BLOCK},
{0x2440, 0x245f, B_OPTICAL_CHARACTER_RECOGNITION_BLOCK},
{0x2460, 0x24ff, B_ENCLOSED_ALPHANUMERICS_BLOCK},
{0x2500, 0x257f, B_BOX_DRAWING_BLOCK},
{0x2580, 0x259f, B_BLOCK_ELEMENTS_BLOCK},
{0x25a0, 0x25ff, B_GEOMETRIC_SHAPES_BLOCK},
{0x2600, 0x26ff, B_MISCELLANEOUS_SYMBOLS_BLOCK},
{0x2700, 0x27bf, B_DINGBATS_BLOCK},
{0x3000, 0x303f, B_CJK_SYMBOLS_AND_PUNCTUATION_BLOCK},
{0x3040, 0x309f, B_HIRAGANA_BLOCK},
{0x30a0, 0x30ff, B_KATAKANA_BLOCK},
{0x3100, 0x312f, B_BOPOMOFO_BLOCK},
{0x3130, 0x318f, B_HANGUL_COMPATIBILITY_JAMO_BLOCK},
{0x3190, 0x319f, B_CJK_MISCELLANEOUS_BLOCK},
{0x3200, 0x32ff, B_ENCLOSED_CJK_LETTERS_AND_MONTHS_BLOCK},
{0x3300, 0x33ff, B_CJK_COMPATIBILITY_BLOCK},
{0x4e00, 0x9fff, B_CJK_UNIFIED_IDEOGRAPHS_BLOCK},
{0xd800, 0xdb7f, B_HIGH_SURROGATES_BLOCK},
{0xdc00, 0xdfff, B_LOW_SURROGATES_BLOCK},
{0xe000, 0xf8ff, B_PRIVATE_USE_AREA_BLOCK},
{0xf900, 0xfaff, B_CJK_COMPATIBILITY_IDEOGRAPHS_BLOCK},
{0xfb00, 0xfb4f, B_ALPHABETIC_PRESENTATION_FORMS_BLOCK},
{0xfb50, 0xfdff, B_ARABIC_PRESENTATION_FORMS_A_BLOCK},
{0xfe20, 0xfe2f, B_COMBINING_HALF_MARKS_BLOCK},
{0xfe30, 0xfe4f, B_CJK_COMPATIBILITY_FORMS_BLOCK},
{0xfe50, 0xfe6f, B_SMALL_FORM_VARIANTS_BLOCK},
{0xfe70, 0xfeff, B_ARABIC_PRESENTATION_FORMS_B_BLOCK},
{0xff00, 0xffef, B_HALFWIDTH_AND_FULLWIDTH_FORMS_BLOCK},
{0xfff0, 0xffff, B_SPECIALS_BLOCK}
};
const uint32 kNumUnicodeBlockRanges
= sizeof(kUnicodeBlockMap) / sizeof(kUnicodeBlockMap[0]);
#endif // _UNICODEBLOCKOBJECTS_H
+3 -1
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2001-2015, Haiku.
* Copyright 2001-2016, Haiku.
* Distributed under the terms of the MIT License.
*
* Authors:
@@ -143,6 +143,8 @@ enum {
AS_GET_HAS_GLYPHS,
AS_GET_GLYPH_SHAPES,
AS_GET_TRUNCATED_STRINGS,
AS_GET_UNICODE_BLOCKS,
AS_GET_HAS_UNICODE_BLOCK,
// Screen methods
AS_VALID_SCREEN_ID,