updated README
[k8sterm.git] / src / x11drawutfstr.c
blobbf53006aa58920496a78b240d77b732ec66bbef4
1 #define XUDISBUF_SIZE (1024u)
2 static XChar2b xDrawUtf8ImageStringBuf[XUDISBUF_SIZE];
4 static void xDrawUtf8ImageString (int x, int y, int fontset, Drawable dwb, const char *str, int bytelen) {
5 if (bytelen < 0) {
6 if (!str) return;
7 bytelen = (int)strlen(str);
9 if (!bytelen) return;
11 //y += dc.font[fontset].ascent;
13 #ifdef X11_USE_FUCKED_FONTSETS
14 XFontSet xfontset = dc.font[fontset].set;
15 Xutf8DrawImageString(xw.dpy, xw.pictab, xfontset, dc.gc, x, y, str, bytelen);
16 #else
17 uint32_t utfcp = 0;
18 uint32_t bpos = 0;
19 XChar2b *c2bptr = xDrawUtf8ImageStringBuf;
20 while (bytelen--) {
21 utfcp = sxed_utf8d_consume(utfcp, *str++);
22 if (sxed_utf8_valid_cp(utfcp)) {
23 if (!sxed_utf8_printable_cp(utfcp)) utfcp = SXED_UTF8_REPLACEMENT_CP;
24 c2bptr->byte1 = (uint8_t)(utfcp>>8);
25 c2bptr->byte2 = (uint8_t)utfcp;
26 ++c2bptr;
27 if (++bpos == XUDISBUF_SIZE) {
28 c2bptr = xDrawUtf8ImageStringBuf;
29 if (dc.gcfid != dc.font[fontset].fid) {
30 XSetFont(xw.dpy, dc.gc, dc.font[fontset].fid);
31 dc.gcfid = dc.font[fontset].fid;
33 XDrawImageString16(xw.dpy, dwb, dc.gc, x, y, c2bptr, bpos);
34 x += (int)bpos*dc.font[fontset].width;
35 bpos = 0;
39 if (bpos) {
40 c2bptr = xDrawUtf8ImageStringBuf;
41 if (dc.gcfid != dc.font[fontset].fid) {
42 XSetFont(xw.dpy, dc.gc, dc.font[fontset].fid);
43 dc.gcfid = dc.font[fontset].fid;
45 XDrawImageString16(xw.dpy, dwb, dc.gc, x, y, c2bptr, bpos);
47 #endif
51 static int xUtf8StringWidth (int fontset, const char *str, int bytelen) {
52 if (bytelen < 0) {
53 if (!str) return 0;
54 bytelen = (int)strlen(str);
56 if (!bytelen) return 0;
58 #ifdef X11_USE_FUCKED_FONTSETS
59 XFontSet xfontset = dc.font[fontset].set;
60 XRectangle r;
61 memset(&r, 0, sizeof(r));
62 Xutf8TextExtents(xfontset, str, bytelen, &r, NULL);
63 return r.width-r.x;
64 #else
65 int wdt = 0;
66 uint32_t utfcp = 0;
67 uint32_t bpos = 0;
68 XChar2b *c2bptr = xDrawUtf8ImageStringBuf;
69 while (bytelen--) {
70 utfcp = sxed_utf8d_consume(utfcp, *str++);
71 if (sxed_utf8_valid_cp(utfcp)) {
72 if (!sxed_utf8_printable_cp(utfcp)) utfcp = SXED_UTF8_REPLACEMENT_CP;
73 c2bptr->byte1 = (uint8_t)(utfcp>>8);
74 c2bptr->byte2 = (uint8_t)utfcp;
75 ++c2bptr;
76 if (++bpos == XUDISBUF_SIZE) {
77 c2bptr = xDrawUtf8ImageStringBuf;
78 wdt += XTextWidth16(dc.font[fontset].set, c2bptr, bpos);
79 bpos = 0;
83 if (bpos) {
84 c2bptr = xDrawUtf8ImageStringBuf;
85 wdt += XTextWidth16(dc.font[fontset].set, c2bptr, bpos);
87 return wdt;
88 #endif