zoukankan      html  css  js  c++  java
  • 文件浏览器及数码相框 -2.3.1freetype_pc

    例子

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    #include <ft2build.h>
    #include FT_FREETYPE_H
    
    
    #define WIDTH   80
    #define HEIGHT  80
    
    
    /* origin is the upper left corner */
    unsigned char image[HEIGHT][WIDTH];
    
    
    /* Replace this function with something useful. */
    
    void
    draw_bitmap( FT_Bitmap*  bitmap,
                 FT_Int      x,
                 FT_Int      y)
    {
      FT_Int  i, j, p, q;
      FT_Int  x_max = x + bitmap->width;
      FT_Int  y_max = y + bitmap->rows;
    
    
      for ( i = x, p = 0; i < x_max; i++, p++ )
      {
        for ( j = y, q = 0; j < y_max; j++, q++ )
        {
          if ( i < 0      || j < 0       ||
               i >= WIDTH || j >= HEIGHT )
            continue;
    
          image[j][i] |= bitmap->buffer[q * bitmap->width + p];
        }
      }
    }
    
    
    void
    show_image( void )
    {
      int  i, j;
    
    
      for ( i = 0; i < HEIGHT; i++ )
      {
        for ( j = 0; j < WIDTH; j++ )
          putchar( image[i][j] == 0 ? ' '
                                    : image[i][j] < 128 ? '+'
                                                        : '*' );
        putchar( '
    ' );
      }
    }
    
    
    int
    main( int     argc,
          char**  argv )
    {
      FT_Library    library;
      FT_Face       face;
    
      FT_GlyphSlot  slot;
      FT_Matrix     matrix;                 /* transformation matrix */
      FT_Vector     pen;                    /* untransformed origin  */
      FT_Error      error;
    
      char*         filename;
      char*         text;
    
      double        angle;
      int           target_height;
      int           n, num_chars;
    
    
      if ( argc != 3 )
      {
        fprintf ( stderr, "usage: %s font sample-text
    ", argv[0] );
        exit( 1 );
      }
    
      filename      = argv[1];                           /* first argument     */
      text          = argv[2];                           /* second argument    */
      num_chars     = strlen( text );
      angle         = ( 0.0 / 360 ) * 3.14159 * 2;      /* use 25 degrees     */
      target_height = HEIGHT;
    
      error = FT_Init_FreeType( &library );              /* initialize library */
      /* error handling omitted */
    
      error = FT_New_Face( library, argv[1], 0, &face ); /* create face object */
      /* error handling omitted */
    
    #if 0
      /* use 50pt at 100dpi */
      error = FT_Set_Char_Size( face, 50 * 64, 0,
                                100, 0 );                /* set character size */
    
        /* pixels = 50 /72 * 100 = 69 个像素点*/
    #else
        FT_Set_Pixel_Sizes(face, 24, 0);
    #endif
      /* error handling omitted */
    
      slot = face->glyph;
    
      /* set up matrix */
      matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );
      matrix.xy = (FT_Fixed)(-sin( angle ) * 0x10000L );
      matrix.yx = (FT_Fixed)( sin( angle ) * 0x10000L );
      matrix.yy = (FT_Fixed)( cos( angle ) * 0x10000L );
    
      /* the pen position in 26.6 cartesian space coordinates; */
      /* start at (0,40) relative to the upper left corner  */
      pen.x = 0 * 64;
      pen.y = ( target_height - 40 ) * 64;
    
      for ( n = 0; n < num_chars; n++ )
      {
        /* set transformation */
        FT_Set_Transform( face, &matrix, &pen );
    
        /* load glyph image into the slot (erase previous one) */
        error = FT_Load_Char( face, text[n], FT_LOAD_RENDER );
        if ( error )
          continue;                 /* ignore errors */
    
        /* now, draw to our target surface (convert position) */
        draw_bitmap( &slot->bitmap,
                     slot->bitmap_left,
                     target_height - slot->bitmap_top );
    
        /* increment pen position */
        pen.x += slot->advance.x;
        pen.y += slot->advance.y;
      }
    
      show_image();
    
      FT_Done_Face    ( face );
      FT_Done_FreeType( library );
    
      return 0;
    }

    1.编译free_type

    配置  ./configure

    编译   make

    安装 sudo make install

    gcc -o example1 example1.c

    error: freetype/config/ftheader.h: No such file or directory
    example1.c:12:10: error: #include expects "FILENAME" or <FILENAME>

    指定头文件目录编译

    gcc -o example1 example1.c  -I /usr/local/include/freetype2

    报错缺库

    example1.c:(.text+0x1ea): undefined reference to `FT_Init_FreeType'
    example1.c:(.text+0x216): undefined reference to `FT_New_Face'
    example1.c:(.text+0x236): undefined reference to `FT_Set_Pixel_Sizes'
    example1.c:(.text+0x24d): undefined reference to `cos'
    example1.c:(.text+0x285): undefined reference to `sin'
    example1.c:(.text+0x2bd): undefined reference to `sin'
    example1.c:(.text+0x2f5): undefined reference to `cos'
    example1.c:(.text+0x360): undefined reference to `FT_Set_Transform'
    example1.c:(.text+0x386): undefined reference to `FT_Load_Char'
    example1.c:(.text+0x409): undefined reference to `FT_Done_Face'
    example1.c:(.text+0x415): undefined reference to `FT_Done_FreeType'

    example1.c:(.text+0x24d): undefined reference to `cos'
    example1.c:(.text+0x285): undefined reference to `sin'
    example1.c:(.text+0x2bd): undefined reference to `sin'
    example1.c:(.text+0x2f5): undefined reference to `cos'

    指定库编译freetype    gcc -o example1 example1.c  -I /usr/local/include/freetype2 –lfreetype

    缺数学类定义

    example1.c:(.text+0x24d): undefined reference to `cos'
    example1.c:(.text+0x285): undefined reference to `sin'
    example1.c:(.text+0x2bd): undefined reference to `sin'
    example1.c:(.text+0x2f5): undefined reference to `cos'

    加-lm为加数学类库意思   gcc -o example1 example1.c  -I /usr/local/include/freetype2 -lfreetype  -lm

    执行exampe1  用宋体文件    显示abcfg 

    ./example1   ./simsun.ttc  abcfg

    abcfg_thumb2

    陈志朋uicode码为  48 96 D7 5F 67 0B

    int chinese_str[] = {0x9648,0x5fd7,0x670b};

    for ( n = 0; n < 4; n++ )
      {
        /* set transformation */
        FT_Set_Transform( face, &matrix, &pen );
    
        /* load glyph image into the slot (erase previous one) */
        error = FT_Load_Char( face, chinese_str[n], FT_LOAD_RENDER );
        if ( error )
          continue;                 /* ignore errors */
    
        /* now, draw to our target surface (convert position) */
        draw_bitmap( &slot->bitmap,
                     slot->bitmap_left,
                     target_height - slot->bitmap_top );
    
        /* increment pen position */
        pen.x += slot->advance.x;
        pen.y += slot->advance.y;
      }

    ./example1   ./simsun.ttc   abc

    _thumb7

    无法直接使用“abc陈志朋a”

    使用宽字符

    添加头文件include<wchar.h>

    #include <wchar.h>

      wchar_t * chinese_str = L"陈志朋~陈";
      unsigned int *p = (wchar_t *)chinese_str;

      int i = 0;

      printf("uicode: ");
      for( i = 0; i < wcslen(chinese_str); i++)
      {
        printf("0x%x " , p[i]);
      }

      printf(" ");
      return 0;
     

    85:27: error: converting to execution character set: Invalid or incomplete multibyte or wide character

    代码格式为asii应转化为uicode码

    gcc -finput-charset=GBK -fexec-charset=UTF-8 -o example1 example1.c  -I /usr/local/include/freetype2 -lfreetype  -lm

    结果

    uicode:
    0x9648 0x5fd7 0x670b 0x7e 0x9648

    打印出位置大小参数

    _thumb3

    添加头文件#include FT_GLYPH_H  

    FT_BBox bbox;
          FT_Glyph  glyph;
      
        // 将FT_GlyphSlot glyph转化为 FT_Glyph  glyph;
        error = FT_Get_Glyph( face->glyph, &glyph );
        if(error)
        {
            printf("FT_Get_Glyph error 
    ");
        }
        /*从glyph中获取bbox*/
        FT_Glyph_Get_CBox( glyph, FT_GLYPH_BBOX_TRUNCATE, &bbox );
    
    //汉字uicode码
        printf("uicode: %x
    ", chinese_str[n]);
        //汉字位置原点
        printf("origin.x /64 = %d , origin.y /64 = %d ", pen.x/64, pen.y/64);    
        //最小最大X,Y
        printf("x_min = %d ,x_max = %d, y_min = %d, y_max = %d 
    ", bbox.xMin, bbox.xMax, bbox.yMin, bbox.yMax);
        //X,Y偏移值
        printf("slot.advance.x/64 = %d, slot.advance.y/64 = %d 
    ", slot->advance.x/64, slot->advance.y/64);

    结果

    uicode: 9648
    origin.x /64 = 0 , origin.y /64 = 40 x_min = 2 ,x_max = 23, y_min = 37, y_max = 60
    slot.advance.x/64 = 24, slot.advance.y/64 = 0
    uicode: 5fd7
    origin.x /64 = 24 , origin.y /64 = 40 x_min = 25 ,x_max = 47, y_min = 38, y_max = 60
    slot.advance.x/64 = 24, slot.advance.y/64 = 0
    uicode: 670b
    origin.x /64 = 48 , origin.y /64 = 40 x_min = 48 ,x_max = 70, y_min = 37, y_max = 59
    slot.advance.x/64 = 24, slot.advance.y/64 = 0
    uicode: 7e
    origin.x /64 = 72 , origin.y /64 = 40 x_min = 73 ,x_max = 84, y_min = 55, y_max = 60
    slot.advance.x/64 = 12, slot.advance.y/64 = 0
    uicode: 9648
    origin.x /64 = 84 , origin.y /64 = 40 x_min = 86 ,x_max = 107, y_min = 37, y_max = 60
    slot.advance.x/64 = 24, slot.advance.y/64 = 0

    image_thumb4

    3_thumb7

  • 相关阅读:
    小学生入门激光SLAM<二>、2.1-前端点云帧间匹配
    小学生入门激光SLAM<一>、激光雷达去除畸变
    imgui开发笔记<1>、ubuntu环境下快速应用
    ROS问题记录
    LibTorch实战六:U2-Net理论详解<一>
    git-clone小技巧
    深度学习模型部署概述
    debian10 docker 安装 jenkins
    FastDFS集群部署
    python中的metaclass
  • 原文地址:https://www.cnblogs.com/CZM-/p/5322434.html
Copyright © 2011-2022 走看看