syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

プログラミングTips

Win32/MFCとWinForms/WPF相互運用

(これは2012-06-14に書いた故OCNブログの記事を移植したものです)以前からWin32/MFCとWPFの相互運用性(主にWPF 3.5 *1)に関して独自調査を続けているんですが、メッセージまわりでやはり問題がいくつか発生することが判明してきています。基本的にはWin3…

ダウンキャストに潜む罠

(これは2012-05-18に書いた故OCNブログの記事を移植したものです)C++のダウンキャスト(特に多重継承した場合)にまつわるお話です。例えばこんな感じ。 #include <cstdio> #include <conio.h> class Base1 { protected: virtual ~Base1() { puts(__FUNCSIG__); } }; class </conio.h></cstdio>…

C関数のis*系ルーチンの注意点

(これは2012-06-03に書いた故OCNブログの記事を移植したものです)C言語の <ctype.h> もしくはC++の <cctype> におけるisdigit(), isalpha(), isalnum(), isupper(), islower(), isspace(), ...とかの話です。もともとこいつらは引数の型がcharではなくintになっているんです</cctype></ctype.h>…

WPFレイヤードウィンドウのヒットテストを無効化

(これは2012-08-24に書いた故OCNブログの記事を移植したものです)WPFでレイヤード ウィンドウを作る場合、 WindowStyle="None" Background="Transparent" AllowsTransparency="True" のように設定するだけで簡単に実現できます。ピクセル単位のアルファ透…

AFX_EXT_API/AFX_EXT_DATA/AFX_EXT_CLASSの罠

(これは2012-06-05に書いた故OCNブログの記事を移植したものです)Visual C++のMFC拡張DLLを使って名前空間レベルのグローバル関数・グローバル変数やクラスそのものをエクスポートするとき、 extern AFX_EXT_API void MyGlobalFunc(); extern AFX_EXT_DATA…

XAMLルート要素のプロパティのローカライズ

