URI: 
       main.c - ltkx - GUI toolkit for X11 (old)
  HTML git clone git://lumidify.org/ltkx.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/ltkx.git (encrypted, but very slow)
  HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltkx.git (over tor)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       main.c (5809B)
       ---
            1 /* By Justin Meiners (2013) */
            2 /* font and image utilties from nothings.org */
            3 
            4 #include <stdio.h>
            5 #include <stdlib.h>
            6 #include <stdint.h>
            7 #include <X11/Xlib.h>
            8 #include <X11/Xutil.h>
            9 #include <X11/Xos.h>
           10 
           11 /* is c the start of a utf8 sequence? */
           12 #define isutf(c) (((c)&0xC0)!=0x80)
           13 
           14 static const uint32_t offsetsFromUTF8[6] = {
           15     0x00000000UL, 0x00003080UL, 0x000E2080UL,
           16     0x03C82080UL, 0xFA082080UL, 0x82082080UL
           17 };
           18 
           19 /* next character without NUL character terminator */
           20 uint32_t u8_nextmemchar(const char *s, size_t *i)
           21 {
           22     uint32_t ch = 0;
           23     size_t sz = 0;
           24     do {
           25         ch <<= 6;
           26         ch += (unsigned char)s[(*i)++];
           27         sz++;
           28     } while (!isutf(s[*i]));
           29     ch -= offsetsFromUTF8[sz-1];
           30 
           31     return ch;
           32 }
           33 
           34 void u8_dec(const char *s, size_t *i)
           35 {
           36     (void)(isutf(s[--(*i)]) || isutf(s[--(*i)]) || isutf(s[--(*i)]) || --(*i));
           37 }
           38 
           39 #define STB_TRUETYPE_IMPLEMENTATION 
           40 #include "stb_truetype.h" /* http://nothings.org/stb/stb_truetype.h */
           41 
           42 Pixmap ltk_draw_text(const unsigned char *text, int line_height, XColor color, XColor background)
           43 {
           44     /* Get width of text */
           45     int w;
           46 }
           47 
           48 int main(int argc, const char * argv[])
           49 {
           50 
           51     Display *display;
           52     int screen;
           53     Window window;
           54     GC gc;
           55 
           56     unsigned long black, white;
           57     Colormap colormap;
           58     display = XOpenDisplay((char *)0);
           59     screen = DefaultScreen(display);
           60     colormap = DefaultColormap(display, screen);
           61     black = BlackPixel(display, screen);
           62     white = WhitePixel(display, screen);
           63     window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, 1366, 512, 0, black, white);
           64     XSetStandardProperties(display, window, "Random Window", NULL, None, NULL, 0, NULL);
           65     XSelectInput(display, window, ExposureMask|ButtonPressMask|KeyPressMask);
           66     gc = XCreateGC(display, window, 0, 0);
           67     XSetBackground(display, gc, black);
           68     XSetForeground(display, gc, black);
           69     XClearWindow(display, window);
           70     XMapRaised(display, window);
           71 
           72     /* load font file */
           73         FILE *f;
           74         long len;
           75         char *file_contents;
           76         f = fopen("font1.ttf", "rb");
           77         fseek(f, 0, SEEK_END);
           78         len = ftell(f);
           79         fseek(f, 0, SEEK_SET);
           80         file_contents = malloc(len + 1);
           81                                         fread(file_contents, 1, len, f);
           82                                             file_contents[len] = '\0';
           83                                                 fclose(f);
           84         unsigned char *fontBuffer = file_contents;
           85     
           86     /* prepare font */
           87     stbtt_fontinfo info;
           88     if (!stbtt_InitFont(&info, fontBuffer, 0))
           89     {
           90         printf("failed\n");
           91     }
           92     
           93     int b_w = 1366; /* bitmap width */
           94     int b_h = 100; /* bitmap height */
           95     int l_h = 100; /* line height */
           96 
           97     /* create a bitmap for the phrase */
           98     unsigned char *bitmap = malloc(b_w * b_h);
           99     
          100     /* calculate font scaling */
          101     float scale = stbtt_ScaleForPixelHeight(&info, l_h);
          102 
          103     //uint8_t *word = "ہمارے بارے میں";
          104     //char *word = "Hello";
          105     uint8_t *word = "sfsdf";
          106     
          107     int x = 0;
          108     
          109     int ascent, descent, lineGap;
          110     stbtt_GetFontVMetrics(&info, &ascent, &descent, &lineGap);
          111     
          112     ascent *= scale;
          113     descent *= scale;
          114 
          115     Pixmap pix = XCreatePixmap(display, window, b_w, l_h, 24);
          116     XColor green;
          117     XParseColor(display, colormap, "#00FFFF", &green);
          118     XAllocColor(display, colormap, &green);
          119     XColor green1;
          120     XParseColor(display, colormap, "#FF0000", &green1);
          121     XAllocColor(display, colormap, &green1);
          122     
          123     size_t i = 0;
          124     int length = strlen(word);
          125     uint32_t target;
          126     uint32_t target1;
          127     unsigned char *bob;
          128     int x1, y1, xoff, yoff;
          129     while (i < length)
          130     {
          131         target = u8_nextmemchar(word, &i);
          132         if (!target) break;
          133         /* get bounding box for character (may be offset to account for chars that dip above or below the line */
          134         int c_x1, c_y1, c_x2, c_y2;
          135         stbtt_GetCodepointBitmapBox(&info, target, scale, scale, &c_x1, &c_y1, &c_x2, &c_y2);
          136         
          137         /* compute y (different characters have different heights */
          138         int y = ascent + c_y1;
          139         
          140         /* render character (stride and offset is important here) */
          141         int byteOffset = x + (y  * b_w);
          142         bob = stbtt_GetCodepointBitmap(&info, scale, scale, target, &x1, &y1, &xoff, &yoff);
          143 //        stbtt_MakeCodepointBitmap(&info, bitmap + byteOffset, c_x2 - c_x1, c_y2 - c_y1, b_w, scale, scale, target);
          144         
          145             for (int i = 0; i < y1; i++)
          146             {
          147                 for (int j = 0; j < x1; j++)
          148                 {
          149                         XSetForeground(display, gc, (bob[i * x1 + j] / 255.0) * black + ((255 - bob[i * x1 + j]) / 255.0) * white);
          150                         XDrawPoint(display, pix, gc, x + j, i);
          151                 }
          152             }
          153         
          154         /* how wide is this character */
          155         int ax;
          156         stbtt_GetCodepointHMetrics(&info, target, &ax, 0);
          157         x += ax * scale;
          158 
          159         /* add kerning */
          160         target1 = u8_nextmemchar(word, &i);
          161         if (!target1) break;
          162         u8_dec(word, &i);
          163         int kern;
          164         kern = stbtt_GetCodepointKernAdvance(&info, target, target1);
          165         x += kern * scale;
          166     }
          167     /* save out a 1 channel image */
          168     /*stbi_write_png("out.png", b_w, b_h, 1, bitmap, b_w);*/
          169     XSetForeground(display, gc, white);
          170     /*
          171     Pixmap pix = XCreatePixmapFromBitmapData(display, window, bitmap, b_w, b_h, white, black, 24);
          172     */
          173     XCopyArea(display, pix, window, gc, 0, 0, b_w, b_h, 0, 0);
          174 
          175     XEvent event;
          176     KeySym key;
          177     char text[255];
          178 
          179     while(1)
          180     {
          181         XNextEvent(display, &event);
          182         if (event.type == KeyPress && XLookupString(&event.xkey, text, 255, &key, 0) == 1)
          183         {
          184             XCopyArea(display, pix, window, gc, 0, 0, b_w, b_h, 0, 0);
          185             if (text[0] == 'q')
          186             {
          187                 XFreeGC(display, gc);
          188                 XFreeColormap(display, colormap);
          189                 XDestroyWindow(display, window);
          190                 XCloseDisplay(display);
          191                 exit(0);
          192             }
          193         }
          194     }
          195     
          196     free(fontBuffer);
          197     free(bitmap);
          198     
          199     return 0;
          200 }