2007年6月26日火曜日

VRAM操作モジュール

VRAMの操作(色の取得・点の描画)を行うモジュール。
パレットエントリの理解が曖昧なので、まだベータ版。マジックナンバーも減らせるはず。

※コピー&ペーストの問題はCSSにあったようです。対策を施したので、今回の投稿からはきちんとコピーできるはず。
// VRAM操作モジュール vram.hsp
// 【参考】http://dream.freespace.jp/puma/iroiro/struct/bmscr3.htm
#module VRAM_MODULE vram, bmscr, screenWidth, screenHeight, bitmapWidth, colorMode

#modinit int screenID, local selectedScreen
    selectedScreen = ginfo_sel

    gsel screenID
    mref vram,  66
    mref bmscr, 67
    screenWidth  = bmscr(1)
    screenHeight = bmscr(2)
    colorMode    = 3 - bmscr(3) * 2 // FULL = 3, PALETTE = 1
    bitmapWidth  = (screenWidth * colorMode + 3) / 4 * 4
    gsel selectedScreen
    return

#modfunc _outOfScreen@VRAM_MODULE int x, int y
    return (x < 0) | (y < 0) | (screenWidth <= x) | (screenHeight <= y)

#defcfunc outOfScreen@VRAM_MODULE var modVar, int x, int y
    _outOfScreen modVar, x, y
    return stat

#modfunc _index@VRAM_MODULE int x, int y
    return (screenHeight - y - 1) * bitmapWidth + x * colorMode

#defcfunc index@VRAM_MODULE var modVar, int x, int y
    _index modVar, x, y
    return stat

#modfunc getColor int x, int y, local i
    if outOfScreen(thismod, x, y) : return -1
    i = index(thismod, x, y)
    if (colorMode == 1) {
        palcolor peek(vram, i)
    } else {
        color peek(vram, i + 2), peek(vram, i + 1), peek(vram, i)
    }
    return 0

#modfunc drawPoint int x, int y, local i
    if outOfScreen(thismod, x, y) : return -1
    i = index(thismod, x, y)
    if (colorMode == 1) {
        poke vram, i, bmscr(12)
    } else {
        poke vram, i + 2ginfo_r
        poke vram, i + 1ginfo_g
        poke vram, i, ginfo_b
    }
    return 0
#global

;   screen 0, 640, 480, SCREEN_PALETTE
    newmod vramController, VRAM_MODULE, 0

    getColor vramController, 00
    dialog "左上の色は:\n" + str(ginfo_r) + "," +  str(ginfo_g) + "," + str(ginfo_b)

    color 00255
    repeat ginfo_winy / 2
        y = cnt * 2
        repeat ginfo_winx
            drawPoint vramController, cnt, y
        loop
    loop
    redraw 1

0 件のコメント: