曲名に含まれる空白文字がタイトル表示に反映されない
フォントビットマップクラスの不具合。
MTFont2Bmp::_WriteGlyphToBmpBuf()において、 1文字ずつ個別に作成したビットマップを1行の文字列としてメモリ上に並べるとき、 空文字の書き込み処理をスキップしていたが、次の文字の書き込み位置の更新もスキップしていた。 このため空白文字が描画に反映されなかった。
空白文字が現れたときは、次の文字の書き込み位置を更新してから描画処理をスキップする。
修正前 //空文字はスキップ if (itr->pBmp == NULL) continue; 修正後 //空文字はスキップ if (itr->pBmp == NULL) { offsetX += (itr->glyphMetric.gmCellIncX); continue; }
本件の対策中に「曲名が長すぎると文字列のビットマップがテクスチャ画像の最大サイズを超えてしまう可能性がある」ことを発見した。 一般的なテクスチャ画像の最大サイズは2048のため、ビットマップを作成できてもテクスチャの作成でエラーが発生する可能性がある。 最近のビデオカードでは大抵2048以上のテクスチャをサポートしているはずであるが、それでも何らかの限界値があることに変わりはない。
念のため、文字列のビットマップ作成処理では、横幅2048以上は切り落とすことにする。
#本来は別のチケットで対応するべき
MTFont2Bmp::_CreateBmpBuf() 追加 //テクスチャとして許容される一般的なサイズを超える場合はクリップする if (m_BmpWidth > MTFONT2BMP_MAX_BMP_WIDTH) { m_BmpWidth = MTFONT2BMP_MAX_BMP_WIDTH; } MTFont2Bmp::_WriteGlyphToBmpBuf() 追加 //コピー先の領域外になる場合はスキップする destX = offsetX + (itr->glyphMetric.gmptGlyphOrigin.x) + x; if (destX >= (m_BmpWidth-1)) continue;
MIDIファイルに格納されている曲名の文字列に空白文字が含まれている場合、 画面上部に表示するタイトルに反映されない。 例えば曲名が「Foo Bar 123」であると、タイトルは「FooBar123」と表示される。