1

FreeType ライブラリを libpng と一緒に使用して、グリフの PNG 画像を出力しようとしています。グリフのラスター ビットマップを作成でき、有効な PNG ファイルを作成できますが、この 2 つを組み合わせることができないようです。問題は、末尾近くの次の行から発生します。

png_bytep image = (png_bytep) slot->bitmap;

FreeType ビットマップを a に単純にキャストしpng_bytepて pnglib に渡すことはできないようです (これは希望的観測でした)。次のエラーが表示されます。

/home/david/Desktop/png.c: In function ‘main’:
/home/david/Desktop/png.c:47:2: error: cannot convert to a pointer type

ただし、ここから先に進む方法がわかりません。しかし、コードの完全なブロックは次のとおりです。

#include <stdlib.h>
#include <stdio.h>
#include <png.h>

#include <ft2build.h>
#include FT_FREETYPE_H

main() {

    // Declare FreeType variables
    FT_Library library;
    FT_Face face;
    FT_GlyphSlot slot = face->glyph;
    FT_UInt glyph_index;
    int pen_x, pen_y, n;
    char* file = "/usr/share/fonts/truetype/freefont/FreeMono.ttf";

    // Declare PNG variables
    png_uint_32 width = 100;
    png_uint_32 height = 100;
    int bit_depth = 16;
    int color_type = PNG_COLOR_TYPE_GRAY;
    char* file_name = "/home/david/Desktop/out.png";
    png_structp png_ptr;
    png_infop info_ptr;

    // Render font
    FT_New_Face(library, file, 0, &face);
    FT_Set_Pixel_Sizes(face, 0, 16);
    glyph_index = 30;
    FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
    FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);

    // Create a PNG file
    FILE *fp = fopen(file_name, "wb");

    // Create the PNG in memory
    png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    info_ptr = png_create_info_struct(png_ptr);
    png_init_io(png_ptr, fp);

    // Write the header
    png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
    png_write_info(png_ptr, info_ptr);

    // Write image data
    png_bytep image = (png_bytep) slot->bitmap;
    png_write_image(png_ptr, &image);

    // End write
    png_write_end(png_ptr, NULL);

    fclose(fp);
}
4

3 に答える 3

2
void png_write_image(png_structp png_ptr, png_bytepp image);
typedef png_byte        FAR * FAR * png_bytepp;
typedef unsigned char png_byte;

したがって、 png_write_image は type の入力を探していますunsigned char far * far *

遠くの意味に興味がある場合は、http://en.wikipedia.org/wiki/Far_pointerを参照してください。

FT_GlyphSlot タイプを見ると、次のことがわかります。

typedef struct  FT_GlyphSlotRec_
  {
...
FT_Bitmap         bitmap;
...
}

typedef struct  FT_Bitmap_
{
  int             rows;
  int             width;
  int             pitch;
  unsigned char*  buffer;
  short           num_grays;
  char            pixel_mode;
  char            palette_mode;
  void*           palette;
} FT_Bitmap;

したがって、適切なタイプを取得するには、 が必要&slot->bitmap.bufferです。

キャストは必要ありません。

于 2012-09-08T19:51:54.523 に答える
1

おそらく、slot->bitmap の代わりに slot->bitmap.buffer が必要です。

slot->bitmap は FT_Bitmap (構造体型) で、ビットマップの幅なども含まれます。

于 2012-09-08T19:28:57.967 に答える