| 736 | |
| 737 | #define TEXT_CEIL(x) (((x) + 63) >> 6) |
| 738 | cc_result SysFont_Make(struct FontDesc* desc, const cc_string* fontName, int size, int flags) { |
| 739 | struct SysFont* font; |
| 740 | cc_string value, path, index; |
| 741 | int faceIndex, dpiX, dpiY; |
| 742 | FT_Open_Args args; |
| 743 | FT_Error err; |
| 744 | |
| 745 | desc->size = size; |
| 746 | desc->flags = flags; |
| 747 | desc->handle = NULL; |
| 748 | |
| 749 | value = Font_Lookup(fontName, flags); |
| 750 | if (!value.length) return ERR_INVALID_ARGUMENT; |
| 751 | String_UNSAFE_Separate(&value, ',', &path, &index); |
| 752 | Convert_ParseInt(&index, &faceIndex); |
| 753 | |
| 754 | font = (struct SysFont*)Mem_TryAlloc(1, sizeof(struct SysFont)); |
| 755 | if (!font) return ERR_OUT_OF_MEMORY; |
| 756 | |
| 757 | InitFreeTypeLibrary(); |
| 758 | if ((err = SysFont_Init(&path, font, &args))) { Mem_Free(font); return err; } |
| 759 | desc->handle = font; |
| 760 | |
| 761 | /* TODO: Use 72 instead of 96 dpi for mobile devices */ |
| 762 | dpiX = (int)(DisplayInfo.ScaleX * 96); |
| 763 | dpiY = (int)(DisplayInfo.ScaleY * 96); |
| 764 | |
| 765 | if ((err = FT_New_Face(ft_lib, &args, faceIndex, &font->face))) return err; |
| 766 | if ((err = FT_Set_Char_Size(font->face, size * 64, 0, dpiX, dpiY))) return err; |
| 767 | |
| 768 | /* height of any text when drawn with the given system font */ |
| 769 | desc->height = TEXT_CEIL(font->face->size->metrics.height); |
| 770 | return 0; |
| 771 | } |
| 772 | |
| 773 | void SysFont_MakeDefault(struct FontDesc* desc, int size, int flags) { |
| 774 | cc_string* font; |
no test coverage detected