(これは2012-06-19に書いた故OCNブログの記事を移植したものです)コレ、結構悩んだんですが、WPFにおいてWindowとかUserControlとかPageとかのルート要素のフォントなどをローカライズするためにリソース文字列を指定するには、(Attribute Syntaxは使わず…

不定値IND・非数NaNと浮動小数点演算速度

コードの単体パフォーマンステストをやっていて興味深い現象に遭遇しました。 演算途中で発生した不定値 IND (indeterminate value, -1.#IND) や、非数 NaN (not a number, 1.#QNAN) をそのまま計算に使い続けると、環境によっては正常値で演算する場合と比…

同次変換行列

(これは2012-08-04に書いた故OCNブログの記事を移植したものです)MSDNにあるDirect2Dの付録ページに書いてある、2次元の回転の3x3同次変換行列の数式が2012年8月現時点で間違っているので、とりあえず正しいものをC言語構造体っぽい形式で書いておきます。…

C++コンストラクタの初期化子リスト

(これは2010-09-24に書いた故OCNブログの記事を移植したものです)ちょっとしたマイナーテクですが、クラスのメンバー変数をコンストラクタでゼロクリアする際、下記のように書けます。 class SomeClass { struct Vector3 { float x, y, z; }; int m_intVal…

メンバー変数命名規則

(これは2010-10-20に書いた故OCNブログの記事を移植したものです)自分はC++の場合、classメンバー変数の命名規則として、ずっと "m_" プレフィックスを付けるようにしています。 ただし、すべてのメンバーを外部公開するstructメンバー変数(ここでいうstr…

Android SDKエミュレータでOpenGL ES 2.0

(これは2013-06-01に書いた故OCNブログの記事を移植したものです)仕事で少しだけ Android(主に OpenGL まわり)に携わることになったんですが、OpenGL ES 2.0 開発環境を構築するのに少々手間取ったのでメモを残しておきます。最終的には PC 上で OpenGL …

Windows言語設定の取得API

(これは2013-05-17に書いた故OCNブログの記事を移植したものです) Windowsで各種言語設定を取得するとき、いくつかのよく似たWin32 APIがあるんですが、それぞれ微妙に結果が異なるので注意が必要です。代表的なのは下記の6つ。 LANGID GetSystemDefaultLa…

コンピュートシェーダーでGPUパーティクル

DirectX (Direct3D) のコンピュートシェーダー (Compute Shader, DirectCompute) には4バイト(uint)単位で要素アクセスが可能なByteAddressBuffer/RWByteAddressBuffer (BAB) というデータ型があるんですが、DirectXにおいてGPUで頂点バッファの内容を直接…

HLSLの行列乗算がmul()関数な理由

GLSLでは行列の乗算に*演算子を使います。 // GLSL mat4 mTransformA; mat4 mTransformB; vec4 vIn; vec4 vOut = mTransformB * mTransformA * vIn; 一方HLSLではmul()関数を使います。 // HLSL float4x4 mTransformA; float4x4 mTransformB; float4 vIn; fl…

Visual C++とUTF-8マルチバイト

Visual C++には #pragma execution_character_set("utf-8") というプラグマがあって、これを使うとコンパイル時にマルチバイト文字列リテラル(プレフィックスなしの"XXX")をOSのANSIコードページ文字列リテラル(Shift_JIS:CP932とか)ではなくUTF-8文字列…

map/unordered_mapのキーにカスタムデータ型を使う

C++の標準ライブラリではテーブル(連想配列)系のコンテナとして、ツリー実装のset/map/multiset/multimapが使えます。またC++11規格では、新たにハッシュテーブル実装のunordered_set/unordered_map/unordered_multiset/unordered_multimapが使えるように…

BGRA/RGBAに関してそろそろ一言いっておくか

世には4つのカラーチャンネル(Red, Green, Blue, Alpha)をサポートする画像フォーマットは数多あるのですが、整理も兼ねて Direct3D や OpenGL のテクスチャ フォーマットとの関連に言及しながらまとめてみようと思います。早速ですがいきなりサンプルコー…

CUDAでテクスチャ

前回の記事では CUDA の線形メモリ(Linear Memory, cudaMalloc() で生成)を使って FP16 浮動小数点数値を格納しました。 今回は CUDA の Array と Texture を使って、0x0000 ~ 0xFFFF の範囲の 16bit 整数値(ushort)を正規化して 0.0 ~ 1.0 の範囲の 32b…

CUDAでhalf型

VRAM 使用量や帯域の節約目的で、CUDA や OpenCL のカーネルに FP16 半精度浮動小数点数(half)型のデータを渡す場合の話です。 通例 GPGPU で使われる実数は FP32 単精度浮動小数点数(float)型なんですが、half だとその半分のデータ量で済むため、帯域…

OpenCVの輝度スケーリング

OpenCVで画像ロードしてRGB→YCbCr変換して、特殊なカーネルコードにより輝度YをスケーリングしたのちYCbCr→RGBに戻す、というコードを書いてみました。つまりOpenCVのフィルター系関数や変換マトリックスは使ってません。単純に線形スケーリングするだけなら…

ProgramDataフォルダーの使い道

MicrosoftはWindows Vistaで追加・変更されたいくつかのフォルダーや新しいセキュリティモデルに関して、下記のガイドラインを公開しています(英語)。 Windows File System Namespace Usage Guidelines ※2016-03-21追記: 上記はすでにリンク切れしてしま…

Qtでgcc/g++のオプションを指定する

クロスプラットフォームなC++向けGUIアプリケーションフレームワークとして、GTK+の他にQtというのがあります。GTK+とQtはともにGNU LGPLライセンスらしいです。 Qt用の標準IDEであるQt CreatorにはQtライブラリとMinGW環境が同梱されているんですが、Qtで例…

Photoshopのスクリプトでテキストレイヤーを作成してラスター化

Photoshop含めAdobe製品ではAdobe ExtendScriptというのを使って作業を自動化できるので、コードでテキストレイヤーを作ってラスター化するというスクリプトを試しに書いてみました。ExtendScriptはJavaScriptと互換性が高いらしいです。 var doc = app.acti…

printfとString.Format

(これは2013-06-27に書いた故OCNブログの記事を移植したものです).NETのString.Format()やConsole.Write()/WriteLine()の書式を駆使すれば、ほぼCのprintf系をカバーできるんですが、MSDNの書式指定構文の説明にある、 % [flags] [width] [.precision] [{h…

OpenCLデバイスの列挙

1年くらい前に書いたコードですが、OpenCLプログラムの入門、まずはデバイスの列挙です。 VC++ 2010、AMD APP SDK v2、NVIDIA GPU Computing SDK 4.0で検証。 #define __CL_ENABLE_EXCEPTIONS #pragma warning(push) #pragma warning(disable:4290) #include <CL/cl.hpp></cl/cl.hpp>…

第2留置場の開設

OCNブログの無料プランがいいかげん使いづらくなってきたというか今まで目をそらしてきた「そもそもプログラミング記事向けのサービスじゃない」ことをようやく認めたので分割移転を始めることにしました。移転元はこちら。今後は、はてなブログのほうでは主…