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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user