FreeBASIC マニュアルのトップに戻る

FreeBASIC FBgfx 画像と字体バッファ

目次→教本→いっしょに学ぼうFBgfx Image and Font Buffers←オリジナル・サイト

FBgfx 画像と字体バッファ 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

あなたの FBgfx 画像とフォント(字体)バッファを作成して、理解します。

FBgfx 画像バッファ
バッファを作る
バッファ形式
画素を取得
FBgfx フォント(字体)ヘッダー
ヘッダーの詳細
フォント(字体)バッファを作る
字体文字を割り当てる
Tips & Tricks
カスタム字体を着色する
ScrPtr 対 ImgBuf


FBgfx 画像バッファ

FBgfx は、FB 0.17 〜で、新しいデータ型があります。
この型は、IMAGE と呼ばれます。
プログラムに、FBgfx Header を含める (#include "fbgfx.bi") ことで、この型を使えます。そして、FB.IMAGE を通して、FBgfx のために、名前空間にアクセスします。
このチュートリアルでバッファを作るとき、fb.Image ptr 型を使います。
これは、リサイズできる、ダイナミック・メモリなので、ポインタです。

FBgfx ライブラリで画像を使うには、イメージ・バッファ経由で画像を作成しなければなりません。
バッファとは、あなたの画像のための割り当てられた(作成して、利用可能になる)メモリの領域です。
プログラムの最後で、バッファを使い終わったとき、バッファの割り当てを解除(開放する。他のプログラムに利用可能にする)しなければなりません。
FBgfx は、作成された全てのバッファの始めに、FBgfx 自身の内部のピクセル形式と、画像ヘッダーを持っています。
画像ヘッダーは、あなたの画像の情報を含んでいます。
画像の幅、高さ、ビット深度など。画素の Buffer は、RGB(赤、青、緑) の形式で、それぞれの個々の画素のための実際の色を、含んでいます。

バッファを作る

画面の色深度によって、作るバッファのサイズは異なります。
1画素あたりのバイトは、個々の画素を格納するのに必要なバイト数です。
したがって、32ビット画素深度の画面は、画素あたり 4 バイト(1バイトは、8ビット)を必要とします。
しかし、このことについて心配する必要はありません。バッファを作るために、fb.Image ptr セットアップを使うと、非常に簡単にバッファから必要な情報を得られるからです。
この情報は、メモリ使用量情報のために、バッファが合計でどのくらいのサイズを確保するかを理解する上で、知っおけばよいだけです。

実際にバッファを作るのは、非常に簡単です。
バッファを作るには、ただ 、単純に fb.Image ptr を生成して、Imagecreate を呼ぶだけです:
(Example1.bas):渡辺注:動きます。
#include "fbgfx.bi"

  '' イメージの 幅/高さ
Const ImgW = 64
Const ImgH = 64

  '' 画面は、imagecreate への呼び出しの前に、作成されなければなりません
ScreenRes 640, 480, 32

  '' バッファを作成します
Dim As FB.Image Ptr myBuf = ImageCreate (ImgW, ImgH)

  '' バッファのアドレスを表示します。
Print "Buffer created at: " & myBuf
Sleep

  '' バッファを破壊します。   CREATE したバッファを、必ず DESTROY します。
ImageDestroy( myBuf )
Print "Our buffer was destroyed."
Sleep



コードの解剖

#include "fbgfx.bi"


これは、fb.Image 型のための定義を収納した、ヘッダーファイルを含めています。

  '' イメージの 幅/高さ
Const ImgW = 64
Const ImgH = 64


これは、画像のサイズを決めるために使われる定数を、作成しています。
FBgfx は、この定数を知りません。
FBgfx を使うとき、この定数を Imagecreate に渡さなければなりません。

  '' 画面は、imagecreate の呼び出しの前に作成されなければなりません
ScreenRes 640, 480, 32


これは、FBgfx 画面を作成します。
Imagecreate は、あらかじめ、ビット深度を知る必要があります。
しかし、FBgfx の Imagecreate には、現在、あなたが自分で深さを設定できる、特別のパラメタがあります。

  '' バッファを作成します
Dim As FB.Image Ptr myBuf = ImageCreate (ImgW, ImgH)


まず、fb.Image 型のポインタを作成します。
ポインタは、ただメモリの位置です。
私たちは、ポインタに、まだ何も格納していません。
今時点で、それは、事実上、ゼロと等しく、使用できません。
これは、ヌル と考えられます。

Imagecreate を呼ぶと、ポインタは初期化されて、新たに作成された fb.Image に関するメモリの領域のアドレスが、返されます。
このバッファのサイズは、ビット深度に依存します。バッファに含まれる画像の幅/高さは、私たちが、先に設定したものになります。
また、Imagecreate は、3番目と4番目の引数として、それぞれ、色と深度を取ることができます。
指定しないと、画像は、透明色で満たされた状態で作成されて、現在の画面と同じ色の深度になります。

私たちは、今、メモリに場所を割り当てました。
これは、FBgfx が、fb.Image 型の中でつかむデータと一緒に、ImgWxImgH 画像を保持するために、充分な空間です。
適切なメモリ管理のために、後でそれを破壊する必要があります。

  '' バッファのアドレスを表示します
Print "Buffer created at: " & myBuf
Sleep


これは、私たちが何をしたかを、あなたに知らせるために、あります。
私たちは myBuf のアドレスを表示します。
表示が 0 でなければ、Imagecreate が働いたと見なすことができます。

  '' バッファを破壊します。   CREATE したバッファは、いつも DESTROY します。
ImageDestroy( myBuf )
Print "Our buffer was destroyed."
Sleep


ここで、Imagedestroy を呼び出して、バッファを破壊します。
バッファの割り当てを解除するために Imagedestroy を使用する必要はありませんが、一貫性と明快さから、Imagedestroy を使うことは、最も良いことです。

バッファ形式

バッファを作る方法を知ると、次に、バッファの中に何が保持されたか、詳しい情報を知りたいと思うでしょう。
あなたは、fbgfx.bi ヘッダーファイルを開けて、fb.Image 型を見つけることができます。そして、fb.Image 型の中の、すばらしいものすべてを見ることができます。

私たちは、実際に、形式自体について、よく知る必要はありません。
この理由は、fb.Image ptr を使ったからです。
メモリの、Buf + Sizeof(fb.Image) 以降のすべてが、画素に属します。
その前のすべてが、ヘッダーです。
私たちが、fb.Image ptr を使ったので、とても容易に、ヘッダーにアクセスできます。
あなたが知らなければならないことは、あなたが探したいことだけです。

FB.IMAGE データ型

    '' 画像バッファ・ヘッダー、新型式 (古いヘッダーを組み込みます)
    ''
    Type IMAGE Field = 1
        Union
            old As _OLD_HEADER
            Type As ulong
        End Union
        bpp As Long
        Width As ulong
        height As ulong
        pitch As ulong
        _reserved(1 To 12) As UByte
       
'       '' properties
'       declare property pixels() as ubyte ptr
    End Type
   
    '' これは、画素データ領域へのポインタを取得するトリックです
    ''
'   property IMAGE.pixels() as ubyte ptr
'       return cast(ubyte ptr, @this) + sizeof(IMAGE)
'   end property


この同じ情報は、fbgfx.bi で見つけることができます。
お分かりのように、このデータ型は、たくさんの、あなたのバッファの適切な情報を、保存します。
幅、高さ、ピッチ(1列あたりのバイト)、ビット深度(1画素あたりのバイト) は、すべて含まれています。
ユニオンには、ヘッダの型と、古いヘッダ自体が、同じスペース内に含まれています。
新しいヘッダーの形式は、7 の型の値によって示されます。
古いヘッダーの形式は、FBの、新しいバージョンのデフォルト方言では、使用されません。そのため、ここでは、古いヘッダーの形式について説明しません。

私たちは、ヘッダーの中の情報に、どうやってアクセスするでしょうか?
あなたがポインタに詳しいなら、あなたは、ポインタにアクセスするように、あなたのバッファにアクセスして、バッファの中のデータに直接アクセスします。(あなたはポインタに詳しいでしょう。私たちは、最初の例で、バッファにポインタを使いました。)
これは、あなたに、バッファに含まれるすべてが、fb.Image 型そのものであると思わせるかもしれません。しかし、それは真実ではありません。
fb.Image ptr を使うと、コンパイラは、最初の部分だけでも、バッファに含まれている内容と考えることができます。

画素を取得

FreeBASIC が、わたしたちを手伝う、わたしたちのバッファの最初の区画は、ヘッダ情報を含みます。
fb.Image のサイズを、アドレスに加えてください。そうすれば、バッファの残りは、画素を含みます。
(Example2.bas)
  '' FB.IMAGE データ型を使うためには、これを入れなければならないことを、忘れないで下さい。
#include "fbgfx.bi"


忘れずに、fb.Image データ型を含めてください!

  '' これは非常に重要です。
  '' 私たちは、最初に、ubyte ptr に型変換します。画素の正確な開始バイトを得るためです。
  '' そして、uLong ptr に型変換します。単に「疑わしげな代入」の警告を避けるためです。
Dim As uLong Ptr myPix = Cast ( uLong Ptr, ( Cast( UByte Ptr, myBuf ) + SizeOf(FB.Image) ) )


フー。よし。 私たちは、画素の正確なアドレスを、確実に取得しなければなりません。
ulong は、4バイトを含んでいます。
これらのうち 3つは RGB に使用され、もう一つは、一般に、必要により、アルファに使われます。
(非常にリソースが豊富な一部の人たちは、アルファ・バイト - またはチャンネル - を使って、全ての種類のデータを格納します。)
もし 1バイトでも欠落すると、赤は緑となり、青は赤になります!
それで、最初に、ubyte ptrcast しなければなりません。

あなたは、アドレスに、SizeOf(fb.Image) を追加しただけなのに、気付いたでしょう。
それは、fb.Image を使う、別の特典です!
バッファの先頭に、サイズを追加すると、ちょうどヘッダーに関連するすべてのメモリアドレスをスキップして、ちょうど、私たちの画素のところになります。

最終的に、主に安全のために、そのすべてを、Ulong Ptrcast します。
私たちは、32 ビット深度のモードを使っているので、1画素あたり 4バイト必要です。
Ulong は、これを持っています。

これがどのように働くか、理解しにくいなら、小さい線を考えて下さい。
これが、私たちのバッファです: |FB.IMAGE ヘッダー |画素|

バッファの最初のセクションに含まれているものが、fb.Image ヘッダーならば、サイズは、明らかに大きくなるでしょう。
それで、単に、fb.Image データ型のサイズを、元のアドレスに追加することで、何画素ものアドレスを得ることができます。

しかし、もう 1つ問題があります!
新しいものを得るために、バッファ・アドレスに、そのサイズを追加すると、私たちは奇妙な結果になります。
これは、私たちのデータ型が、長さ1バイトではないからです。
私たちは、最初に、Ubyte Ptrcast して、次に、アドレスを加えなければなりません。
Ubyte は、長さ1バイトなので、メモリで使える、正確なバイトを得るでしょう。

最終的に、32ビットになりました。
私たちは、Ubyte Ptrcast しただけです。
私たちは、Ubyte のアドレスを、Ulong ptr に割り当てることができます。最初に、それを Ulong Ptrcast することが、最も良いやり方です。
最終的に、正しいデータ型で、画素のアドレスを取得します (1画素毎に 1つ!)。
ここまでくると、必要なら、これらの画素を、直接、操作することもできます。

  '' バッファに格納された情報を表示します。
Print "Image Width: " & myBuf->Width
Print "Image Height: " & myBuf->Height
Print "Image Byte Depth: " & myBuf->BPP
Print "Image Pitch: " & myBuf->Pitch
Print ""


これは、私が、先に話したことです。
FB が、ポインタを、まるでそれが fb.Image ptr であるかのように扱うので、あなたはヘッダーで、直接、データにアクセスできます。

渡辺注:下は、これまで述べてきた「(Example2.bas)」の全体で、動きます。
  '' FB.IMAGE データ型を使うためには、これを入れなければならないことを、忘れないで下さい。
#include "fbgfx.bi"

  '' イメージの 幅/高さ」
Const ImgW = 64
Const ImgH = 64

  '' 画面は、imagecreate の呼び出しの前に作成されなければなりません
ScreenRes 640, 480, 32

  '' バッファを作成します
Dim As FB.Image Ptr myBuf = ImageCreate (ImgW, ImgH)

  '' これは非常に重要です。
  '' 最初に、ubyte ptr に型変換します。画素の正確な開始バイトを得るためです。
  '' そして、uInteger ptr に型変換します。単に「疑わしげな代入」の警告を避けるためです。
Dim As UInteger Ptr myPix = Cast ( UInteger Ptr, ( Cast( UByte Ptr, myBuf ) + SizeOf(FB.Image) ) )

  '' バッファに格納された情報を表示します。
Print "Image Width: " & myBuf->Width
Print "Image Height: " & myBuf->Height
Print "Image Byte Depth: " & myBuf->BPP
Print "Image Pitch: " & myBuf->Pitch
Print ""

  '' バッファを破壊します。   CREATE したバッファは、いつも DESTROY します。
ImageDestroy( myBuf )
Print "Our buffer was destroyed."
Sleep


私たちは、現在、画素のアドレスだけでなく、画像のサイズも、取得しました。このため、まるでこれらが、私たちの画面バッファへのポインタであるかのように、これらを編集して、操ることができます!
これの例については、ScrPtr vs ImgBuf.bas を見てください。


FBGfx 字体ヘッダー


ヘッダーの詳細

字体として使われる画像バッファの、最初の列は、あなたの字体のための、ヘッダー情報を、バイト単位で、含んでいます。(row -> column の順に格納されるので、最初の画素の列が、最初のバイトになることを覚えておいてください。)

ヘッダー情報の最初のバイトは、使っているヘッダーのバージョンを示します。
現在は、0だけがサポートされています。まだ、リリースされたヘッダーバージョンが、 1つしかないからです。
2番目のバイトは、私たちの字体でサポートされた最初の文字を示します。そして、3番目のバイトは、最後の文字を示します。

0; バイト; ヘッダー・バージョン
1; バイト; サポートされた、先頭文字
2; バイト; サポートされた、最後の文字
3 to (3 + LastChar - FirstChar); バイト; 私たちの字体の、それぞれの文字の幅。


字体バッファを作る

例えば、字体が、文字コード 37 を1番目として、文字コード 200 を最後としてサポートするなら、バイトは、下のようになります。

0 :ヘッダーバージョン。 これは現在サポートされる唯一のバージョンです。
37 :サポートされた先頭文字。
200:サポート最後の文字。
94 : 各文字幅を示す 94バイト。

最初の列は、ヘッダー・データのために取られるので、字体バッファは、高さが字体の高さプラス 1 の、画像バッファになります。
すなわち、字体の高さが 8 なら、バッファの高さは、9 必要です。
バッファの2番目の列に、字体を入れます。普通思うように、1番目でないことに注意して下さい。

下は、字体バッファを作る例です。
これは、字体バッファを作るだけです。実際の字体ではなく、ヘッダー・データだけを割り当てます:
(Example3.bas)
  '' サポートされた最初の文字
Const FirstChar = 32
  '' サポートされた最後の文字
Const LastChar = 190
  '' 文字数の合計
Const NumChar = (LastChar - FirstChar) + 1


これらの定数は、私たちを助けます。
これを使って、コードは、明快で高速になります。

  '' 幅 8 の、96 個の文字を保持するに充分な大きさで、字体バッファを作成します。
  '' バッファを、字体自体の高さより 1 大きくすることを、忘れないでください。
Dim As FB.Image Ptr myFont = ImageCreate ( ( NumChar * 8 ), 8 + 1 )


私たちの字体バッファを作成します。
私たちは、字体(8 画素の幅)の各文字のために、水平方向のスペースを加える必要があります。
また、私たちは、字体ヘッダー情報のために、字体ヘッダー情報専用の、特別な列を加える必要があります。

  '' 私たちの字体ヘッダー情報
  '' 安全と一貫性のために、uByte ptr に、型変換します。覚えておいてください。
Dim As UByte Ptr myHeader = Cast (UByte Ptr, myFont )


適確な情報を取得して、型変換します。警告なく、私たちの字体バッファのアドレスが、できました。
ヘッダーは、バイト単位で進むので、fb.Image 型では、これは働くことができません。

  '' 字体バッファ・ヘッダーを割り当てます
  '' ヘッダー・バージョン
myHeader[0] = 0
  '' サポートされる、最初の文字
myHeader[1] = FirstChar
  '' サポートされる、最後の文字
myHeader[2] = LastChar


最初の3バイトに、上で説明されたヘッダー情報を割り当てます。
ヘッダー・バージョン、サポートされた最初の文字、および、サポートされた最後の文字。

  '' 字体の、それぞれの文字の幅を、割り当てます
For DoVar As Integer = 0 To NumChar - 1
    '' あなたが思い出すなら、ヘッダーをスキップします
  myHeader[3 + DoVar] = 8 
Next


私たちの字体による各文字は、それ自身の幅を持つので、これらを割り当てなければなりません。
3 + は、ヘッダー情報をスキップします。
##DoVar## は、0 で始まるので、最初にそのコードを読むとき、インデックスは、3 になります。
サポートされたすべての文字に、8 の幅を与えます。

  '' 忘れずに、イメージバッファを破壊します
ImageDestroy( myFont )


あなたは、「D(estroy)」と覚えておくとよいでしょう。


字体文字を割り当てる

これはかなり簡単です。
私たちは、バッファに取り出すために、FreeBASIC のデフォルトの字体を使います。
最初の列は、ヘッダ・データのために予約されているので、取り出しは、列 0 ではなく、列 1 で始まること忘れないでください。
サポートされた最初の文字で、開始します。そして、好きな色をそれに与えます。
あなたの字体を描くときに、あなたは、カスタム色を持つことができないことに、注意して下さい。
バッファに文字を追加するとき、バッファは、あなたが描く文字の色を、張り付けました!
しかし、これを迂回する方法に関しては、tips & tricks を見てください。

下は、変更したコードです。ここでは、FreeBASIC のデフォルト字体を経由して引き出した字体を、私たちのバッファに追加します。
(Example4.bas)↓渡辺注:動かし方がわかりません(^^ゞ
  '' NEW!!!
  '' 私たちの現在の字体文字
Dim As UByte CurChar


現在の ASCII 文字の、迅速な索引を持つために、私たちの字体に、引き出しています。

Draw String myFont, ( DoVar * 8, 1 ), Chr(CurChar), RGB (Rnd * 255, Rnd * 255, Rnd * 255)


画像バッファの最初の列をスキップします。最初の列は、字体バッファ情報だからです。
私たちのカスタム字体として、FBgfx の字体を使って、私たちの字体を描きます。
無作為の色で、私たちの字体を満たします。
"Draw String myFont..." で、バッファに引き出していることに、注意して下さい。

Print Chr(CurChar);


まさしく明快です。あなたは、バッファの中に描いた文字を見ることができます。

  '' 私たちの字体バッファを使って、テキストを作成します!
Draw String (0, 80), "Hello!", , myFont
Draw String (0, 88), "HOW ARE ya DOIN Today?!  YA DOIN FINE?!", , myFont
Sleep


私たちの新しい字体を、徹底的に試してください。
もちろん、それは、私たちが使っているものと同じです。
あなたは、あなた自身のカスタム字体バッファから、自身のものを作ることができます。

関連参照:描画画面に日本語を表示する


Tips & Tricks


カスタム字体を着色する

あなたは、いったんカスタム字体に色をつけると、その色を変えるために Draw String が使えないことを、理解しました。
よろしい、心配要りません。私たちはそれを迂回できます。
しかし、それは少し速度が遅いかもしれません。

私たちは、字体オブジェクトを作成できます。字体オブジェクトは、字体バッファを返す機能を持っています。
コードがすることは、私たちが色を変えると、字体バッファを描き直して、オブジェクトに格納された字体バッファを返すということです。
私たちが、書き直す文字の範囲を知っているならば、これは理論的には速度を上げることができます。それで、最も低いものから最も高いものに、書き直すようにします。
その範囲を理解しても、遅いかもしれません。
(CustFontCol.bas)↓渡辺注:動きます。
#include "fbgfx.bi"

Type Font
    '' 私たちの字体バッファ。
  Buf     As FB.Image Ptr
    '' 字体ヘッダー。
  Hdr     As UByte Ptr

    '' 現行フォント色。
  Col     As UInteger

    '' 私たちの字体バッファを作ります。
  Declare Sub Make ( ByVal _Col_ As UInteger = RGB(255, 255, 255) )
    '' フォントの色を変えます。そして、字体バッファを編集します。
    '' 新しい字体を、返します。
  Declare Function myFont( ByVal _Col_ As UInteger = RGB(255, 255, 255) ) As FB.Image Ptr

    '' 私たちの字体を、作成/破壊します。
      '' よければ、デフォルト色を、それに設定します。
  Declare Constructor ( ByVal _Col_ As UInteger = RGB(255, 255, 255) )
  Declare Destructor ()
End Type

  '' 私たちの字体のバッファを作成します。
Constructor Font ( ByVal _Col_ As UInteger = RGB(255, 255, 255) )
  This.Make ( _Col_ )
End Constructor

  '' 字体バッファを破壊します。
Destructor Font ()
  ImageDestroy( Buf )
End Destructor

  '' 字体バッファの中に、FBgfx 字体を割り当てます。
Sub Font.Make ( ByVal _Col_ As UInteger = RGB(255, 255, 255) )
    '' イメージ・バッファ・データがありません。   イメージ・バッファデータを作成します。
  If This.Buf = 0 Then

      '' まだ、画面は作成されていません。
    If ScreenPtr = 0 Then Exit Sub

      '' 256 の文字、8 の幅を、サポートします。
      '' 字体ヘッダーのために特別の列を加えます。
    This.Buf = ImageCreate ( 256 * 8, 9 )

      '' 字体ヘッダーのアドレスを取得します。
      '' これは、画素のアドレスを得るのと同じです。
      '' いつも ubyte を使うところだけが違います。
    This.Hdr = Cast(UByte Ptr, This.Buf) + SizeOf (FB.Image)

      '' ヘッダー情報を割り当てます。
    This.Hdr[0] = 0
      '' 最初にサポートされた文字。
    This.Hdr[1] = 0
      '' 最後にサポートされた文字。
    This.Hdr[2] = 255
  Else
    If This.Col = _Col_ Then Exit Sub

  End If

    '' 私たちの字体を描きます。
  For DoVar As Integer = 0 To 255
      '' 字体幅の情報を設定します。
    This.Hdr[3 + DoVar] = 8

    Draw String This.Buf, (DoVar * 8, 1), Chr(DoVar), _Col_
  Next

    '' 私たちのフォントの色を覚えてください。
  This.Col = _Col_
End Sub

  '' 私たちの字体のためのバッファを、手に入れます。
  '' 色が異なるなら、字体を作り替えます。
Function Font.myFont( ByVal _Col_ As UInteger = RGB(255, 255, 255) ) As FB.Image Ptr
    '' 色が合っていれば、現在のバッファを、ただ返します。
  If _Col_ = Col Then
    Return Buf
  End If

    '' 新色で字体を作ります。
  This.Make ( _Col_ )
    '' バッファを戻します。
  Return This.Buf
End Function


  '' ここが、コードの主な部分です!
ScreenRes 640, 480, 32

  '' 私たちの字体を作成します。
Dim As Font myFont = RGB (255, 255, 255)

  '' カスタム字体をって、文字列を描きます。
Draw String (0,0), "Hello.   I am the custom font.",, myFont.myFont ()
  '' Gasp.  はっと息をのむ新色!
Draw String (0,8), "Hello.   I am the custom font.",, myFont.myFont (RGB(255, 0, 0))
Sleep

  '' 速度のテストです。
  '' これが全く遅いことがわかります。

Scope
  Randomize Timer
    '' 私たちのタイマ。
  Dim As Double T = Timer

    '' この方法で、新しい字体を作るためにかかる時間。
  For DoVar As Integer = 0 To 499
    myFont.Make ( RGB(Rnd * 255, Rnd * 255, Rnd * 255) )
  Next

    '' そして、全て行われました。   重要なデータを表示します。
  Locate 3, 1
  Print "Time to Re-Draw font 499 times: " & ( Timer - T )
  Print "Time per Re-Draw: " & ( Timer - T ) / 500
  Sleep
End Scope


参照:カスタム字体を作成して、使う


ScrPtr 対 ImgBuf

画像バッファ画素で描く方法と、画面のバッファで描く方法の、比較:
(ScrPtrVsImgBuf.bas)↓渡辺注:動きます。
#include "fbgfx.bi"

ScreenRes 640, 480, 32

  '' 私たちの画面のサイズのバッファを作成します。
Dim As FB.IMAGE Ptr myBuf = ImageCreate ( 640, 480 )

  '' 私たちの画面のバッファのアドレスを取得します。
Dim As uLong Ptr myScrPix = ScreenPtr

  '' 私たちの画素のバッファのアドレスを取得します。
Dim As uLong Ptr myBufPix = Cast ( uLong Ptr, Cast( UByte Ptr, myBuf ) + SizeOf(FB.IMAGE) )

  '' 私たちのページをロックします。   ページ全体を、白で満たします。

ScreenLock

  '' もう一つの方法として、画面解像度が未知なら、
  '' これをもっと安全にするために、ScreenInfo を使います。
 
  '' 注意:
  '' このコードは、列の間の水増しを仮定しません。
  '' これを防ぐために、

  '' 画面のピッチを取得するために ScreenInfo を使って、
  '' 代わりに、それを使って列オフセットを計算する必要があります。
  For xVar As Integer = 0 To 639
    For yVar As Integer = 0 To 479
      myScrPix[ ( yVar * 640 ) + xVar ] = RGB (255, 255, 255)
    Next
  Next

ScreenUnlock
Sleep


  '' イメージ・バッファの全てに、赤を書きます。
For xVar As Integer = 0 To myBuf->Width - 1
  For yVar As Integer = 0 To myBuf->Height - 1
    myBufPix[ ( yVar * (myBuf->Pitch \ SizeOf(*myBufPix)) ) + xVar ] = RGB (255, 0, 0)
  Next
Next

  '' 赤くしたバッファを、画面に置きます。
Put (0,0), myBuf, PSet
Sleep


/'
  ScreenPtr:
    1) 画面バッファのアドレスを取得します。
       (FBgfx が、自動的にはじき出す、ダミーのバッファを使うことを、覚えてください。)
    2) ページをロックします。
    3) 画面アドレスに描きます。
    4) バッファを表示するために、ページのロックを外します。


  画像バッファ:
    1) 画像バッファを作成します。
    2) 画像の画素のアドレスを取得します。
    3) 画像の画素に描きます。
       (あなたは、ここであなたを助けるために、
       バッファ情報のようにきちんとしたものを使用できます。)
    4) あなたが好きな画像を書き留めます。
       (もう一つの大きいプラス!)


  描画に関して:

    Cast(UByte Ptr, mybuff) + Y * Pitch + X * Bpp

    全ての Y が、PITCH 数を、バイトで含んでいます。
    あなたの新しい Y に達するために、
    1列全体をスキップしなければなりません。

    ポインターのデータ型が、1バイト長でない場合にも、
    安全にポインター演算をする必要があります。
    それで、あなたは、あなたのビット深さに適合するポインター型を使うことが、
    より簡単であることがわかるでしょう。
    この場合は、あなたは、ポインター型のサイズで、ピッチと BPP を割るべきです。

    都合の良いことに、この場合、ピッチは、画素の型サイズで、常に割り切れます。
    そして、明らかに、BPPも、そうなります。ただ 1 に取り消します。 :D

'/


いっしょに学ぼう に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2021-03-11 01:23:36
日本語翻訳:WATANABE Makoto、原文著作者:TheAdventMaster

ホームページのトップに戻る

表示-非営利-継承