如何在不使用SDL2中的表面的情况下找出文本的宽度和高度?

时间:2019-04-26 09:09:20

标签: sdl-2 sdl-ttf

我想创建一个单独的函数,我可以只发送一个字符串,它将适当地呈现文本,因此我不需要复制粘贴相同的东西。我想到的功能如下。

void renderText(SDL_Renderer* renderer, char* text,
                char* font_name, int font_size,
                SDL_Color color, SDL_Rect text_area)
{
    /* If TTF was not initialized initialize it */
    if (!TTF_WasInit()) {
        if (TTF_Init() < 0) {
            printf("Error initializing TTF: %s\n", SDL_GetError());
            return EXIT_FAILURE;
        }
    }

    TTF_Font* font = TTF_OpenFont(font_name, font_size);
    if (font == NULL) {
        printf("Error opening font: %s\n", SDL_GetError());
        return;
    }

    SDL_Surface* surface = TTF_RenderText_Blended(font, text, color);
    SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
    if (!texture) {
        printf("error creating texture: %s\n", SDL_GetError());
        TTF_CloseFont(font);
        return;
    }

    SDL_RenderCopy(renderer, message, NULL, &text_area);

    SDL_FreeSurface(surface);
    SDL_DestroyTexture(texture);
    TTF_CloseFont(font);

}

现在,有时我想将文本与需要知道包含文本的表面的高度和宽度的窗口对齐,以便可以使用(WINDOW_WIDTH - surfaceText->w) / 2(WINDOW_HEIGHT - surfaceText->h) / 2之类的东西。但是如果不创建表面,就无法知道包含文本的表面的高度和宽度。而且,如果最终我需要创建表面,则此功能的分离将无法实现其目标。

  

如何在不实际在SDL2_ttf库中创建表面的情况下找到包含文本的表面的高度和宽度?

1 个答案:

答案 0 :(得分:3)

您可以将字符串传递给定义的TTF_SizeText()函数:

int TTF_SizeText(TTF_Font *font, const char *text, int *w, int *h)

此功能的documentation状态:

  

计算使用字体呈现的LATIN1编码文本的最终表面尺寸。没有进行实际的渲染,但是进行了正确的字距调整以获取实际的宽度。在h中返回的高度与使用3.3.10 TTF_FontHeight获得的高度相同。

然后,一旦有了字符串的尺寸,就可以调用渲染函数并提供必要的信息以使其对齐。

还有TTF_SizeUTF8()TTF_SizeUNICODE()版本用于不同的编码。