[問題] FreeType文字顯示

看板C_and_CPP作者 (xanadu)時間11年前 (2013/03/30 01:15), 編輯推噓1(1017)
留言18則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) 不限定平台(範例Code是windows平台,但這問題感覺上跟平台無關) 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) FreeType2 2.4.11 http://sourceforge.net/projects/freetype/files/freetype2/ 問題(Question): 文字無法正常顯示,特定size會出現奇怪的亂碼 餵入的資料(Input): windows8的細明體文字檔(mingliu.ttc), unicode'王' 預期的正確結果(Expected Output): 解析出點陣圖資訊 總之就看起來是個王字... World :王 , width :10 height : 9 0 0 0 0 0 0 0 01a 0 55348486e5848527d 1 0 0 0 05424 0 0 0 0 0 0 0 05424 0 0 0 0 03b4948846148963f 0 0 0 0 05424 0 0 0 0 0 0 0 05424 0 0 0 0 0 0 0 05424 0 0 5 0 354d4c4c725c4c4c8060 錯誤結果(Wrong Output): 錯誤的點陣圖,在特定字型大小時會出錯,如下 World :王 , width :12 height : 12 0807fc0 4 0 4 0 4 07fc0 4 0 4 0 4 0 4 0ffe0 0 0 fdfdfdfdabababababababab eefeeefe 0 0 0 0 0 0 0 0 47a454 245f4 81810 1 9 1 d8 1 9 1 0 0 0 0 0 0 0 0 34 0 0 0 1 0 0 056 1 0 0 fdfdfdfdc8558d 28cf92b 1 73746962 0 0 c 0 0 0 0 0 0 0 0 0 a 0 0 0 c 0 0 0 c 0 0 0 2 0 0 030 1 9 1 0 0 1 0 0 0 0 0fdfdfdfd 程式碼(Code):(請善用置底文網頁, 記得排版) http://ideone.com/4gEDvx 補充說明(Supplement): 字體要拷貝到專案下才能找到,要不然initial會過不了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.224.246.214

03/30 01:17, , 1F
資料陣列的寬度不見得跟width一樣,可能比較寬
03/30 01:17, 1F

03/30 01:18, , 2F
bitmap.pitch才是一列實際上的長度
03/30 01:18, 2F
是說應該是這樣嗎? sprintf(tmp,"%2x",bitmap.buffer[i+ bitmap.pitch*j]); 這樣更慘烈,字形大小為12時, bitmap.pitch為2 ※ 編輯: rephansu 來自: 125.224.246.214 (03/30 01:28)

03/30 07:27, , 3F
細明體字體檔檔名"mingliu.ttc",正黑體是"msjh.ttc"
03/30 07:27, 3F

03/30 07:29, , 4F
上面的程式碼是讀正黑體,上傳code時忘記改回細明體
03/30 07:29, 4F

03/30 13:11, , 5F
檢查一下FT_Glyph_To_Bitmap()的傳回值
03/30 13:11, 5F

03/30 13:12, , 6F
有一堆FDFDFDFD代表記憶體內容可能不正確
03/30 13:12, 6F

03/30 13:13, , 7F
前面發生問題導致bitmap根本沒寫進去
03/30 13:13, 7F

03/30 14:55, , 8F
回傳無error, 但trace後發現問題了
03/30 14:55, 8F
字形有分 FT_GLYPH_FORMAT_BITMAP 和 FT_GLYPH_FORMAT_OUTLINE FT_Load_Glyph第三個參數如果設成FT_LOAD_DEFAULT 讀取字形檔時會優先選擇Bitmap的字體 因此我的Code讀到FT_Glyph_To_Bitmap時會都沒有處理就跳出函式, 最後就變成讀出錯誤的文字。 耶!? 那Bitmap的字體不就要寫另外的流程 ※ 編輯: rephansu 來自: 61.224.74.253 (03/30 15:03)

03/30 15:26, , 9F
若是bitmap,在FT_Load_Glyph就會把字讀到bitmap的成員中,
03/30 15:26, 9F

03/30 15:26, , 10F
只是不知道為何讀出來的字會是錯的,
03/30 15:26, 10F

03/30 18:05, , 11F
Sleep 2~3 秒後再使用,有時初始化會怪怪的,我也想知道
03/30 18:05, 11F

03/30 21:36, , 12F
非 Windows 平台的話我會建議直接用 pango
03/30 21:36, 12F

03/30 21:37, , 13F
雖然 Windows 也能用 pango 啦... 如果不介意包 glib XDD
03/30 21:37, 13F

03/30 21:38, , 14F
另外建議你試看看其他的字型(非 Windows 內建)
03/30 21:38, 14F

03/30 21:39, , 15F
如果只有新細明體跟標楷體會這樣,那應該是 bytecode
03/30 21:39, 15F

03/30 21:40, , 16F
interpreter 被 disable 掉
03/30 21:40, 16F

03/30 22:59, , 17F
我的lib有加BCI,不會是這問題,我再多測幾個平台看看好了
03/30 22:59, 17F

03/30 23:01, , 18F
同樣字形在mac/ios上使用卻沒問題...真的很詭異
03/30 23:01, 18F
文章代碼(AID): #1HLSmP0v (C_and_CPP)