2012-09-08 84 views
1

我試圖將FreeType庫與libpng一起使用以輸出字形的PNG圖像。我可以創建字形的柵格位圖,並且可以創建一個有效的PNG文件,但我似乎無法將它們放在一起。這個問題來源於此行接近尾聲:C編譯器錯誤:無法轉換爲指針類型

png_bytep image = (png_bytep) slot->bitmap; 

看來,我不能簡單地把FreeType的位圖到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); 
} 

回答

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正在尋找類型爲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正確的類型。

不需要施放。

+0

謝謝!與焦油相同的答案,但更深入一點。雖然兩個很好的答案!仍然試圖找出在'渲染字體'部分發生的段錯誤。有任何想法嗎? :-) –

2

好像你應該通過&image而不是圖像。

+0

謝謝。這清除了一些錯誤,但主要錯誤是相同的。我會更新帖子。 –

1

你可能想slot-> bitmap.buffer代替slot->位

slot->位是FT_Bitmap,結構類型,也包含了位圖寬度等

+0

啊,那工作。編譯!現在有一個segfault需要處理,但我想這可能是一個不同的問題:-)。謝謝! –

+0

在使用freetype之前,您需要調用'FT_Init_FreeType(&library)'。 'FT_GlyphSlot slot = face-> glyph;'應該低於創建臉部的函數調用。接下來的問題是你使用libpng的地方。 – Tar

+0

天才。再來一次。現在segfault發生在'渲染字體'代碼中。我不認爲你有什麼建議嗎? ;-) –

相關問題