为什么 pango_layout_get_pixel_size 在 C 中的 Ubuntu Linux 上略有错误

Why is pango_layout_get_pixel_size slightly wrong on Ubuntu Linux in C

我在尝试在 Gtk 应用程序 运行 Ubuntu Linux 上使用 C 中的 Pango 和 Cairo 库绘制文本时遇到了一个令人沮丧的问题。

我正在创建一个 Pango 布局,然后在给定位置绘制它,该位置由 pango_layout_get_pixel_size 报告的文本大小决定,但该函数返回的大小在两个宽度上都是错误的和身高,尤其是身高。这是我的完整代码:

// Create a cairo context with which to draw
// Note that we already have a GtkDrawingArea widget m_pGtkDrawingArea
cairo_t *cr = gdk_cairo_create(m_pGtkDrawingArea->window);

// Text to draw
std::string szText("NO DATA AVAILABLE");

// Create the layout
PangoLayout *pLayout = gtk_widget_create_pango_layout(m_pGtkDrawingArea, szText.c_str());

// Set layout properties
pango_layout_set_alignment(pLayout, PANGO_ALIGN_LEFT);
pango_layout_set_width(pLayout, -1);

// The family to use
std::string szFontFamily("FreeSans");

// The font size to use
double dFontSize = 36.0;

// Format the font description string
char szFontDescription[32];
memset(&(szFontDescription[0]), 0, sizeof(szFontDescription));
snprintf(szFontDescription, sizeof(szFontDescription) - 1, "%s %.1f", szFontFamily.c_str(), dFontSize);

// Get a new pango font description
PangoFontDescription *pFontDescription = pango_font_description_from_string(szFontDescription);

// Set up the pango font description
pango_font_description_set_weight(pFontDescription, PANGO_WEIGHT_NORMAL);
pango_font_description_set_style(pFontDescription, PANGO_STYLE_NORMAL);
pango_font_description_set_variant(pFontDescription, PANGO_VARIANT_NORMAL);
pango_font_description_set_stretch(pFontDescription, PANGO_STRETCH_NORMAL);

// Set this as the pango font description on the layout
pango_layout_set_font_description(pLayout, pFontDescription);

// Use auto direction
pango_layout_set_auto_dir(pLayout, TRUE);

// Get the pixel size of this text - this reports a size of 481x54 pixels
int iPixelWidth = 0, iPixelHeight = 0;
pango_layout_get_pixel_size(pLayout, &iPixelWidth, &iPixelHeight);

// Calculate the text location based on iPixelWidth and iPixelHeight
double dTextLocX = ...;
double dTextLocY = ...;

// Set up the cairo context for drawing the text
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
cairo_set_antialias(cr, CAIRO_ANTIALIAS_BEST);

// Move into place
cairo_move_to(cr, dTextLocX, dTextLocY);

// Draw the layout
pango_cairo_show_layout(cr, pLayout);

//
// pango_layout_get_pixel_size() reported a size of 481x54 pixels,
// but the actual size when drawn is 478x37 pixels!
//

//
// Clean up...
//

因此,如上述代码底部所述,pango_layout_get_pixel_size 函数报告大小为 481x54 像素,但屏幕上的文本大小实际上为 478x37 像素。

我在这里做错了什么?如何获得实际正确的像素大小?

在此先感谢您的帮助!

您显示的文本 ("NO DATA AVAILABLE") 全部大写,因此没有下行字母(部分低于基线的字母,如 j、p 和 q。)通常,当您测量文本框的范围,无论下部是否存在,您都为下部留出空间;否则,您会看到奇怪的伪像,例如不一致的行分隔,具体取决于给定行是否具有下行部。

Pango 提供的 API return 逻辑 范围(包括字体的全高)和 ink 范围(这是图像着墨部分的边界框)。我怀疑你在寻找墨水范围。