AlbiteReader的後續紀錄

AlbiteReader是一個可以在手機上閱讀 epub 電子書的軟體,原來只能看英文,下面是我改成可以看中文的紀錄。
原本很擔心怎麼build的問題,想不到下載 netbean 6.9.1 + J2ME 3.0 的版本就迎刃而解,先從AlbiteREADER的github網頁上把原始碼拉下來,接著用 netbean 開就行了,除了可以 build 也可以 debug (有emulator),這在後續追蹤問題上,給了我很大的協助。
netbean 這邊比較大的問題是在編輯主要畫面,就編輯 .midlet 檔時,如果選 flow 會整個當掉,我後來是根本沒機會看到,好在也不需要用到,其他的頁籤就都可以點,所以我就順手把主選單給中文化了。
之前有提到 Font 的問題,後來是整個翻掉,改成使用系統的中文字型,所以 AlbiteFont 類別其實是 J2ME Font 的 Adapter,作為一個中間的轉換,對原來的 AlbiteReader 來說,介面幾乎是一樣,只是底層顯示的方式改變了。
改了以後,根本沒辦法顯示,去 debug,才知道 Font.drawChar跟 netbean 給的提示不一樣,drawChar 的最後一個參數並不是 color,必須要給 Graphics.TOP、Graphics.LEFT…這些定位的參數才行,我後來是用 Graphics.TOP | Graphics.LEFT,簡單說,就是一個是上下的定位,一個是左右的定位,我就是固定靠左上角。
可以顯示之後,發現最右邊總是會出現半個字。原本以為是斷字出現的問題,大致追到TextPage,確定這裡是主要處理多少字為一頁的地方。再次利用了 debug,發現程式的思維跟我想的不一樣,程式的作法是根本不斷字,每行其實是一個 XXXRegion 的類別,Region 裡放的字串是好長一串,顯示的時候其實是這樣畫:12345678, 45678, 78…,所以根本跟斷字無關,一定會畫出半個字。我的處理方式是在 Font.drawChars 增加一個參數,在邊畫字的時候,就邊檢查,如果超出了這個值,就不畫了,這樣就避免了畫出半個字的問題。
整個改到這邊的時候,是很高興的,但是放到手機上,卻發現慢到一個不行。想了一個晚上,才想到,可能是取字寬度的問題,在看 TextPage 時,發現程式裡大量使用了取字寬度函數。因為我是呼叫 J2ME Font.charWidth(),每個字都去呼叫,而原來的處理,這些值都是固定的,而且字了不起也才 26 個英文字母 + 數字 + 標點符號,不會對程式有太大的負荷。但對中文字來說,如果每個字都去查,那肯定是很慢。這邊我的處理方法是在 initialize Font 的時候,就先把一個中文字的寬度記下來,假定每個中文字的寬度都一樣 (好在也都一樣),之後就用這個值去計算,這樣就恢復到原來的速度了。
回憶錄大概就記到這裡,如果有需要參考我的 code,可以到我 fork 出來的 github repository去拉。
要直接下載 .jar 的話,可以直接從這裡下載。

電影流水帳(2011/2/14~2011/2/22)

也是托網樂通的福。對遙控器的 play/pause 按鍵感到很火大,到底是為什麼在快轉/倒退時會那麼難按呢??

  • How to train your dragon(IMDB, Wikipedia),中譯:馴龍高手。維京男孩並不像一般的維京人,他打下了一條龍,並且發現了危害維京人的龍並不是單純因為想殘害他們而來搶食物,這個發現,不僅改變了部落的命運,也改變了龍的命運。我覺得很好看的動畫片,除了提醒自己當爸爸的要仔細聽懂兒子的話,也提醒自己要勇往直前,不要畏縮。
  • The Social Network(IMDB, Wikipedia),中譯:社群網戰。facebook網站創辦的經過,同時涉及了兩件訴訟案。被那兩個兄弟告,我覺得idea真的是先做先贏,這是有點沒道理,也不容易證明。但是被自己共同創辦人Eduardo Saverin告的那件訴訟,我就覺得Eduardo有點可憐了。不過最後都是以和解收場,算是皆大歡喜? 我覺得演那兩個兄弟的演員真的很帥又很壯,同事表示演Eduardo也很帥,只有主角比較不帥,不知道是不是導演故意的。

