16-разрядное ограничение на аргументы XDrawString
-
19-08-2019 - |
Вопрос
Из XDrawString справочная страница похоже, что он использует подписанные 32-битные координаты x и y
int XDrawString(Display *display, Drawable d, GC gc, int x, int y, char *string, int length);
Обратите внимание, что оба x и y являются int ( т. е.:32-разрядное целое число со знаком, по крайней мере, в gcc / linux2.6-i386 )
Проблема в том, что когда я прохожу y = 32767
(2^ 15 - 1) строка отображается в правильном месте, но все, что выше этого значения, строка не отображается.
Я подозреваю, что внутренне 32-битные целые числа не используются, а вместо этого используются 16-битные целые числа со знаком для координат.
Учитывая, что справочные страницы, похоже, указывают, что функция принимает 32-разрядные целые числа, есть ли какая-нибудь опция компиляции, которую необходимо включить, чтобы разрешить использование более длинных целых чисел?Или это ограничение Xlib?
Решение
Протокол X11 действительно определяет 16 бит.
Взгляните на определение для xPolyTextReq
в <X11/Xproto.h>
typedef struct {
CARD8 reqType;
CARD8 pad;
CARD16 length B16;
Drawable drawable B32;
GContext gc B32;
INT16 x B16, y B16; /* items (xTextElt) start after struct */
} xPolyTextReq;