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

How do find out the width and height of the text without using surface in SDL2?

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

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 对齐,为此我需要知道包含文本的表面的高度和宽度,以便我可以使用 (WINDOW_WIDTH - surfaceText->w) / 2(WINDOW_HEIGHT - surfaceText->h) / 2。但是,如果不创建表面,就无法知道包含文本的表面的高度和宽度。如果我最终需要创建表面,那么这个函数的分离将达不到它的 objective.

How do I find out the height and width of the surface containing the text without actually creating the surface in SDL2_ttf library?

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

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

此函数的 documentation 声明:

Calculate the resulting surface size of the LATIN1 encoded text rendered using font. No actual rendering is done, however correct kerning is done to get the actual width. The height returned in h is the same as you can get using 3.3.10 TTF_FontHeight.

然后,一旦您获得了字符串的维度,您就可以使用必要的信息调用渲染函数来对齐它。

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