問題タブ [directwrite]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
direct2d - DirectWriteテキストオブジェクトの1つを変換し、他のオブジェクトは変更しないようにする方法
同じレンダーターゲットに複数のDirectWriteテキストオブジェクトがあり、そのうちの1つを一度に変換し、他のオブジェクトは変更しないようにしたい。Direct2Dには、いくつかのタイプの変換があります。
- ターゲット変換をレンダリングする
- ジオメトリ変換
- ブラシ変換
レンダリングターゲット変換は、その上のすべてのオブジェクトに影響するため、使用できません
テキストはジオメトリではなく、IDWriteTextLayoutの変換メソッドがないため、ジオメトリ変換を使用できません。
したがって、私にとっての唯一の選択肢はブラシ変換ですが、ソリッドブラシを使用して変換された長方形を描画しようとすると、元の場所に描画されます(以下のコードを参照)。sdkデモはビットマップブラシ変換の例を示しています。だから私の質問は:変換は他のタイプのブラシでも機能しますか?しっかりしたブラシのように?
これが私のコードです。まず、経過時間に基づいて変換マトリックスを計算し、次にこのマトリックスを使用してブラシを変換し、最後に長方形を描画します。見て、これが事実かどうか、または他の方法でそれを行うことができるかどうかを教えてください。
directwrite - IDWriteTextFormat::SetTextAlignment が DWRITE_TEXT_ALIGNMENT_JUSTIFIED に対して機能しない
IDWriteTextFormat::SetTextAlignment は、DirectWrite でテキストを配置するために使用されました。DWRITE_TEXT_ALIGNMENT 型のパラメーターを取ります。
最初の 3 つのタイプはすべて正常に機能しますが、最後の DWRITE_TEXT_ALIGNMENT_JUSTIFIED は機能しません。設定しようとすると、無効な引数エラーが発生しました
これは有効な議論ではないようですが、なぜですか? 誰かが同じ問題に遭遇しましたか?
c++ - マルチスレッドの DirectX コードで SEHException が発生する理由は何ですか?
テキスト レンダリングにDirectWriteを使用する、かなり大規模で複雑なコードベースを扱っています。関係あるかどうかはわかりませんが、これは WinRT (Windows ストア) アプリケーションです。
アプリはマルチスレッドであり、一部の DirectX 呼び出しはバックグラウンド (UI ではない) スレッドから実行されます。すべてのBeginDrawおよびEndDraw呼び出しはUI スレッドから行われ、一部のDrawText呼び出しはバックグラウンドスレッドから行われます。これらの呼び出しが重複しないようにし、DrawText は BeginDraw と EndDraw のペアの間でのみ呼び出されるようにしました。
ただし、DrawText メソッドを呼び出すと、 SEHExceptionが発生することがあります。UI スレッドから呼び出された場合は発生せず、バックグラウンドスレッドから呼び出された場合のみ発生します。
これは、すべてのコンピューターで発生するわけではありません。一部のデバイスでは頻繁に発生し、他のデバイスではまったく再現できません。
VS Debugger が言う正確なメッセージは次のとおりです。 DrawText 呼び出しで d2d1.h ヘッダー ファイルが壊れます。
SEHException がスローされたときに問題をデバッグまたは診断する方法はありますか? (これは、バックグラウンド スレッドから DrawText 関数を呼び出すことに明らかに関連しています。)
また、バックグラウンド スレッドから DirectX 関数を呼び出す一般的な規則はありますか? (D2D1Factory が D2D1_FACTORY_TYPE_MULTI_THREADED オプションで作成されることを確認しました。)
direct2d - Direct2D/DirectWriteを使用してテキスト境界ボックスを決定する
ID2D1RenderTarget::DrawGlyphRun
次のパラメータを取ります:
DWRITE_GLYPH_RUNは
出力グリフを含む最小のrectを見つけようとしています。
これは私が持っているすべてのデータです。私は1つのポイントを持っていることに注意してください。これは、を使用して、およびからbaselineOrigin
幅を計算できる可能性があります。問題は、高さをどのように決定するかです。glyphAdvances
glyphOffsets
DWRITE_GLYPH_RUN
ありがとう。
c++ - DirectWriteを使用してベースライン位置を決定する方法
DirectWriteとDirect2D1を使用して、IllustratorCS6がエリアテキストボックスに対して行うレンダリングを模倣しようとしています。CS6には、フォントの「emボックスサイズ」に等しい領域テキストボックスの上部からベースラインを配置できるオプションがあります。たとえば、Trajan Proフォント、100ポイントのポイントサイズを使用すると、ベースラインはエリアテキストボックスの上部から87.5ポイントになります。
IDWriteFontFaceオブジェクトから、ascent、descent、designUnitsPerEm値などを取得できます。
欠落しているように見えるのは、emボックスの上部を基準にしたベースラインの位置です。
emボックスの上部を基準にしたデザインユニットのベースライン位置を取得する方法はありますか?
DWRITE_FONT_METRICSにはありません。DWRITE_LINE_METRICSを確認しましたが、ベースライン値がascent + lineGapであり、一致していません。
windows-8 - ID2D1RenderTarget::DrawText を使用するときにテキスト範囲を取得する方法
Direct2D では、ID2D1RenderTarget::DrawText を使用してテキストを描画できますが、描画する前にテキストの範囲を取得するにはどうすればよいですか? Windows 8 RTでこれを行いたいことに注意してください。
ありがとう
c++ - C++ を使用して IE 9 でテキストをキャプチャする
IE 9 からテキストをキャプチャする必要があります (完全な HTML ドキュメントではなく、現在表示されているテキストが望ましい)。以前のバージョンの IE は TextOut を使用しており、API モニターを使用してテキストをはっきりと見ることができます。IE 9 は Direct2D/DirectWrite を使用してテキストをレンダリングするため、テキストは表示されません。DWrite.dll にフックし、CreateTextLayout を介してテキストを取得できるという提案がありますが、これは決して呼び出されません。このレンダリング段階の前に、おそらく MSHTML.dll でテキストを傍受する必要があると思います。
テキストを取得するための助けをいただければ幸いです。
よろしくお願いします。
c++ - クラス メンバーでのメモリ リーク
これには別の質問が必要だとは思わないので、この非常に関連性の高い質問を編集しています。
char* から wchar_t* に変換してテキストを描画するコードがありましたが、プログラム メモリが異常なペース (数分で 5,000 K から 1,500,000 に) 増加するため、メモリ エラーが疑われました。
私は mbstowcs() を疑っていましたが、今では問題を発見したと思います。
私は一般的に物事を描くために色を取得するかなり悪い方法を使用しています。
メモリ使用量の増加は、ほぼ確実にこの機能によるものです。このようなカスタム色を返すより良い方法はありますか?
c++ - アクセス違反DirectWrite
DirectWrite APIを使用しており、独自のレイアウトおよびテキストレンダリングエンジンを実装しています。私はすでにIDWriteTextLayout
オブジェクトを正常に作成しました。次の電話をかけると、アクセス違反エラーが発生し、理由がわかりません。
qt - 異なる Windows バージョンで qt で -directwrite を使用する
良い一日!
-directwrite でコンパイルされた Qt 4.8.4 を使用しています。Windows Vista SP2 以降でのみ動作する DWrite.dll が必要で、プログラムは Windows XP では実行できません。
この問題を解決するにはどうすればよいですか?
Qt をコンパイルして、Windows 7 では DWrite.dll が必要で、Windows XP では不要になるようにできますか? 他の方法はありますか?Windows のバージョンごとに異なるディストリビューションを作成する必要がありますか?
ありがとうございました。