16-Bit-Grenze für XDrawString Argumente
-
19-08-2019 - |
Frage
Von der XDrawString Manpage rel="nofollow es scheint, dass es 32-Bit unterzeichnet aceepts x und y-Koordinaten
int XDrawString(Display *display, Drawable d, GC gc, int x, int y, char *string, int length);
Beachten Sie, wie beide x und y int (dh: 32-Bit-Ganzzahl mit Vorzeichen auf gcc / Linux2.6-i386 mindestens)
Das Problem ist, wenn ich y = 32767
(2 ^ 15-1) übergeben. Die Saite gezogen wird, an der richtigen Stelle, aber etwas über diesem Wert wird die Zeichenfolge nicht gezogen
Ich vermute, dass intern 32 Bit-Integer nicht verwendet werden, sondern 16-Bit-Integer mit Vorzeichen für die Koordinaten.
Da die man-Seiten zu zeigen scheinen, dass die Funktion 32-Bit-Integer akzeptiert, gibt es einige Kompilierung-Option, die die Verwendung der längeren ganzen Zahlen gedreht werden muss, um zu ermöglichen? Oder ist das ein limmitation von Xlib?
Lösung
Das X11-Protokoll hat 16 Bits angeben.
Haben Sie einen Blick auf die Definition für xPolyTextReq
in <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;