トップページ > 過去ログ > 記事閲覧
DrawStringToHandle()で拡大縮小率の指定
名前:「たく」 日時: 2007/04/24 17:04

たびたびお世話になります、「たく」です。 CreateFontToHandle() で作ったフォントの イメージを DrawStringToHandle() で表示 する時に、表示するフォントを拡大したり 縮小したりして表示させる事は可能でしょ うか。フォントハンドルを大量に作らずに、 VRAM に転送する際に DrawExtendGraph() のように拡大率を指定する事で転送サイズ を変更させたいのです。 フォントの拡大縮小はエフェクトとして 使うので、多少文字が汚くなったりつぶれ たりしても問題ありません。 変更するのは単純にフォントのサイズだけ で、太さや縁の設定を変更する必要は ありません。 フォントサイズを全パターンでバッファに 取るとメモリを異常に食うので、できる だけ回避したいなぁ、と思いまして・・・ 以上の通りです。まずは質問まで。 よろしくお願いします。

Page: 1 |

Re: DrawStringToHandle()で拡大縮小率の指定 ( No.1 )
名前:管理人 日時:2007/04/26 19:37

 「たく」さんどうも、DXライブラリの管理人です。  非公開関数ですが、現在最新のバージョンでは既に文字列を拡大して描画する 関数があります。 int DrawExtendString( int x, int y, double ExRateX, double ExRateY, const char *String, int Color ); int DrawExtendStringToHandle( int x, int y, double ExRateX, double ExRateY, const char *String, int Color, int FontHandle ); int DrawExtendFormatString( int x, int y, double ExRateX, double ExRateY, int Color, const char *FormatString, ... ); int DrawExtendFormatStringToHandle( int x, int y, double ExRateX, double ExRateY, int Color, int FontHandle, const char *FormatString, ... );  基本的に既に存在する等倍描画関数の関数名に Extend が付いて、引数に ExRateX, ExRateY が追加されただけのものです。(1.0 で等倍、2.0 で2倍という感じです)  宜しければお使い下さい。m(_ _)m
Re: DrawStringToHandle()で拡大縮小率の指定 ( No.2 )
名前:「たく」 日時:2007/05/02 09:33

ありがとうございます。 なんか、もっと色々とかゆい所に 手が届きそうなコマンドがありそう ですね。時間作って一度ヘッダを じっくり見てみたいと思います。
Re: DrawStringToHandle()で拡大縮小率の指定 ( No.3 )
名前:「たく」 日時:2007/05/25 22:08

蒸し返す話・・・とはちょっと違いますが。 ウィンドウモードとフルスクリーンモードで CreateFontToHandle()で展開したフォントの 描画速度が極端に違ってくるのは何か理由が あるのでしょうか。 現在、同一のプログラムでシームレスにフル スクリーンモードとウィンドウモードを 切り替えられるようなプログラムを作って いるのですが、フルスクリーンモードでは 1インター1msec 以下で済む処理が、ウィンドウ モードの場合10msecを超過して時々処理落ちが 発生します。特に、画面上にフォント文字列が 複数個表示されると症状が顕著になります。 毎インターフォントを描画しています。 また、フォントに限らず普通のグラフィック 命令も、ウィンドウモードでは全体的にもた つきを感じますが、この辺はビデオカードの 性能にも左右されるものでしょうか。 漠然とした質問で恐縮ですが、よろしくお願い します。ちなみに画面の更新は、フリップでは なくコピーを使っています。
Re: DrawStringToHandle()で拡大縮小率の指定 ( No.4 )
名前:管理人 日時:2007/05/26 12:32

「たく」さんどうも、DXライブラリの管理人です。 基本的にウインドウモードではフルスクリーンモードに比べて 画面処理速度は低くなりますが(他のウインドウとの兼ね合いがあるので)、 フルスクリーンモードで1msecで終わる処理がウインドウモードでは10msecというのは ちょっと差がありすぎますね・・・ ChangeWindowMode 関数を使用すると画面処理関係の設定がすべて リセットされてしまうので SetDrawScreen( DX_SCREEN_BACK );として 再度裏画面へ描画するように指定しなおす必要があるのですが、それはされて いますでしょうか?
Re: DrawStringToHandle()で拡大縮小率の指定 ( No.5 )
名前:「たく」 日時:2007/06/01 15:56

