2007年6月27日 星期三

『 02.03 - PNG : PLTE 』

PLTE (0x50, 0x4C, 0x54, 0x45)


  • RGB (3 bytes)
    Each palette's RGB (Red, Green, Blue) color value (0x00 ~ 0xFF).
    For example:
    0xFFFFFF = White
    0x000000 = Black
    0xFF0000 = Red
    0x00FF00 = Green
    0x0000FF = Blue
整個 PLTE 資料裡只包含 RGB 值,所以總大小應當被 3 除盡。反過來說,將 PLTE 總大小除 3 後將可得到裡頭的的色格 (palette) 數量。之前也提到說 NDS 只支援到 16 bits 的顏色,而 PNG 裡頭的顏色卻是以 24 bits (3 bytes) 來儲存,所以記得顯示時要先將 24 bits 的顏色轉換成 16 bits 的顏色。

#define IX_8B5B(x) ((u8)(((u16)(x) <<>> 8))

以上的 macro 則是將 x 值 * 32 後再 / 256 用途就是把 0 ~ 255 (8 bits) 的數字轉換成 0 ~ 31 (5 bits) 但我也不確定我這做法是否正確,至少目前看起來還算正常。

2007年6月23日 星期六

『 02.XX - PNG : 20070623 』

今天下午終於又繼續寫程式了 (幾天前得重感冒) 但還是沒辦法靜下心來讀 LZ77 的壓縮規格。後來想說這樣下去也不是辦法,所以改向先從沒壓縮的資料下手…基本上還蠻容易的,只要反復的:讀區塊的資料長度,將這長度的資料直接複製到目標…直到最後一個區塊。但之後就開始遇到一些小曲折…

一開始先弄一張全白的 PNG 來試著顯示在畫面上,結果還算成功…


之後就把原本要擺的畫面放進來試著顯示,結果有點淒慘…



不知為何整個顏色都跑掉,圖本身也扭曲了一邊。之後就一直在看是不是程式哪裡沒寫對,還是解讀資料時有誤…到後來才發現顏色會跑掉都是 RGB15 這個 macro 搞的鬼。原因是原本的 PNG 是以 24 bits 為單位來儲存每個像素 (每個 RGB 分別為 8 bits) 但是在 NDS 的 Framebuffer 模式底下則是 15/16 bits 為單位 (每個 RGB 分別為 5 bits) 所以產生色素顏色顯示錯誤的問題。至於解決的方法很簡單…那就是讀 PLTE 時順便將每個 RGB 值 * 5 / 8 來換算成顯示的單位就行了。


至於扭曲的問題,應該跟寬度記算錯誤有關…目前還找不到真正的原因,先暫時偷改了一下正確的程式碼讓它寬度少一格來把圖案調正。


暫時先這樣了,明天有時間再好好研究問題所在…

2007年6月16日 星期六

『 環 境 畫 面 』

最近忙著看 DEFLATE 的規格 (因為 PNG 裡的 IDAT 是用這方法壓縮的) 所以都沒什麼太大的更新。想說附上一張我寫程式的畫面給大家看看…

[ 註解 ]
左邊:Programmers Notepad (寫程式碼)
右上:DevkitPro MSys (編譯程式)
中上:iDeaS 模擬器 (目前只有除錯訊息)
右下:Firefox (很多規格都在網上找的)

就這樣嘍~ 下次見!

2007年6月7日 星期四

『 02.02 - PNG : IHDR 』

IHDR (0x49, 0x48, 0x44, 0x52)
  • Width (4 bytes)
    Image width in pixels.
  • Height (4 bytes)
    Image height in pixels.
  • Bit Depth (1 byte)
    Number of bits per sample or palette index. Valid values are 1, 2, 4, 8, 16.
  • Color Type (1 byte)
    Defines PNG image type. Valid values are 0, 2, 3, 4, 6.
    0 = Greyscale.
    2 = Truecolor.
    3 = Indexed-color.
    4 = Greyscale with alpha.
    6 = Truecolor with alpha.
  • Compression Type (1 byte)
    0 = Deflate/inflate compression with a sliding window of at most 32768 bytes.
  • Filter Method (1 byte)
    0 = Adaptive filtering with five basic filter types.
  • Interlace Method (1 byte)
    0 = No interlace, 1 = Adam7 interlace.

2007年6月4日 星期一

『 00.01 - PNG : General 』

PNG File Header

大小:8 bytes
內容:0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A

PNG Chunks
  • Chunk Length
    4 bytes unsigned integer specifying "Chunk Data" size. Valid value = 0 ~ 2^31-1
  • Chunk Type
    4 bytes of uppercase and lowercase ASCII letters.
    Byte
    1: Uppercase = Critical, Lowercase = Ancillary.
    Byte 2: Uppercase = Public, Lowercase = Private.
    Byte 3: Reserved, must be uppercase.
    Byte 4: Uppercase = Unsafe to copy, Lowercase = Safe to copy.
  • Chunk Data
    Can be zero length.
  • Chunk CRC
    4 bytes of CRC calculated on the preceding Chunk Type + Chunk Data.
資料來源

2007年6月1日 星期五

『 研 發 環 境 』

以下是我目前的研發環境…

基本環境
作業系統:Windows XP SP2
程式編寫:Programmers Notepad (DevKitPro)
繪圖軟體:Adobe Photoshop CS

軟體開發套件 (SDK)
名稱:DevKitPro
版本:1.4.3
網址:[http://www.devkitpro.org]
簡介:目前網路上最有人氣的免費套件,有支援 NDS/GBA、NGC 和 PSP。

模擬器 (Emulator)
名稱:iDeaS
版本:1.0.1.5
網址:[http://spazioinwind.libero.it/linoma/ideas.html]
簡介:相容性高也有在持續更新。最新版有修正 3D 顯示的問題,也支援遊戲儲存的功能。