GetGlyphOutline関数等について
Posted: 2010年7月06日(火) 16:22
最近質問が多くてすみません。
下記URLの高速なフォント描画について、お聞きしたことがあります。
http://www3.pf-x.net/~chopper/home2/DirectX/CDX30.html
【質問①】
このページのソースにある、ポリゴンの頂点をセットするSetPorigon関数についてです。
この関数には頂点構造体(p)、x1(左上頂点x),y1(左上頂点y),x2(テクスチャの横幅),y2(テクスチャの縦幅)を
渡して、座標をセットしているようなのですが、
左上頂点以外の頂点で-1されている部分があります。
なぜ-1しなければならないのか、理由が分からないのでご教授願います。。
void setPorigon(PTRIANGLE p,float x1,float y1,float x2,float y2)
{
p[0].x = x1;
p[0].y = y1;
p[0].z = 0.0f;
p[0].rhw = 1.0f;
p[0].color = D3DCOLOR_XRGB(255,255,255);
p[0].tu = 0.0f;
p[0].tv = 0.0f;
p[1].x = x1 + x2 - 1;
p[1].y = y1;
p[1].z = 0.0f;
p[1].rhw = 1.0f;
p[1].color = D3DCOLOR_XRGB(255,255,255);
p[1].tu = 1.0f;
p[1].tv = 0.0f;
p[2].x = x1 + x2 - 1;
p[2].y = y1 + y2 - 1;
p[2].z = 0.0f;
p[2].rhw = 1.0f;
p[2].color = D3DCOLOR_XRGB(255,255,255);
p[2].tu = 1.0f;
p[2].tv = 1.0f;
p[3].x = x1;
p[3].y = y1 + y2 - 1;
p[3].z = 0.0f;
p[3].rhw = 1.0f;
p[3].color = D3DCOLOR_XRGB(255,255,255);
p[3].tu = 0.0f;
p[3].tv = 1.0f;
}
【質問②】
二つ目はGetGlyphOutline関数によって、確保される配列についてです。
このページのソースにもありますが、下記のように実行するとpfontbitmapのアドレスに指定した文字の
ビットマップデータが格納されますが、このバイト型の配列のどのような並びでビットマップデータが
入っているのかがイメージできません。
*pfontbitmap = new BYTE[fontsize];
GetGlyphOutline(hdc,fontcode,GGO_GRAY4_BITMAP,pgm,fontsize,*pfontbitmap,&mat))
このデータをその後下記のように読み込んで、動的テクスチャにピクセルデータを書き込んでいっているのですが、先ほど確保した配列を読み込む部分だけ意味が良く分かりません。(下記赤字部分のみ)
どのようにビットマップデータが格納されているのかが分かっていれば、イメージができるようになり、
自分で考えてコードが組めるようになるのですが、このままではコピるしかありません。
どなたか、この確保した配列にどのようにビットマップデータが格納されているのかが分かる方、
具体的に説明していただけますでしょうか?
よろしくお願い致します。
一応このページの全ソースコードを添付しておきます。
//フォントの書き出しの一番左X座標
int offsetx = pgm->gmptGlyphOrigin.x;
//フォントの書き出しの一番左Y座標
int offsety = ptm->tmAscent - pgm->gmptGlyphOrigin.y;
//フォントビットマップの横幅を調べる
int bitmap_width = pgm->gmBlackBoxX + (4-(pgm->gmBlackBoxX%4)%4);
//フォントビットマップの縦幅を調べる
int bitmap_height = pgm->gmBlackBoxY;
//フォントレベル
int fontlevel = 17;
BYTE *pPixel;
//テクスチャサーフェイスを初期化する
FillMemory(rc.pBits , rc.Pitch * ptm->tmHeight, 0);
//フォントビットマップをテクスチャに書き込む
for (int y = offsety; y < offsety + bitmap_height; y++)
{
for (int x = offsetx; x < offsetx + bitmap_width; x++)
{
DWORD a = 255 * (*pfontbitmap)[x - offsetx + bitmap_width * (y - offsety)] / (fontlevel-1);
//フォントの色を決める
DWORD fontcolor = 0x00FFFFFF | (a<<24);
//現在のピクセル位置の計算
pPixel = ((BYTE*)rc.pBits) + (x * 4) + (y * rc.Pitch);
//フォントビットマップの書き込み
memcpy(pPixel, &fontcolor, sizeof(DWORD));
}
}
//テクスチャのアンロック
g_ptexture9->UnlockRect(0);
return S_OK;
下記URLの高速なフォント描画について、お聞きしたことがあります。
http://www3.pf-x.net/~chopper/home2/DirectX/CDX30.html
【質問①】
このページのソースにある、ポリゴンの頂点をセットするSetPorigon関数についてです。
この関数には頂点構造体(p)、x1(左上頂点x),y1(左上頂点y),x2(テクスチャの横幅),y2(テクスチャの縦幅)を
渡して、座標をセットしているようなのですが、
左上頂点以外の頂点で-1されている部分があります。
なぜ-1しなければならないのか、理由が分からないのでご教授願います。。
void setPorigon(PTRIANGLE p,float x1,float y1,float x2,float y2)
{
p[0].x = x1;
p[0].y = y1;
p[0].z = 0.0f;
p[0].rhw = 1.0f;
p[0].color = D3DCOLOR_XRGB(255,255,255);
p[0].tu = 0.0f;
p[0].tv = 0.0f;
p[1].x = x1 + x2 - 1;
p[1].y = y1;
p[1].z = 0.0f;
p[1].rhw = 1.0f;
p[1].color = D3DCOLOR_XRGB(255,255,255);
p[1].tu = 1.0f;
p[1].tv = 0.0f;
p[2].x = x1 + x2 - 1;
p[2].y = y1 + y2 - 1;
p[2].z = 0.0f;
p[2].rhw = 1.0f;
p[2].color = D3DCOLOR_XRGB(255,255,255);
p[2].tu = 1.0f;
p[2].tv = 1.0f;
p[3].x = x1;
p[3].y = y1 + y2 - 1;
p[3].z = 0.0f;
p[3].rhw = 1.0f;
p[3].color = D3DCOLOR_XRGB(255,255,255);
p[3].tu = 0.0f;
p[3].tv = 1.0f;
}
【質問②】
二つ目はGetGlyphOutline関数によって、確保される配列についてです。
このページのソースにもありますが、下記のように実行するとpfontbitmapのアドレスに指定した文字の
ビットマップデータが格納されますが、このバイト型の配列のどのような並びでビットマップデータが
入っているのかがイメージできません。
*pfontbitmap = new BYTE[fontsize];
GetGlyphOutline(hdc,fontcode,GGO_GRAY4_BITMAP,pgm,fontsize,*pfontbitmap,&mat))
このデータをその後下記のように読み込んで、動的テクスチャにピクセルデータを書き込んでいっているのですが、先ほど確保した配列を読み込む部分だけ意味が良く分かりません。(下記赤字部分のみ)
どのようにビットマップデータが格納されているのかが分かっていれば、イメージができるようになり、
自分で考えてコードが組めるようになるのですが、このままではコピるしかありません。
どなたか、この確保した配列にどのようにビットマップデータが格納されているのかが分かる方、
具体的に説明していただけますでしょうか?
よろしくお願い致します。
一応このページの全ソースコードを添付しておきます。
//フォントの書き出しの一番左X座標
int offsetx = pgm->gmptGlyphOrigin.x;
//フォントの書き出しの一番左Y座標
int offsety = ptm->tmAscent - pgm->gmptGlyphOrigin.y;
//フォントビットマップの横幅を調べる
int bitmap_width = pgm->gmBlackBoxX + (4-(pgm->gmBlackBoxX%4)%4);
//フォントビットマップの縦幅を調べる
int bitmap_height = pgm->gmBlackBoxY;
//フォントレベル
int fontlevel = 17;
BYTE *pPixel;
//テクスチャサーフェイスを初期化する
FillMemory(rc.pBits , rc.Pitch * ptm->tmHeight, 0);
//フォントビットマップをテクスチャに書き込む
for (int y = offsety; y < offsety + bitmap_height; y++)
{
for (int x = offsetx; x < offsetx + bitmap_width; x++)
{
DWORD a = 255 * (*pfontbitmap)[x - offsetx + bitmap_width * (y - offsety)] / (fontlevel-1);
//フォントの色を決める
DWORD fontcolor = 0x00FFFFFF | (a<<24);
//現在のピクセル位置の計算
pPixel = ((BYTE*)rc.pBits) + (x * 4) + (y * rc.Pitch);
//フォントビットマップの書き込み
memcpy(pPixel, &fontcolor, sizeof(DWORD));
}
}
//テクスチャのアンロック
g_ptexture9->UnlockRect(0);
return S_OK;