make recoveryimage後什麼事都沒有發生

make recoveryimage無法建出recovery image,追蹤build/core/Makefile以後,就可以發現,如果有定義TARGET_NO_KERNEL、TARGET_NO_RECOVERY或BUILD_TINY_ANDROID任一個為true的話,就不會建出來。
而我拿到的SDK的BoardConfig.mk裡,正好就有這麼一行:TARGET_NO_KERNEL:=true

電影流水帳(2011/2/8~2011/2/13)

真要說網樂通的缺點,就是沒有bookmark,以後如果要推包租電影的服務,我覺得這是相當重要的特色。不用到說有選單讓我設定bookmark,只要當我按停止或離開時能自動存下那個當下的點,之後當我再回來繼續看時,能自動繼續就好。每次因為小朋友要停下,之後要回去接著看時,就很累,64x的快轉才差不多跳一分鐘而已,而這樣的動作差不多要一秒,所以如果你是在最後的一小時三十分鐘離開不看,之後要回來接著看,就要按快轉64x,等約一分三十秒才能從停掉的地方開始看。之後會再看看收費服務合不合理,如果不是很ok的話,大概就會收起來供了吧…

  • Open Season 3(IMDB, Wikipedia),中譯:打獵季節3。這部片子印象中台灣好像沒上。故事很簡單,春天到了,應該是要去男生旅行的季節,可是卻沒人要跟大灰熊布穀去。布穀只好自己去亂逛,亂逛的時候遇到了馬戲團的大灰熊阿德,於是他們交換身份,最後,布穀的好朋友一起來找他,而布穀走的時候還帶了一個女友一起走,可謂是皆大歡喜。這一集除了以前的好朋友以外,還多了駱馬,算是大團圓的片,故事普普。這部片老婆跟我被兩個公子強迫看了十幾遍了,所以說,對小朋友應該是相當有吸引力….囧
  • Knight and Day(IMDB, Wikipedia),中譯:騎士出任務。很歡樂又有動作的片子,相當適合用來打發時間。就女主角其實算是宅女,出去找汽車零件的時候遇上了男主角,一開始並不知道他是特務,後來慢慢知道了整個事情的始末然後展開一連串的冒險,最後當然是順利解決事件。

AlbiteReader的字型處理

