Advertisement
Guest User

textc - fbtext

a guest
Jul 11th, 2011
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.85 KB | None | 0 0
  1. #define FREETYPE_MAJOR  == 2
  2. #define FREETYPE_MINOR == 3
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <unistd.h>
  8. #include <linux/fb.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/mman.h>
  11. #include <sys/wait.h>
  12. #include <ft2build.h>
  13. #include FT_FREETYPE_H
  14. #include FT_CACHE_H
  15. #include FT_CACHE_SMALL_BITMAPS_H
  16.  
  17. // Schriftdatei setzen
  18. #define FONT "/usr/share/fonts/md_khmurabi_10.ttf"
  19.  
  20. enum {LEFT, CENTER, RIGHT};
  21. enum {VERY_SMALL, SMALL, BIG};
  22.  
  23. // Schriftgr�ssen festlegen
  24. #define FONTHEIGHT_VERY_SMALL 16
  25. #define FONTHEIGHT_SMALL      32
  26. #define FONTHEIGHT_BIG        40
  27.  
  28. // Libfreetype Zeugs
  29. FT_Error        error;
  30. FT_Library      library;
  31. FTC_Manager     manager;
  32. FTC_SBitCache       cache;
  33. FTC_SBit        sbit;
  34. #if FREETYPE_MAJOR  == 2 && FREETYPE_MINOR == 0
  35. FTC_Image_Desc      desc;
  36. #else
  37. FTC_ImageTypeRec    desc;
  38. #endif
  39. FT_Face         face;
  40. FT_UInt         prev_glyphindex;
  41. FT_Bool         use_kerning;
  42. FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface);
  43.  
  44. // Framebuffer Zeugs
  45. unsigned char *lfb;
  46. int StartX;
  47. int StartY;
  48. int fb;
  49. struct fb_fix_screeninfo fix_screeninfo;
  50. struct fb_var_screeninfo var_screeninfo;
  51.  
  52. // **************************************************************************************************************
  53. // Renderroutinen f�r Text und einfache Boxen
  54. // **************************************************************************************************************
  55.  
  56. // Freetype - MyFaceRequester
  57. FT_Error MyFaceRequester(FTC_FaceID face_id, FT_Library library, FT_Pointer request_data, FT_Face *aface)
  58. {
  59.     FT_Error result;
  60.  
  61.     result = FT_New_Face(library, face_id, 0, aface);
  62.  
  63.     if(!result) printf("Freetype <Schrift \"%s\" geladen>\n", (char*)face_id);
  64.     else        printf("Freetype <Schrift \"%s\" fehlgeschlagen>\n", (char*)face_id);
  65.  
  66.     return result;
  67. }
  68.  
  69. // Freetype - RenderChar
  70. int RenderChar(FT_ULong currentchar, int sx, int sy, int ex, unsigned char *color)
  71. {
  72.     if (currentchar == 32) return;
  73.  
  74.     int row, pitch, bit, x = 0, y = 0;
  75.     FT_UInt glyphindex;
  76.     FT_Vector kerning;
  77.     FT_Error error;
  78.     int tmpcolor;
  79.  
  80.     if(!(glyphindex = FT_Get_Char_Index(face, currentchar)))
  81.     {
  82.         printf("Freetype <FT_Get_Char_Index> fuer Zeichen %x \"%c\" fehlgeschlagen\n", (int)currentchar,(int)currentchar);
  83.         return 0;
  84.     }
  85.  
  86. #if FREETYPE_MAJOR == 2 && FREETYPE_MINOR == 0
  87.     if((error = FTC_SBit_Cache_Lookup(cache, &desc, glyphindex, &sbit)))
  88. #else
  89.     FTC_Node anode;
  90.     if((error = FTC_SBitCache_Lookup(cache, &desc, glyphindex, &sbit, &anode)))
  91. #endif
  92.     {
  93.         printf("Freetype <FTC_SBitCache_Lookup> fuer Zeichen %x \"%c\" fehlgeschlagen. Fehler: 0x%.2X>\n", (int)currentchar,(int)currentchar, error);
  94.         return 0;
  95.     }
  96.     if(use_kerning)
  97.     {
  98.         FT_Get_Kerning(face, prev_glyphindex, glyphindex, ft_kerning_default, &kerning);
  99.  
  100.         prev_glyphindex = glyphindex;
  101.         kerning.x >>= 6;
  102.     }
  103.     else
  104.         kerning.x = 0;
  105.  
  106.         if(sx + sbit->xadvance >= ex) return -1;
  107.         for(row = 0; row < sbit->height; row++)
  108.         {
  109.             for(pitch = 0; pitch < sbit->pitch; pitch++)
  110.             {
  111.                 for(bit = 7; bit >= 0; bit--)
  112.                 {
  113.                     if(pitch*8 + 7-bit >= sbit->width) break; /* render needed bits only */
  114.                     if((sbit->buffer[row * sbit->pitch + pitch]) & 1<<bit) {
  115.                     memcpy(lfb + StartX*4 + sx*4 + (sbit->left + kerning.x + x)*4 + fix_screeninfo.line_length*(StartY + sy - sbit->top + y), color, 4);
  116.                     }
  117.                     x++;
  118.                 }
  119.             }
  120.             x = 0;
  121.             y++;
  122.         }
  123.  
  124.         return sbit->xadvance + kerning.x;
  125. }
  126.  
  127. // Freetype - Stringlaenge
  128. int GetStringLen(const char *string, int size)
  129. {
  130.     int stringlen = 0;
  131.  
  132.     switch (size)
  133.     {
  134.         case VERY_SMALL: desc.width = desc.height = FONTHEIGHT_VERY_SMALL; break;
  135.         case SMALL     : desc.width = desc.height = FONTHEIGHT_SMALL     ; break;
  136.         case BIG       : desc.width = desc.height = FONTHEIGHT_BIG       ; break;
  137.     }
  138.     prev_glyphindex = 0;
  139.     while(*string != '\0')
  140.     {
  141.         stringlen += RenderChar(*string, -1, -1, -1, "");
  142.         string++;
  143.     }
  144.  
  145.     return stringlen;
  146. }
  147.  
  148. // Freetype - Render String
  149. void RenderString(const char *string, int sx, int sy, int maxwidth, int layout, int size, unsigned char *color)
  150. {
  151.     int stringlen, ex, charwidth;
  152.     switch (size)
  153.     {
  154.         case VERY_SMALL: desc.width = desc.height = FONTHEIGHT_VERY_SMALL; break;
  155.         case SMALL     : desc.width = desc.height = FONTHEIGHT_SMALL     ; break;
  156.         case BIG       : desc.width = desc.height = FONTHEIGHT_BIG       ; break;
  157.     }
  158.     if(layout != LEFT)
  159.     {
  160.         stringlen = GetStringLen(string, size);
  161.         switch(layout)
  162.         {
  163.             case CENTER:    if(stringlen < maxwidth) sx += (maxwidth - stringlen)/2;
  164.                     break;
  165.             case RIGHT: if(stringlen < maxwidth) sx += maxwidth - stringlen;
  166.         }
  167.     }
  168.     prev_glyphindex = 0;
  169.     ex = sx + maxwidth;
  170.     while(*string != '\0' && *string != '\n')
  171.     {
  172.         if((charwidth = RenderChar(*string, sx, sy, ex, color)) == -1) return; /* string > maxwidth */
  173.         sx += charwidth;
  174.         string++;
  175.     }
  176. }
  177.  
  178. // Render Box
  179. void RenderBox(int sx, int sy, int ex, int ey, unsigned char *color)
  180. {
  181.  
  182.     int loop;
  183.     int tx;
  184.  
  185.         for(; sy <= ey; sy++)
  186.         {
  187.             for(tx=0; tx <= (ex-sx); tx++) 
  188.             {
  189.             memcpy(lfb + StartX*4 + sx*4 + (tx*4) + fix_screeninfo.line_length*(StartY + sy),color,4);
  190.             }
  191.         }
  192.  
  193. }
  194.  
  195.  
  196. // **************************************************************************************************************
  197. // Hauptroutine
  198. // **************************************************************************************************************
  199.  
  200. main(argc,argv)
  201. int argc;
  202. char *argv[];
  203. {
  204.     // Setze Offsets (Startpunkt links oben), der Framebuffer hat 720x576pixel,
  205.     // danke Overscan der TV Ger�te meist nur ca. 640x480 nutzbar
  206.     StartX=60;
  207.     StartY=60;
  208.  
  209.     // Framebuffer oeffnen
  210.     fb=open("/dev/fb/0", O_RDWR);
  211.     if (fb == -1)
  212.     {
  213.         printf("Framebuffer failed\n");
  214.         return;
  215.     }
  216.  
  217.     // Framebuffer initialisieren und Infos auslesen
  218.     if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
  219.     {
  220.         printf("Framebuffer: <FBIOGET_FSCREENINFO fehlgeschlagen>\n");
  221.         return;
  222.     }
  223.  
  224.     if(ioctl(fb, FBIOGET_VSCREENINFO, &var_screeninfo) == -1)
  225.     {
  226.         printf("Framebuffer: <FBIOGET_VSCREENINFO fehlgeschlagen>\n");
  227.         return;
  228.     }
  229.  
  230.     // Framebuffermodus auf 720x576 und 32 Bit initialisieren
  231.     var_screeninfo.yres=var_screeninfo.yres_virtual=576;
  232.     var_screeninfo.xres=var_screeninfo.xres_virtual=720;
  233.     var_screeninfo.bits_per_pixel=32;
  234.     if(ioctl(fb, FBIOPUT_VSCREENINFO, &var_screeninfo) == -1)
  235.     {
  236.         printf("Framebuffer: <FBIOPUT_VSCREENINFO fehlgeschlagen>\n");
  237.         return;
  238.     }
  239.  
  240.     if(ioctl(fb, FBIOGET_FSCREENINFO, &fix_screeninfo) == -1)
  241.     {
  242.         printf("Framebuffer: <FBIOGET_FSCREENINFO fehlgeschlagen>\n");
  243.         return;
  244.     }
  245.  
  246.     // Framebuffer in Speicher mappen
  247.     if(!(lfb = (unsigned char*)mmap(0, fix_screeninfo.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0)))
  248.     {
  249.         printf("Framebuffer: <Speichermapping fehlgeschlagen>\n");
  250.         return;
  251.     }
  252.  
  253.     // Freetype initialisieren
  254.     if((error = FT_Init_FreeType(&library)))
  255.     {
  256.         printf("Freetype <FT_Init_FreeType fehlgeschlagen. Fehler: 0x%.2X>", error);
  257.         munmap(lfb, fix_screeninfo.smem_len);
  258.         return;
  259.     }
  260.  
  261.     if((error = FTC_Manager_New(library, 1, 2, 0, &MyFaceRequester, NULL, &manager)))
  262.     {
  263.         printf("Freetype <FTC_Manager_New fehlgeschlagen. Fehler: 0x%.2X>\n", error);
  264.         FT_Done_FreeType(library);
  265.         munmap(lfb, fix_screeninfo.smem_len);
  266.         return;
  267.     }
  268.  
  269.     if((error = FTC_SBitCache_New(manager, &cache)))
  270.     {
  271.         printf("Freetype <FTC_SBitCache_New fehlgeschlagen. Fehler: 0x%.2X>\n", error);
  272.         FTC_Manager_Done(manager);
  273.         FT_Done_FreeType(library);
  274.         munmap(lfb, fix_screeninfo.smem_len);
  275.         return;
  276.     }
  277.  
  278.     if((error = FTC_Manager_Lookup_Face(manager, FONT, &face)))
  279.     {
  280.         printf("Freetype <FTC_Manager_Lookup_Face fehlgeschlagen. Fehler: 0x%.2X>\n", error);
  281.         FTC_Manager_Done(manager);
  282.         FT_Done_FreeType(library);
  283.         munmap(lfb, fix_screeninfo.smem_len);
  284.         return;
  285.     }
  286.     else
  287.         desc.face_id = FONT;
  288.  
  289.  
  290.     use_kerning = FT_HAS_KERNING(face);
  291.  
  292. #if FREETYPE_MAJOR  == 2 && FREETYPE_MINOR == 0
  293.     desc.image_type = ftc_image_mono;
  294. #else
  295.     desc.flags = FT_LOAD_MONOCHROME;
  296. #endif
  297.  
  298.     // Screen leeren, der komplette Speicherbereich wird mit 0 beschrieben, was beim 32Bit
  299.     // Framebuffer der 7025 der Farbe schwarz mit 100% transparent entspricht, sprich man
  300.     // sieht das dahinter liegende Bild des MPEG Decoders
  301.     memset(lfb, 0, var_screeninfo.yres*fix_screeninfo.line_length);
  302.  
  303.     // Hier zeichnen wir eine schwarze Box in den Framebuffer, die StartX/StartY Werte werden
  304.     // dabei ber�cksichtigt.
  305.     // F�r die Farbe wird ein 32 Bit Wert �bergeben, dass dem Format BGRA entspricht, sprich
  306.     // das erste Byte ist der Blauwert, das 2. Gr�n und das 3. Rot. Der vierte Wert bestimmt den
  307.     // Alphawert, wobei bei der 7025 xFF (255) f�r nicht transparent und x00 (0) f�r 100% Transparenz
  308.     // steht.
  309.     //        x,y,x1 ,y1 ,farbe
  310.     RenderBox(0,0,600,456,"\x00\x00\x00\xFF");
  311.    
  312.     // Nun geben wir einen Text an der Position x=20,y=20 (StartX/StartY kommt automatisch hinzu)
  313.     // und sagen dass der String nicht breiter sein darf als 400 Pixel. Ben�tigt der Text mehr Platz,
  314.     // wird er abgeschnitten.
  315.     // F�r die Ausrichtung gibt es LEFT, RIGHT und CENTER und bestimmt die Ausrichtung des Textes
  316.     // innerhalb der angegebenen Breite (hier 400 Pixel). F�r die Schriftgr�sse stehen VERY_SMALL, SMALL
  317.     // und BIG zur Verf�gung. Die (Pixel)Gr�ssen daf�r wurden weiter oben definiert. Die Farbangabe
  318.     // entspricht der Farbangabe der RenderBox Funktion (siehe oben).
  319.     //           text    ,x  ,y  ,breite, ausrichtung, gr�sse, farbe
  320.     RenderString("Hallo !", 20, 20,   400,        LEFT,    BIG, "\xFF\xFF\xFF\xFF");
  321.  
  322.     // Warte 10 Sekunden
  323.     sleep(10);
  324.  
  325.  
  326.     // Programmende
  327.    
  328.     // Libfreetype aufr�umen
  329.     FTC_Manager_Done(manager);
  330.     FT_Done_FreeType(library);
  331.  
  332.     // Framebuffer wieder leeren (Transparent machen), Speicher freigeben,
  333.     // Framebufefr Device schliessen
  334.     memset(lfb, 0, var_screeninfo.yres*fix_screeninfo.line_length);
  335.     munmap(lfb, fix_screeninfo.smem_len);
  336.     close(fb);
  337.     exit(0);
  338. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement