S.F. Page

Programming,Music,etc...

STed2いじり(23) Direct2D - 透明色の矩形領域塗りつぶし

Direct2Dは通常描画時に常にアルファ値が考慮される。1.0だと描画され、0.5だと半透明、0.0だと描画されない。
これはこれで良いのだが、矩形領域を透明部分も含めて上書きしたいときは一工夫する必要がある。
例えば文字の上に文字を上書きしたい時は透明部分も含めて上書きしたいが、Direct2Dでは常に描画時にアルファ値が考慮されるので透明部分が描画されないため、結果文字が合成されてしまう。なので上書きしたいときは事前にその領域を透明色で消去しなくてはならない。だがこの透明色で消去するというのはDirect2DではClear()メソッドでのみ可能であり、これは矩形領域を指定することができず、全画面対象となっている。FillRectangle()で透明色を指定してもアルファ値が考慮されてしまうので結果はクリアされない。いろいろ調べてみた結果、PushAxisAlignedClip()で透明色でクリアしたい領域を指定して、Clear()メソッドを実行することで所望の処理を行うことができた。

IDWriteTextLayoutPtr l;
write_factory_->CreateTextLayout(u,len,text_fmt_,fWindowWidth,fTextLineHeight,&l);
DWRITE_TEXT_METRICS m;
l->GetMetrics(&m);
text_bitmap_target_->PushAxisAlignedClip(D2D1::RectF(x,y,x + m.widthIncludingTrailingWhitespace,y + m.height),text_bitmap_target_->GetAntialiasMode());
//text_bitmap_target_->FillRectangle(D2D1::RectF(x,y,x + m.widthIncludingTrailingWhitespace,y + m.height),brush_text_clear_);
text_bitmap_target_->Clear();
text_bitmap_target_->PopAxisAlignedClip();
text_bitmap_target_->DrawTextLayout(D2D1::Point2F(x,y),l,brush_text_);

移植具合だけど、歩みはのろいが6割くらいまで来ている感じである。画面は上がDirect2D版・下が原版。

20101128.PNG