hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
パレット設定 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

パレット設定

HSP3になってからパレットモードを使用する際は自分でパレットカラーを設定しなければならなくなりました。
ここではパレットの設定に関するソースを扱っていこうと思います。
勉強中のため、間違いなどもあると思います。 -- kz3 2005-09-30 08:22:43 (金)

パレットとは

1ピクセルをRGB三要素について0〜255までの256段階の色の組み合わせで表現したフルカラーに対して、 フルカラー16777216色から256色選び出し、0からの通し番号を割り当てた色をパレットカラーと呼び、 この割り当てに使用されたテーブルをパレットテーブルと呼ぶ。
また各色に割り当てた番号をインデックスと呼ぶ。

アプリケーションはインデックスからパレットテーブルを参照し対応するフルカラー1つの色を取得する。

パレットには3種類ある。

論理パレット
アプリケーションごとに管理されたパレットでいくつもある。
システムパレット
Windowsが管理するパレットで1つしかない。
デバイスパレット
実際に描画するためのデバイスが管理するパレットでWindowsからしかアクセスできない。
(他から直接アクセスするべきでない。)

汎用パレット

APIを使用した汎用パレット。アルゴリズムの勉強にはまったく役に立たない・・・。
まずはパレットカラーを取得(設定)できるかどうかのテスト。
ソースのなかではLOGPALETTE構造体を使っています。詳しくは可変長構造体を読んでください。

filev3_halftonepalette[sp].hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    #uselib "gdi32.dll"
    #func   CreateHalftonePalette   "CreateHalftonePalette" int
    #func   DeleteObject            "DeleteObject"          int
    #func   GetPaletteEntries       "GetPaletteEntries"     int,int,int,sptr
 
    #define tagLOGPALETTE       (4+4)
    #define tagPALETTEENTRY     4
 
    screen 0 , 18*16 , 18*16 , 1
 
    CreateHalftonePalette hdc : hpal = stat
    if hpal = 0 : end
 
    logmes "パレットハンドル = "+hpal
 
    GetPaletteEntries hpal , 0 , 0 , 0 : entries = stat
    if entries = 0 : end
 
    logmes "パレットエントリー = "+entries
 
    sdim logpalette , tagLOGPALETTE + tagPALETTEENTRY * (entries-1)
    wpoke logpalette , 0 , $0300
    wpoke logpalette , 2 , entries
 
    GetPaletteEntries hpal , 0 , entries , varptr(logpalette)+4
    if stat = 0:end
 
    repeat entries
        r = peek(logpalette , 4+cnt*4+0)
        g = peek(logpalette , 4+cnt*4+1)
        b = peek(logpalette , 4+cnt*4+2)
        palette cnt , r , g , b
    loop
    palette ,,,,1
 
    repeat entries
        palcolor cnt
        boxf cnt\16*18 , cnt/16*18 , cnt\16*18+16 , cnt/16*18+16
    loop
 
    onexit goto *quit
    stop
 
*quit
    DeleteObject hpal
    end

汎用パレット(画像表示テスト)

パレットモード、フルカラーモードの2つのウィンドウモードを用意し、画像を表示してみる。
パレットモードはパレットカラーをマップしたものと画像を表示したものを表示。
計3つのウィンドウで確認。

filev3_halftonepalette[sp]0.hsp
Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    #uselib "gdi32.dll"
    #func   CreateHalftonePalette   "CreateHalftonePalette" int
    #func   DeleteObject            "DeleteObject"          int
    #func   GetPaletteEntries       "GetPaletteEntries"     int,int,int,sptr
 
    #define tagLOGPALETTE       (4+4)
    #define tagPALETTEENTRY     4
 
    CreateHalftonePalette hdc : hpal = stat
    if hpal = 0 : end
 
    logmes "パレットハンドル = "+hpal
 
    GetPaletteEntries hpal , 0 , 0 , 0 : entries = stat
    if entries = 0 : end
 
    logmes "パレットエントリー = "+entries
 
    sdim logpalette , tagLOGPALETTE + tagPALETTEENTRY * (entries-1)
    wpoke logpalette , 0 , $0300
    wpoke logpalette , 2 , entries
 
    GetPaletteEntries hpal , 0 , entries , varptr(logpalette)+4
    if stat = 0:end
 
    screen 0 , 18*16 , 18*16 , 1
    title "パレットモード(パレットカラー)"
 
    gosub *palset
 
    repeat entries
        palcolor cnt
        boxf cnt\16*18 , cnt/16*18 , cnt\16*18+16 , cnt/16*18+16
    loop
 
    screen 2,,,1
    title "パレットモード(画像)"
 
    gosub *palset
 
    picload dir_exe + "\\sample\\demo\\jp6girl.bmp"
 
    screen 3,,,0
    title "フルカラー(画像)"
 
    picload dir_exe + "\\sample\\demo\\jp6girl.bmp"
 
    onexit goto *quit
    stop
 
*palset
 
    repeat entries
        r = peek(logpalette , 4+cnt*4+0)
        g = peek(logpalette , 4+cnt*4+1)
        b = peek(logpalette , 4+cnt*4+2)
        palette cnt , r , g , b
    loop
    palette ,,,,1
 
    return
 
*quit
    DeleteObject hpal
    end

コメント

  • 独り言を読みたい人はバックアップからどうぞ^^; -- kz3 2005-09-30 06:44:43 (金)
  • フルカラー画像とパレット画像・・・確かに微妙に荒くなってるけど大差ないですね〜(この画像自体、使用している色が少ないせいもある。) -- kz3 2005-09-30 07:04:08 (金)
  • まてよ?色を取得するだけなら可変長構造体はいらないか?
    PALETTEENTRY構造体配列だけ用意すればいいのか・・・。
    まぁデバイスコンテキストにパレットを使用するときは、LOGPALETTE可変構造体が必要になるので無駄ではない!としておこう^^; -- kz3 2005-09-30 07:12:24 (金)

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

調べもの

  • システムパレット
  • パレットテーブル
  • Windowsが予約している色は20色。ユーザーは残り236色をあれこれいじれる、とのこと。
  • パレットはWindowsが管理するシステムパレットと、各アプリケーションが操作できる論理パレット、さらにそれを実際にデバイスが表示するために参照するデバイスパレットがある。
  • このことは、各アプリケーションが異なるパレットテーブルを使っていても、実際に表示されるパレットは1つということ。
  • ということは、HSP3でパレットを設定するpalette命令は、アプリケーションごとのパレット・論理パレットを設定しているということですね?(予想です。)
  • つまり本来の意味でいうパレットとは、アプリケーションが表示したい256(236色?)を自由に決めてもいいですよ、というわけで、最初の疑問である256色はどこでも一緒というわけではないんですね〜。納得。
  • セーフカラー
  • 256色中216色を策定。残り40色はWindowsがシステムで使う色、とあるが・・・。パレットとは無関係かな。
  • HSPSDKにパレット関連のコードがあったぞ^^
  • SDKソース解読中。お宝の予感・・・。あ、申し遅れた、ここで独り言書いてるのは、私ですorz -- kz3

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:39:14 (2436d)