org.albite.font.AlbiteFont

  1. ctor 開啟字型檔以後,就開始處理 (這邊是開 .alf)
  2. 格式
    • byte 1: line spacing
    • byte 2: line height
    • byte 3-6: glyphs (character range)
    • byte 7-8: maxium width
    • byte 9-12: character count
    • 接下來就是循序讀出各字元的 x, y, w, h, xo, yo, xa
      • byte 1-2: character
      • byte 3-4: x
      • byte 5-6: y
      • byte 7-8: width
      • byte 9-10: height
      • byte 11-12: xoffset
      • byte 13-14: yoffset
      • byte 15-16: xadvance 下一個字元跟目前字元的間隔
    • 再放到對應 character 的 glyphs 陣列裡 (glyphs[character]=new Glyph(x, y, w, h, xo, yo, xa)
  3. 讀完 .alf(字型資訊),接著開啟 .ali,這邊是真正的字型資料,先把整個 .ali 讀取到記憶體裡 (由 AlbiteImageMono 處理,同樣也有檔頭,但較簡單,前4個bytes是magic number,接著的兩個bytes是width,然後再來的兩個bytes是height)
  4. 把必要的字元先處理起來,像是 ‘ ‘, ‘?’, ‘-‘
  5. 其他的字元都是畫的時候,依據 glyphs 資訊去存取記憶體裡的 buffer

照這樣看起來,如果要依樣畫葫蘆,將中文字型製作成 .ali 的話,會遇到的問題是記憶體問題。AlbiteFont 會將整個 .ali 載入到記憶體裡,製作出來的 .ali 會有多大呢? 假設字的大小是12×12,要完整收文泉驛的20932個字,那大約是3MB左右。依照 SE T700 的規格,內部記憶體只有 25MB。未知的是可用記憶體,所以必須考慮最壞的情況,記憶體會不足!!
會使用自己的字型,我想應該是考慮到平台相容的問題。

epub二三事

今天剛好看到這個百年千書計劃,裏面提供了一堆epub,於是就想說,可不可以放到我的手機SE T700上看呢?
就上getjar上找,就找到了Albite Reader。很高興地下載程式跟epub下來放到手機上,可以執行,但是結果卻都是一堆 ?
這到底怎麼回事,首先我試了軟體的編碼設置功能,沒有用。我懷疑 epub 裡的編碼是big5,而軟體的編碼選項裡卻沒有 big5,所以就上網找了一下,看要怎麼編輯 epub。看到這篇:Edit ePub eBooks with Your Favorite HTML Editor,才知道原來 epub 其實是個 zip 檔案,將副檔名更名為 zip 以後,就可以解開去看了。然後也發現了不錯的編輯工具:sigil。不過都沒有用,epub 裡的編碼是正確的。
那麼問題就出在軟體本身了,幸好軟體有開放原始碼而官方網站也有說明。大致看了官方網站的說明以後,才明白,問題出在字型上。軟體本身沒有包中文字!!!!這就麻煩了。官方網站也有說怎麼製作字型,不過他所使用的 Bitmap font generator 卻沒有支援中文字,因此無法產生出必要的 .png 跟 .xml 檔案,也沒辦法繼續後面的步驟,將 .png, .xml 轉成 .alf, .ali 了。
傷腦筋,看來如果要能用,一個方法就是寫程式去做出 Bitmap font generator 的功能,將字型轉成 .png, .xml,另外一個方法就是改寫 Reader 裡處理字型的部份了。
我想寫工具來轉字型應該是比較快的方法,在 AlbiteFontBuilder網頁裡有提到 .xml 的格式,看起來是將字型都顯示在 .png 以後,.xml 則是描述字(glyph)在 .png 裡的位置跟寬高。得到這個以後,應該就可以接著用 AlbiteFontBuilder 做出 .alf 與 .ali 了。

電影流水帳(2011/1/1~2011/2/7)

最近裝了網樂通,3月底前看電影不用收費,就趁過年期間看了幾部。

  • Shrek Forever After(IMDB, Wikipedia),中譯:史瑞克快樂4神仙。看完以後有不少感觸,心裡想這根本就是給已婚者看的啊~的確是常常會覺得自己時間都被剝奪掉了,可是從另外一方面來看,的確,太太與小孩也給自己帶來不同的視野與責任,中間的平衡點怎麼去拿捏就是一門學問…可是,這很常是一個離婚的原因…好吧,言歸正傳,簡單說就是Shrek想偷閒回去過一天以前的生活,卻沒想到合約裡的陷阱,導致現在與未來的生活陷入危機,當然最後是皆大歡喜,破除了合約裡限制,重回原來的生活。相當好看的片,我個人推薦給已經結婚的人看,不過這並不代表看了以後,就會知道結婚不只是愛。
  • Despicable Me(IMDB, Wikipedia),中譯:神偷奶爸。看了時候正在吃飯,一片混亂,所以沒什麼太大的感想,基本上是走溫情路線。主角是個不太成功的科技小偷,因為童年以及現實的種種因素,他決定去偷月亮。為了偷月,他需要準備許多道具,其中包括了縮小燈。在偷縮小燈的過程裡,他認識了3個女娃,並收養了她們,於是溫情從此展開。最後他收養了3個女娃,月亮偷成了,但縮小燈有缺陷,又還回原位了。
  • Inception(IMDB, Wikipedia),中譯:全面啟動。這部片很好看,網路上應該有很多人分享了,這裡就不多說。
    • 現實的五分鐘等於夢境裡的一小時。這裡我照著推算了一下,飛機上的十小時一共600分鐘,在夢境裡應該是五天才對,而不是一星期。
    • 第1層夢境裡,Fischer潛意識持續在追殺他們,那他們從水裡脫逃以後,應該是繼續被追殺才對吧?那將近五天怎麼渡過?
    • 最後老婆跟我還倒帶看了那個圖謄陀螺好幾次,看到底有沒有倒下。我是跟她說沒有,因為這部電影從一開始就是一個夢。

    其他還有一些可能要反覆再多看幾次才會明白的細節,真是太玄了。