おにたまさん
ご返信心から感謝いたします。
本件ですが、gmode 2ではマニュアルにて黒が透過されると明記されており、
パレットモード0が透過される動作が異常であることは明白にわかります。
この問題に遭遇した開発者は
「バグだろうけれどパレットID0に黒を置けば一先ず整合性が取れるだろう…」
と考える人が多いかと思います。拡縮回転封印でも何とか整合性が取れます。
逆に「しめしめこの盲点を突いて黒以外を透過するギミックを取り入れよう!」
と考える人は少数派に思えます(私には恐ろしくてできません)。また画像素材
作成の都合でID0に黒を置けないような場合や、読み込まれるpngファイルが
わからないツール作品等の場合、この不具合はボトルネックとなります。
私個人的な意見としてはgcopyの動作に完全に統一していただきたいと思います。
ただ、もしパレットID0が何色かに関わらずパレットID0だけを透過するモードの
ほうが高速だったり、その実装が簡単であればsetreq命令でgmode 2の動作を
現在のgrotate仕様に(gcopyも含め)切り替えられるようにするとか選択肢を
与えていただければ旧動作で作られたプログラムへの救いにもなるかもしれません。
そればかりか透過色を自由に設定できるというHSP2以来の機能向上にも繋がります。
こうしたバージョンアップであれば個人的には大歓迎です。
この不具合を修正される際にこの可能性を意識しながら作業を進め、
もし対応できそうなら対応…という形でもいいかもしれません。
パレットモードはArtLet2Dのカラーマトリックス変換のような機能を標準かつ
超高速で提供しているようなもので、Dishでパレットモードが使えないことが
大変悔やまれます。原理的に難しいことは理解しておりますが、せめてWindows版
だけでもパレットモードを末永くメンテナンスしていただければ幸いです。
>前提としてcelputの1.0倍、角度0.0は通常のgcopy命令が使用され、
>それ以外の場合ではgrotate命令相当の機能が使用されます。
余談ですがcelputとgrotateって実は全然違いますよね^^;
Dish限定かもしれませんが、grotateの拡縮サイズの最小単位は1ドットですが、
celputでは小数点以下無限なため、特に非常にゆっくりと拡縮する物体が
grotateよりも遥かに美しく描画され、大変有り難く使わせていただいております。
追伸:
以前報告させていただいたパレットモードで初期化されたバッファへのpngファイル
読み込み不良の問題ですが、こちらも修正いただけますと幸いです。
また、pngフォーマットのパレットデータの吸出しは非常にわかりやすく、
bmppalette命令のpng版もあったら大変便利です。
以下に私が使用しているpngpalette命令と、パレットモードで256色pngファイルを
読み込めない問題を暫定的に回避しているサンプルスクリプトを貼ります。
ヘッダ読み込みを3200バイトに固定しているのは文字列変数自動拡張が不安なのと
巨大なPNGファイルや破壊されたPNGファイルでも読み込みを高速化して安定動作
させることを目的としています。
最後の画像読み込みでは画像のパレット割り当ては近似色の割り当てになるため、
正確なパレットID割り当てに対応できておらず、HSP側で対応いただきたい部分です。
//pngpalette命令はpngファイルからパレットデータを読み込みます。
//bmppalette命令のようにexistはしません。
//存在しないファイルを読み込もうとしたらHSPエラーしたほうが親切という考えです。
#module
#deffunc pngpalette str ns //ns=読み出すPNGファイル名。成功するとstatに取得されたパレット数が返る。
//最大3200バイトまでヘッダを読み込む(見たことないですがそれ以上先にPLTEチャンクがあると発見不可能)
sdim data,3208:bload ns,data,3200
//PNGファイルのヘッダーなら処理を開始する
if lpeek(data,0)=1196314761 & lpeek(data,4)=169478669:{ //ヘッダは常に 89 50 4E 47 0D 0A 1A 0A
palMax=0 //発見されたパレットデータサイズ
repeat 3200-768-8,8 //読み込んだデータから最大パレットデータサイズとヘッダサイズを引いた回数テスト
//★破壊された最悪なPNGファイルを読み込んでも最大202ループで処理が完了する。
index=cnt+3:repeat 4:poke data,cnt,peek(data,index-cnt):loop //チャンクサイズは反転している
chankSize=lpeek(data,0) //チャンクサイズを代入する
if chankSize<0:break //データサイズ異常(チャンクサイズは最低0である)
memcpy data,data,4,0,cnt+4:poke data,4,0 //dataにチャンクタイプを書き込む
//★↓これをコメント解除すると取得されたチャンクタイプとサイズが確認できる。
;dialog ""+data+"/"+chankSize:wait 10
if data="IDAT":break //IDATチャンクを発見したので以降PLTEチャンクは絶対に存在しない
if data="PLTE":{ //PLTEチャンク発見
index=cnt+8 //パレット情報が羅列されているインデックスを記録
//パレットデータサイズはRGBの羅列なので必ず3で割り切れ、かつ768バイト以上存在し得ない
if chankSize\3!0 | chankSize>768:chankSize=0 //データが異常ならサイズリセット(失敗)
palMax=chankSize/3 //パレット数をチャンクサイズから計算して代入。(↑の失敗も反映)
break
}
continue cnt+chankSize+12 //次のチャンクサイズへ飛ぶ(repeat回数を振り切れると処理終了)
//+12はデータサイズ(4)+チャンクタイプ(4)+CRC(4)で合計12バイト
loop
if palMax:{ //パレットデータサイズが正常に取得された場合
repeat 256
if cnt<palMax:{ //パレットデータがあればその色を設定
palette cnt,peek(data,index+cnt*3),peek(data,index+cnt*3+1),peek(data,index+cnt*3+2),(cnt=255)
}else{ //パレットデータがなければ黒を設定
palette cnt,0,0,0,(cnt=255)
}
loop
return palMax //成功(パレット情報を持つPNGファイル)
}
}
return 0 //失敗(要因:フルカラーPNGファイル・破壊されたPNGファイル・PNGファイル以外)
#global
//使用サンプル
screen 0,640,480,1 //パレットモードでメインスクリーン初期化
dialog "png",16:if stat!1:end //PNGファイル選択・読み込み
pngpalette refstr //パレットデータを吸い出す
if stat:{ //パレットデータが取得されていれば画面に情報出力
maxColor=stat
gmode 1,8,8
repeat 256
palcolor cnt:grect cnt\8*8+4,cnt/8*8+4
loop
//↓HSP3.5:256色pngファイルはパレットモードで読み込めないバグを回避↓
//ただし、この方法はパレットIDが正確にトレースされないので注意(近似色割り当て)
celload refstr,3:gmode 0,ginfo_sx,ginfo_sy:pos 64,0:gcopy 3,0,0
dialog "取得成功・色数:"+maxColor
}else{
dialog "取得失敗:PNGファイルがパレットモードではありません。"
}
長文失礼致しました。以上となりますが、宜しくお願いいたします。