char* getFontXLFDName(TTF_Font* font) { /* FOUNDRY - FAMILY_NAME - WEIGHT_NAME - SLANT - SETWIDTH_NAME - ADD_STYLE - PIXEL_SIZE - POINT_SIZE - RESOLUTION_X - RESOLUTION_Y - SPACING - AVERAGE_WIDTH - CHARSET_REGISTRY - CHARSET_ENCODING */ int fontStyle = TTF_GetFontStyle(font); static char* emptyValue = ""; char* foundry = emptyValue; char* familyName = TTF_FontFaceFamilyName(font); if (familyName == NULL) familyName = emptyValue; char* weightName = fontStyle & TTF_STYLE_BOLD ? "bold" : "medium"; char slant = (char) (fontStyle & TTF_STYLE_ITALIC ? 'i' : 'r'); char* setWidth = "normal"; int pointSize = 0; char spacing = (char) (TTF_FontFaceIsFixedWidth(font) ? 'm' : 'p'); short averageWidth = 0; char* charset = "iso10646"; // Unicode int charsetEncoding = 1; size_t nameLength = 14 + strlen(foundry) + strlen(familyName) + strlen(weightName) + 1 + strlen(setWidth) + 1 + 6 + 1 + 1 + 1 + 5 + strlen(charset) + 1; char* name = malloc(sizeof(char) * nameLength); if (name != NULL) { // TODO: Should this not be "-%s-%s-%s-%c-%s--0-%d-0-0-%c-%hd-%s-%d"? Tk does not want the extra dash. snprintf(name, nameLength, "-%s-%s-%s-%c-%s-0-%d-0-0-%c-%hd-%s-%d", foundry, familyName, weightName, slant, setWidth, pointSize, spacing, averageWidth, charset, charsetEncoding); } LOG("Font name = '%s'\n", name); return name; }
void load_font(char *fname, int size) { char *p; free_font(); font=TTF_OpenFont(fname, size); if(!font) { printf("TTF_OpenFont: %s\n", TTF_GetError()); exit(3); } /* print some metrics and attributes */ printf("size : %d\n",size); printf("TTF_FontHeight : %d\n",TTF_FontHeight(font)); printf("TTF_FontAscent : %d\n",TTF_FontAscent(font)); printf("TTF_FontDescent : %d\n",TTF_FontDescent(font)); printf("TTF_FontLineSkip : %d\n",TTF_FontLineSkip(font)); printf("TTF_FontFaceIsFixedWidth: %d\n",TTF_FontFaceIsFixedWidth(font)); { char *str=TTF_FontFaceFamilyName(font); if(!str) str="(null)"; printf("TTF_FontFaceFamilyName : \"%s\"\n",str); } { char *str=TTF_FontFaceStyleName(font); if(!str) str="(null)"; printf("TTF_FontFaceStyleName : \"%s\"\n",str); } if(TTF_GlyphIsProvided(font,'g')) { int minx, maxx, miny, maxy, advance; TTF_GlyphMetrics(font,'g', &minx, &maxx, &miny, &maxy, &advance); printf("TTF_GlyphMetrics('g'):\n\tminx=%d\n\tmaxx=%d\n\tminy=%d\n\tmaxy=%d\n\tadvance=%d\n", minx, maxx, miny, maxy, advance); } else printf("TTF_GlyphMetrics('g'): unavailable in font!\n"); /* set window title and icon name, using filename and stuff */ p=strrchr(fname,'/'); if(!p) p=strrchr(fname,'\\'); if(!p) p=strrchr(fname,':'); if(!p) p=fname; else p++; /* cache new glyphs */ cache_glyphs(); }
JNIEXPORT jint JNICALL Java_sdljava_x_swig_SWIG_1SDLTTFJNI_TTF_1FontFaceIsFixedWidth(JNIEnv *jenv, jclass jcls, jlong jarg1) { jint jresult = 0 ; TTF_Font *arg1 = (TTF_Font *) 0 ; int result; (void)jenv; (void)jcls; arg1 = *(TTF_Font **)&jarg1; result = (int)TTF_FontFaceIsFixedWidth(arg1); jresult = (jint)result; return jresult; }
bool Fonte::carregarTrueType(const string& arquivo, int tamanho, int estilo, Uint16 primeiro_glifo, Uint16 ultimo_glifo, EnumQualidadeEscala qualidade_escala) { if (!uniEstaInicializada()) { gDebug.erro("Sem uniInicializar() antes de tentar carregar: '" + arquivo + "'."); return false; } if (estaCarregada()) { gDebug.erro("Arquivo '" + arquivo + "' nao pode ser carregado, pois Fonte ja carregou o arquivo " + tex.getCaminhoDoArquivo() + "."); return false; } TTF_Font* ttf_font = TTF_OpenFont(arquivo.c_str(), tamanho); if (!ttf_font) { gDebug.erro("Erro ao carregar arquivo: '" + arquivo + "' - " + SDL_GetError() + "."); return false; } TTF_SetFontStyle(ttf_font, estilo); if (!criarTexturaTrueType(ttf_font, tamanho, primeiro_glifo, ultimo_glifo, qualidade_escala)) { glifos.clear(); gDebug.erro("Erro ao criar textura para fonte ttf, usando arquivo: '" + arquivo + "' - " + SDL_GetError() + "."); return false; } glifoNulo.quad.x = 0; glifoNulo.quad.y = 0; glifoNulo.quad.larg = 0; glifoNulo.quad.alt = 0; glifoNulo.alturaAcimaDaBase = 0; glifoNulo.avanco = tamanho; glifoNulo.caractere = 0; this->estilo = estilo; monoespacada = TTF_FontFaceIsFixedWidth(ttf_font) > 0; larguraGlifos = tamanho; alturaGlifos = TTF_FontHeight(ttf_font); ttf = true; return true; }
KFontProperties::KFontProperties(const TTF_Font *_Font, const KFile *file, int ptSize) : fontPath(file->getAbsolutePath().c_str()), familyName(TTF_FontFaceFamilyName(_Font)), styleName(TTF_FontFaceStyleName(_Font)), ttf_Style(TTF_GetFontStyle(_Font)), height(TTF_FontHeight(_Font)), ascent(TTF_FontAscent(_Font)), descent(TTF_FontDescent(_Font)), lineSkip(TTF_FontLineSkip(_Font)), faces(TTF_FontFaces(_Font)), monospace(TTF_FontFaceIsFixedWidth(_Font)), firstGlyph(getFirstGlyph(_Font)), lastGlyph(getLastGlyph(_Font)), totalGlyphs(getTotalGlyphs(_Font)), glyphRanges(getRanges(_Font)), pointSize(ptSize) { }
XFontStruct* XLoadQueryFont(Display* display, _Xconst char* name) { // https://tronche.com/gui/x/xlib/graphics/font-metrics/XLoadQueryFont.html Font fontId = XLoadFont(display, name); if (fontId == None) { return NULL; } TTF_Font* font = GET_FONT(fontId); SET_X_SERVER_REQUEST(display, X_QueryFont); XFontStruct* fontStruct = malloc(sizeof(XFontStruct)); if (fontStruct == NULL) { handleOutOfMemory(0, display, 0, 0); TTF_CloseFont(font); return NULL; } fontStruct->fid = fontId; fontStruct->ascent = TTF_FontAscent(font); fontStruct->descent = abs(TTF_FontDescent(font)); fontStruct->per_char = NULL; unsigned int numChars = 0; unsigned int i; for (i = 0; i < 65536 /* 2^16 */; i++) { if (TTF_GlyphIsProvided(font, (Uint16) i)) { if (numChars == 0) { fontStruct->min_char_or_byte2 = i; } fontStruct->max_char_or_byte2 = i; numChars++; } } // if (numChars >= 256) { // fontStruct->min_byte1 = fontStruct->min_char_or_byte2 / 256; // fontStruct->max_byte1 = fontStruct->max_char_or_byte2 / 256; // fontStruct->min_char_or_byte2 = 0; // } else { fontStruct->min_byte1 = 0; fontStruct->max_byte1 = 0; // } // TODO: This is debugging fontStruct->max_char_or_byte2 = 255; // Build per_char int monospace = TTF_FontFaceIsFixedWidth(font); XCharStruct charStruct; if (!monospace) { fontStruct->per_char = malloc(sizeof(XCharStruct) * numChars); if (fontStruct->per_char == NULL) { handleOutOfMemory(0, display, 0, 0); XFreeFont(display, fontStruct); return NULL; } charStruct = fontStruct->per_char[0]; } if (fillXCharStruct(font, fontStruct->min_char_or_byte2, &charStruct) == False) { XFreeFont(display, fontStruct); return NULL; } fontStruct->max_bounds = charStruct; fontStruct->min_bounds = charStruct; if (monospace) { fontStruct->per_char = NULL; } else { int counter = 1; for (i = fontStruct->min_char_or_byte2 + 1; i < 65536 /* 2^16 */; ++i) { if (TTF_GlyphIsProvided(font, (Uint16) i)) { charStruct = fontStruct->per_char[counter]; if (fillXCharStruct(font, i, &charStruct) == False) { XFreeFont(display, fontStruct); return NULL; } // I think rbearing (aka. advance) is the value that matters here if (fontStruct->max_bounds.rbearing < charStruct.rbearing) { fontStruct->max_bounds = charStruct; } else if (fontStruct->min_bounds.rbearing > charStruct.rbearing) { fontStruct->max_bounds = charStruct; } counter++; } } } return fontStruct; }
int LOBJECT_METHOD(getFontFixedWidth, TTF_Font * font){ int result = TTF_FontFaceIsFixedWidth(font); state.push_boolean(result > 0); return 1; }
//TTF FontFaceIsFixedWidth() boolType SDLFont::isMonospace() { int isMonospace = TTF_FontFaceIsFixedWidth(this->fontContext); return (isMonospace > 0) ? true : false; }
static mrb_value mrb_sdl2_ttf_font_face_fixed_width(mrb_state *mrb, mrb_value self) { return (TTF_FontFaceIsFixedWidth(mrb_sdl2_font_get_ptr(mrb, self)) == 0) ? mrb_false_value() : mrb_true_value(); }