こんにちは。お返事ありがとうございます。 ちょっと長くなりますが、アプリケーション 実行中の初期化ルーチンを記載します。 ソースの終わりの方で、SetDrawScreen ( DX_SCREEN_BACK ); を実行しています。 void fWindowInit() {  int i,j,k,iWS ;  iWS = g.SysInt[eWINDOW_STATUS] ;   // ウィンドウステータスの値  if ((iWS & 0x0001) == 0) i = TRUE ; else i = FALSE ;   // ウィンドウモード(b0)  ChangeWindowMode(i) ;   // i=0 ウィンドウ i=1 フルスクリーン  if (i==0) {   // ウィンドウモード   GetScreenState(&i,&i,&j) ;   // 現在の画面の横、縦、色深度を取得  } else {    // フルスクリーンモード   j = (2+(iWS & 0x0002))<<3 ;  // 画面ビット深度取得(b1)   i = SetGraphMode(800,600,j,60) ;  // 画面サイズ 800x600x16/32/FPS 指定?   SetDisplayRefreshRate(60) ;  // フルスクリーン時の画面のリフレッシュレートを変更する(Windows2000以降のみ有効)  }  if (j == 16) {   // 色深度 16 ビットの場合   if ((iWS & 0x0004)==0) {   // 減色処理の必用が無い場合(b2)    i = DX_SHAVEDMODE_NONE ;   // 16bit 画像時の減色処理を行わない   } else {    if ((iWS & 0x0008)==0) {   // 減色処理を行う場合(b3)     i = DX_SHAVEDMODE_DITHER ;  // 16bit 画像時の減色処理(ディザ)    } else {     i = DX_SHAVEDMODE_DIFFUS ;  // 16bit 画像時の減色処理(誤差拡散)    }   }  } else {   i = DX_SHAVEDMODE_NONE ;   // 32bit 画像時の減色処理を行わない  }  SetGraphDataShavedMode(i) ;    if ((iWS & 0x0040)==0) {   // 拡大画像の描画モード(b6)   i = DX_DRAWMODE_BILINEAR ; // バイリニア法(スムーズ)  } else {   i = DX_DRAWMODE_NEAREST ; // ニアレストネイバー法(かっきり)  }  SetDrawMode(i) ;    i = (iWS & 0x0030)>> 4 ;  // フレームスキップに関する設定(b4,b5)  if (i==3) {         // NOWAIT の場合   g.SysInt[eFRAME_SKIP] = 0 ; // フレームのスキップ値 (1)   i = FALSE ;// VSync の復帰を待たない  } else {   g.SysInt[eFRAME_SKIP] = i ;  // フレームのスキップ値 (1〜3)   i = TRUE ;          // VSync の復帰を待つ  }  SetWaitVSyncFlag(i) ;     // VSync 処理設定  g.SysInt[eFRAME_CNT] = 0 ;  // フレームスキップのカウント値をクリア    if ((iWS & 0x0080)==0) {  // デフォルトの大画像の扱い(b7)   i = TRUE ;   // 画像分割をして容量を稼ぐ  } else {   i = FALSE ;  // 画像分割をせず速度を稼ぐ  }  SetUseDivGraphFlag(i) ;    if ((iWS & 0x0100)==0) {   // ハードウェア3D機能の使用(b8)   i = TRUE ;         // 通常は使う   j = TRUE ;   k = TRUE ;  } else {   // 使わない場合   if ((iWS & 0x0200)==0) {  // 画像データの置き場所(b9)    j = TRUE ;  // VRAM   } else {    j = FALSE ;  // メインメモリ   }   if ((iWS & 0x0800)==0) {  // ソフトウェアブレンドの簡易化(b11)    k = FALSE ; // 簡易化しない   } else {    k = TRUE ;  // 簡易化する   }   i = FALSE ;  }  SetUse3DFlag(i) ;   // ハードウェア3D機能の使用  SetUseVramFlag(j) ;  // ソフトウェア処理時の画像の置き場所  SetBasicBlendFlag(k) ;  // ソフトウェアブレンドの簡易化    if ((iWS & 0x0001) == 0) {   // ウィンドウモードで起動中   SetWindowSizeExtendRate((double)((800L+(double)(g.SysInt[eWINDOW_SCALE]))/800L)) ;  // Windowモード時の画面拡大量  }    SetTransColor(0,255,0) ;  // 透過色の設定(R0 G255 B0)  SetAlwaysRunFlag(TRUE) ;  // ウィンドウが非アクティブでも処理を継続  SetDrawScreen( DX_SCREEN_BACK ) ;  // グラフィックの描画先を裏画面にセット  ScreenFlip() ;       // 画面が1回更新されるまで待つ    // フォントの設定  g.FNTHnd[0] = CreateFontToHandle(NULL,16,3,DX_FONTTYPE_ANTIALIASING_EDGE) ;  g.FNTHnd[1] = CreateFontToHandle(NULL,12,2,DX_FONTTYPE_ANTIALIASING_EDGE) ;  g.FNTHnd[2] = CreateFontToHandle(NULL,24,6,DX_FONTTYPE_ANTIALIASING_EDGE) ;  g.FNTHnd[3] = CreateFontToHandle(NULL,32,7,DX_FONTTYPE_ANTIALIASING_EDGE) ;    SetFontSpaceToHandle(-2,g.FNTHnd[0]) ;  // フォントの文字間隔調整  SetFontSpaceToHandle(-1,g.FNTHnd[1]) ;  SetFontSpaceToHandle(-3,g.FNTHnd[2]) ;  SetFontSpaceToHandle(-4,g.FNTHnd[3]) ;    for (i=0 ; i<4 ; i++) {   GetFontStateToHandle(NULL, &g.SysInt[eFONTSIZE_0 + i], NULL , g.FNTHnd[i]) ; // フォントの縦サイズをメモリに保存  }    ChangeFont("MS 明朝") ; // フォント名指定  ChangeFontType(DX_FONTTYPE_ANTIALIASING_EDGE) ; // フォントエッジタイプ  SetFontSize(40) ; // フォントサイズ  SetFontThickness(7) ; // フォントの太さ } こんな資料ですが、なにかわかることはござい ますでしょうか。よろしくお願いします。
Re: DrawStringToHandle()で拡大縮小率の指定 ( No.6 )
名前:管理人 日時:2007/06/02 18:12

「たく」さんどうも、DXライブラリの管理人です。  お書き込み頂いたプログラムの中では、直接描画速度に影響しそうなのは SetUse3DFlag 関数です。こちらの関数に渡す引数を常に TRUE にしてみても 処理速度は遅いままでしょうか?  あと、複数のモニタをお使いの場合、使用形態によってはウインドウモード時に ハードウエア機能が使用できなくなり、描画処理が非常に遅くなります。 (独立した2つの画面として扱うモードがこれに該当します。 (2つのモニタを横解像度や縦解像度が大きい単一の画面として扱うモードでは ハードウエア機能が使用できなくなるということはありません))

Page: 1 |