Bài 4.2:String sử dụng trong BREW

Font size: Decrease font Enlarge font

Encode of wide character

Ở đây xin giải thích về encode của AECHAR type. Vì đây ko phải là phần quan trong lắm nên các bạn hãy đọc với tâm trạng thoải mái. Các bạn đã biết là trong AECHAR type có thể lưu tiếng Nhật. Vậy thì về internal, AECHAR type có character encode như thế nào?

AECHAR type thực tế là số nguyên 16 bit ko dấu. Vì là 16 bit nên chắc sẽ có vị đoán nó là Unicode (UTF-16) nhưng nó ko phải là Unicode(có thể cũng có trường hợp là Unicode).

Về vấn đề AECHAR type có character encode như thế nào(BREW sẽ hiểu là encode như thế nào) thì phụ thuộc hoàn toàn vào encode của mobile telephone terminal(terminal encode).

Trong trường hợp là mobile telephone terminal có thể hiển thị tiếng Nhật thì terminal encode thường là Shift_JIS, khi đó, AECHAR type sẽ có encode phái sinh từ Shift_JIS.

Các bạn hãy mở 「BREW API リファレンス/BREW API reference」 và tìm hiểu về giải thích của hàm STREXPAND() . Sẽ có mô tả như sau.

Expand input string into wide string. Những character có 127 ký tự trở xuống thì sẽ độ rộng của nó sẽ được expand gấp đôi.
Những character nhiều hơn 127 ký tự thì sẽ được copy vào pDest.

Tóm lại, nếu chỉ định Shift_JIS encode string vào char type rồi gọi hàm STREXPAND() thì trong số các Shift_JIS, ký tự của ASCII code sẽ có code được lưu là AECHAR, còn multi byte character thì có2 byte code được lưu là AECHAR character.

Nếu nhìn vào fig dưới đây thì hẳn các bạn sẽ thấy ngạc nhiên về việc AECHAR string có encode như thế nào.

※Halfsize katakana thì hình như là được phóng to giống như ASCII character mà ko phụ thuộc vào việc nó có code vượt quá 127 ký tự hay ko (check lại bằng BREW emulator). Do đó, hình như là giải thích về STREXPAND() trong 「BREW API リファレンス/BREW API reference」 bị sai.

Cách vẽ string và font

Hàm dùng để vẽ string ở BREW là IDISPLAY_DrawText(). Hàm này vẽ string bằng font đã được chỉ định trong hình vuông đã chỉ định. Có thể căn chỉnh chính giữa hoặc căn phải, trái, ect.

Chỉ có 1 điểm yếu là hàm này ko thể thực hiện được character wrapping drawing (bẻ dòng). Sau đó các bạn sẽ thử tạo applet thực hiện wrapping drawing. Prototype của hàm IDISPLAY_DrawText() là như sau.

int IDISPLAY_DrawText
(
    IDisplay * pIDisplay,     // IDisplay object
    AEEFont Font,             // Font
    const AECHAR * pcText,    // string sẽ vẽ
    int nChars,               // số ký tự sẽ vẽ
    int x,                    // tọa độ x phía trên bên trái
    int y,                    // tọa độ y phía trên bên trái
    const AEERect * prcBackground,  // hình chữ nhật sẽ clip
    uint32 dwFlags            // flag căn phải, ect
)

Để vẽ string thì cần chỉ định font. Font thì chỉ định bằng hằng số dạng AEEFont. Trong BREW SDK 2.1 thì có các hằng số dưới đây.

typedef enum {
    AEE_FONT_NORMAL=0x8000,   // Normal font
    AEE_FONT_BOLD,            // Bold font
    AEE_FONT_LARGE,           // Big font
    AEE_FONT_TOTAL            // Không sử dụng (reserve for future)
} AEEFont;

Dĩ nhiên, nếu trên mobile telephone terminal mà ko được support thì sẽ chỉ định AEE_FONT_BOLD, tuy nhiên ko có nghĩa là sau khi chỉ định thì nó sẽ trở thành bold font và cũng ko thể đảm bảo được là AEE_FONT_LARGE chắc chắn sẽ trở thành size lớn hơn AEE_FONT_NORMAL. Hiển thị thực tế phụ thuộc vào specification của mobile telephone terminal .

Để vẽ mà ko phụ thuộc vào specs của mobile telephone thì cần phải lấy từng size font. Do đó sẽ phải dùng hàm IDISPLAY_GetFontMetrics() .

int IDISPLAY_GetFontMetrics
(
    IDisplay * pIDisplay,
    AEEFont Font,         // chỉ định font
    int * pnAscent,       // lấy ascent của font
    int * pnDescent       // lấy descent của font
)

Những vị mà chưa biết về ascent và descent của font thì hãy tham khảo giải thích ở item AEEFontInfo trong 「BREW API リファレンス/BREW API reference」. Các bạn chỉ cần hiểu là chiều cao của font là value 「ascent+descent」.

Ở font của BREW, ko có thông tin về [độ rông của font ] nhưng có thể tính toán được bề ngang khi vẽ string đặc biệt bằng font đặc biệt. Để tín toán thì sử dụng hàm IDISPLAY_MeasureText() hoặc IDISPLAY_MeasureTextEx(). Chi tiết về các hàm này thì xem 「BREW API リファレンス/BREW API reference」.

※Trong 「BREW API リファレンス/BREW API reference」, có mô tả về interface gọi là IFont có liên quan đến font. Nhưng tôi nghĩ developer of BREW application thì ko sử dụng interface này nên ko cần phải biết.

Sample application của bài này

Dựa vào kiến thức đã học trong bài này hãy thử tạo applet sẽ hiển thị mà có breakline đối với long string ở bên trong hình vuông (click vào thì sẽ hiển thị source code ở trang khác).

Source code của program trong bài viêt

Tags:

Add to: Add to your del.icio.us Digg this story Add to your Twitter Add to your Google Bookmark Add to your Facebook Add to your MySpace
Số lượt xem: 865

[...] Bài 4.2: String sử dụng trong BREW (P2) [...]

JaneRadriges on June 14th, 2009, 10:04 am

I really like your post. Does it copyright protected?

ohyes on July 16th, 2009, 4:52 pm

I am using Japanese Windows, but 2-byte characters can NOT be displayed!!!

Gửi nhận xét:comment

 *
 *