1/* 2 * Copyright 2005-2009, Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _FONT_H_ 6#define _FONT_H_ 7 8 9#include <SupportDefs.h> 10#include <InterfaceDefs.h> 11 12 13class BPoint; 14 15 16#define B_FONT_FAMILY_LENGTH 63 17#define B_FONT_STYLE_LENGTH 63 18typedef char font_family[B_FONT_FAMILY_LENGTH + 1]; 19typedef char font_style[B_FONT_STYLE_LENGTH + 1]; 20 21 22// font spacing 23enum { 24 B_CHAR_SPACING = 0, 25 B_STRING_SPACING = 1, 26 B_BITMAP_SPACING = 2, 27 B_FIXED_SPACING = 3 28}; 29 30 31enum font_direction { 32 B_FONT_LEFT_TO_RIGHT = 0, 33 B_FONT_RIGHT_TO_LEFT = 1 34}; 35 36 37// font flags 38enum { 39 B_DISABLE_ANTIALIASING = 0x00000001, 40 B_FORCE_ANTIALIASING = 0x00000002 41}; 42 43 44// truncation modes 45enum { 46 B_TRUNCATE_END = 0, 47 B_TRUNCATE_BEGINNING = 1, 48 B_TRUNCATE_MIDDLE = 2, 49 B_TRUNCATE_SMART = 3 50}; 51 52 53// font encodings 54enum { 55 B_UNICODE_UTF8 = 0, 56 B_ISO_8859_1 = 1, 57 B_ISO_8859_2 = 2, 58 B_ISO_8859_3 = 3, 59 B_ISO_8859_4 = 4, 60 B_ISO_8859_5 = 5, 61 B_ISO_8859_6 = 6, 62 B_ISO_8859_7 = 7, 63 B_ISO_8859_8 = 8, 64 B_ISO_8859_9 = 9, 65 B_ISO_8859_10 = 10, 66 B_MACINTOSH_ROMAN = 11 67}; 68 69 70// flags for get_font_family() and get_font_style() 71enum { 72 B_HAS_TUNED_FONT = 0x0001, 73 B_IS_FIXED = 0x0002 74}; 75 76 77// font face flags 78enum { 79 B_ITALIC_FACE = 0x0001, 80 B_UNDERSCORE_FACE = 0x0002, 81 B_NEGATIVE_FACE = 0x0004, 82 B_OUTLINED_FACE = 0x0008, 83 B_STRIKEOUT_FACE = 0x0010, 84 B_BOLD_FACE = 0x0020, 85 B_REGULAR_FACE = 0x0040, 86 // new in Haiku: 87 B_CONDENSED_FACE = 0x0080, 88 B_LIGHT_FACE = 0x0100, 89 B_HEAVY_FACE = 0x0200, 90}; 91 92 93enum font_metric_mode { 94 B_SCREEN_METRIC = 0, 95 B_PRINTING_METRIC = 1 96}; 97 98 99enum font_file_format { 100 B_TRUETYPE_WINDOWS = 0, 101 B_POSTSCRIPT_TYPE1_WINDOWS = 1 102}; 103 104 105class unicode_block { 106public: 107 inline unicode_block(); 108 inline unicode_block(uint64 block2, uint64 block1); 109 110 inline bool Includes(const unicode_block& block) const; 111 inline unicode_block operator&(const unicode_block& block) const; 112 inline unicode_block operator|(const unicode_block& block) const; 113 inline unicode_block& operator=(const unicode_block& block); 114 inline bool operator==(const unicode_block& block) const; 115 inline bool operator!=(const unicode_block& block) const; 116 117private: 118 uint64 fData[2]; 119}; 120 121 122struct edge_info { 123 float left; 124 float right; 125}; 126 127 128struct font_height { 129 float ascent; 130 float descent; 131 float leading; 132}; 133 134 135struct escapement_delta { 136 float nonspace; 137 float space; 138}; 139 140 141struct font_cache_info { 142 int32 sheared_font_penalty; 143 int32 rotated_font_penalty; 144 float oversize_threshold; 145 int32 oversize_penalty; 146 int32 cache_size; 147 float spacing_size_threshold; 148}; 149 150 151struct tuned_font_info { 152 float size; 153 float shear; 154 float rotation; 155 uint32 flags; 156 uint16 face; 157}; 158 159 160class BShape; 161class BString; 162class BFontPrivate; 163 164 165class BFont { 166public: 167 BFont(); 168 BFont(const BFont& font); 169 BFont(const BFont* font); 170 171 status_t SetFamilyAndStyle(const font_family family, 172 const font_style style); 173 void SetFamilyAndStyle(uint32 code); 174 status_t SetFamilyAndFace(const font_family family, 175 uint16 face); 176 177 void SetSize(float size); 178 void SetShear(float shear); 179 void SetRotation(float rotation); 180 void SetFalseBoldWidth(float width); 181 void SetSpacing(uint8 spacing); 182 void SetEncoding(uint8 encoding); 183 void SetFace(uint16 face); 184 void SetFlags(uint32 flags); 185 186 void GetFamilyAndStyle(font_family* family, 187 font_style* style) const; 188 uint32 FamilyAndStyle() const; 189 float Size() const; 190 float Shear() const; 191 float Rotation() const; 192 float FalseBoldWidth() const; 193 uint8 Spacing() const; 194 uint8 Encoding() const; 195 uint16 Face() const; 196 uint32 Flags() const; 197 198 font_direction Direction() const; 199 bool IsFixed() const; 200 bool IsFullAndHalfFixed() const; 201 BRect BoundingBox() const; 202 unicode_block Blocks() const; 203 font_file_format FileFormat() const; 204 205 int32 CountTuned() const; 206 void GetTunedInfo(int32 index, 207 tuned_font_info* info) const; 208 209 void TruncateString(BString* inOut, uint32 mode, 210 float width) const; 211 void GetTruncatedStrings(const char* stringArray[], 212 int32 numStrings, uint32 mode, float width, 213 BString resultArray[]) const; 214 void GetTruncatedStrings(const char* stringArray[], 215 int32 numStrings, uint32 mode, 216 float width, char* resultArray[]) const; 217 218 float StringWidth(const char* string) const; 219 float StringWidth(const char* string, 220 int32 length) const; 221 void GetStringWidths(const char* stringArray[], 222 const int32 lengthArray[], 223 int32 numStrings, 224 float widthArray[]) const; 225 226 void GetEscapements(const char charArray[], 227 int32 numChars, 228 float escapementArray[]) const; 229 void GetEscapements(const char charArray[], 230 int32 numChars, escapement_delta* delta, 231 float escapementArray[]) const; 232 void GetEscapements(const char charArray[], 233 int32 numChars, escapement_delta* delta, 234 BPoint escapementArray[]) const; 235 void GetEscapements(const char charArray[], 236 int32 numChars, escapement_delta* delta, 237 BPoint escapementArray[], 238 BPoint offsetArray[]) const; 239 240 void GetEdges(const char charArray[], 241 int32 numBytes, 242 edge_info edgeArray[]) const; 243 void GetHeight(font_height* height) const; 244 245 void GetBoundingBoxesAsGlyphs( 246 const char charArray[], int32 numChars, 247 font_metric_mode mode, 248 BRect boundingBoxArray[]) const; 249 void GetBoundingBoxesAsString( 250 const char charArray[], int32 numChars, 251 font_metric_mode mode, 252 escapement_delta* delta, 253 BRect boundingBoxArray[]) const; 254 void GetBoundingBoxesForStrings( 255 const char* stringArray[], 256 int32 numStrings, font_metric_mode mode, 257 escapement_delta deltas[], 258 BRect boundingBoxArray[]) const; 259 260 void GetGlyphShapes(const char charArray[], 261 int32 numChars, 262 BShape* glyphShapeArray[]) const; 263 264 void GetHasGlyphs(const char charArray[], 265 int32 numChars, 266 bool hasArray[]) const; 267 268 BFont& operator=(const BFont& font); 269 bool operator==(const BFont& font) const; 270 bool operator!=(const BFont& font) const; 271 272 void PrintToStream() const; 273 274private: 275 friend void _init_global_fonts_(); 276 277 void _GetExtraFlags() const; 278 void _GetBoundingBoxes(const char charArray[], 279 int32 numChars, font_metric_mode mode, 280 bool string_escapement, 281 escapement_delta* delta, 282 BRect boundingBoxArray[], 283 bool asString) const; 284 285private: 286 uint16 fFamilyID; 287 uint16 fStyleID; 288 float fSize; 289 float fShear; 290 float fRotation; 291 float fFalseBoldWidth; 292 uint8 fSpacing; 293 uint8 fEncoding; 294 uint16 fFace; 295 uint32 fFlags; 296 mutable font_height fHeight; 297 mutable uint32 fExtraFlags; 298 299 uint32 _reserved[1]; 300}; 301 302 303// #pragma mark - BFont related declarations 304 305extern const BFont* be_plain_font; 306extern const BFont* be_bold_font; 307extern const BFont* be_fixed_font; 308 309int32 count_font_families(void); 310status_t get_font_family(int32 index, font_family* name, 311 uint32* flags = NULL); 312 313int32 count_font_styles(font_family name); 314status_t get_font_style(font_family family, int32 index, font_style* name, 315 uint32* flags = NULL); 316status_t get_font_style(font_family family, int32 index, font_style* name, 317 uint16* face, uint32* flags = NULL); 318bool update_font_families(bool checkOnly); 319 320 321 322// #pragma mark - unicode_block inlines 323 324 325unicode_block::unicode_block() 326{ 327 fData[0] = fData[1] = 0LL; 328} 329 330 331unicode_block::unicode_block(uint64 block2, uint64 block1) 332{ 333 fData[0] = block1; 334 fData[1] = block2; 335} 336 337 338bool 339unicode_block::Includes(const unicode_block& block) const 340{ 341 return (fData[0] & block.fData[0]) == block.fData[0] 342 && (fData[1] & block.fData[1]) == block.fData[1]; 343} 344 345 346unicode_block 347unicode_block::operator&(const unicode_block& block) const 348{ 349 unicode_block result; 350 result.fData[0] = fData[0] & block.fData[0]; 351 result.fData[1] = fData[1] & block.fData[1]; 352 353 return result; 354} 355 356 357unicode_block 358unicode_block::operator|(const unicode_block& block) const 359{ 360 unicode_block result; 361 result.fData[0] = fData[0] | block.fData[0]; 362 result.fData[1] = fData[1] | block.fData[1]; 363 364 return result; 365} 366 367 368unicode_block& 369unicode_block::operator=(const unicode_block& block) 370{ 371 fData[0] = block.fData[0]; 372 fData[1] = block.fData[1]; 373 return *this; 374} 375 376 377bool 378unicode_block::operator==(const unicode_block& block) const 379{ 380 return fData[0] == block.fData[0] && fData[1] == block.fData[1]; 381} 382 383 384bool 385unicode_block::operator!=(const unicode_block& block) const 386{ 387 return fData[0] != block.fData[0] || fData[1] != block.fData[1]; 388} 389 390 391#endif // _FONT_H_ 392