Search
Categories
Articles
Rainmeter関連
ファイル置き場
お知り合いなど

スポンサーサイト

--.--.-- | スポンサー広告

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[WDM] Aero Glassを有効にしてみる

2009.11.05 | Rainmeter-dev // その他

0 Comments

Aero Glass

Windows 7の試用期間が切れる前にいろいろとWDMの機能を試してみてます。
WDM関連の設定を変更したときにちゃんと追随してくれるかどうかは、実環境でチェックしないとわかりませんからね。

すりガラス効果を得るのに、最初はDwmExtendFrameIntoClientArea APIを使って、ガラス効果になってる部分をクライアント領域まで広げる方法で試してみましたが、こいつはどうやらWS_CAPTION(それともボーダー?)を持ってないと有効にならない様子。確かに最初からクライアント領域しかないRainmeterでは広げる以前の問題でした。
単純にクライアント領域に使うのはDwmEnableBlurBehindWindow APIのようで、こちらを使うとすりガラス効果を得ることができました。コードはExampleにあるもののまま。簡単ですね。ちゃんとぼやけてるし、設定に応じて合成色も変わります。

簡単だけど、もしRainmeterで実現するなら、面倒な問題がちらほらありそう(リージョンを切らないと領域が矩形のままだけど、再描画のたびにスキンに合わせて切るとなると、負荷が高くなる)。

スポンサーサイト

[GDI+] InterpolationModeをいじる

2009.09.04 | Rainmeter-dev // その他

0 Comments

Rainmeter1.0では、全MeterでAntiAliasの設定ができるようになったので、画像系のMeterでもAntiAliasが反映されるようになりました。
AntiAliasの設定は、主に図形のエッジのエイリアスを改善する使い方が多く、たぶんこれはRotatorで画像を傾けたときにも反映されるんだと思いますが(試してない)、それだけでなく、画像を拡大/縮小したときに使われる補間方法も変わっています。この補間方法をいろいろ変えて遊んでみました。

補間方法の設定には、SetInterpolationMode()を使います。引数には、InterpolationMode列挙体のどれかを指定します。

InterpolationModeDefault
Specifies the default interpolation mode.

InterpolationModeLowQuality
Specifies a low-quality mode.

InterpolationModeHighQuality
Specifies a high-quality mode.

InterpolationModeBilinear
Specifies bilinear interpolation. No prefiltering is done. This mode is not suitable for shrinking an image below 50 percent of its original size.

InterpolationModeBicubic
Specifies bicubic interpolation. No prefiltering is done. This mode is not suitable for shrinking an image below 25 percent of its original size.

InterpolationModeNearestNeighbor
Specifies nearest-neighbor interpolation.

InterpolationModeHighQualityBilinear
Specifies high-quality, bilinear interpolation. Prefiltering is performed to ensure high-quality shrinking.

InterpolationModeHighQualityBicubic
Specifies high-quality, bicubic interpolation. Prefiltering is performed to ensure high-quality shrinking. This mode produces the highest quality transformed images.

AntiAlias=0(Rainmeter1.0以前も含む)のときに使われる補間方法としては、InterpolationModeDefaultという規定値が使われています。実際にどんな補間方法が使われているのかというと……デフォルトの補間モードと書かれてあるだけで、中身は不明です。AntiAlias=1では、InterpolationModeBicubicが指定されています。

Bicubicでは、画像を縮小する用途に使うと汚くなることがあるので、デフォルトとするにはあまり好きにはなれないんですが、じゃあほかのモードだとどんな感じになるのかなと、MeterImageで補間方法を指定できるようにして比べてみました。LowQualityとHighQualityはよくわからないので除外。

写真よりは細めの文字のほうがわかりやすいと思うので、適当な文章で画像(240x80)を作ってテスト。

元画像×0.55

まずは縮小。
Disabled(AntiAlias=0)でいいんじゃないかという……。AntiAlias=1のデフォルトBicubicはシャープがかかりすぎていて、少しガタガタして見えます。
一番汚いのはやっぱりNearest Neighborで、Bilinearも思っていたよりはボケ具合が大きい。HighQualityBicubicは一番はっきりしていて綺麗だけれど、Disabledよりは負荷は増えるのかなぁと。

元画像×1.3

次に拡大。
拡大率があまり高くないので、Nearest Neighbor以外はあまり変わらない感じ。率が大きくなるほど、Bicubicの2つは他より綺麗に表示してくれます。Bilinearは縮小のときと同じく、率が大きくなるとボケてきます。
これでもDisabledなもので十分綺麗。AntiAlias=0を=1にすると、画像の大きさと拡大率につれて負荷も大きくなっていくので、=0で使ってもいいのかなぁと思ったり。
(ただ、AntiAliasは冒頭にも書いたように変形時のアンチエイリアスも兼ねているかもしれないので、それが必要ならオフにできないかも?)

個人的な結論としては、縮小するときにはAntiAlias=0を使って、拡大するときにも基本は=0で、綺麗に補間したいときだけ=1で使えばいいかなぁと。
それにしても、中身が謎なInterpolationModeDefaultが一番使い勝手がいいっていうのも……デフォルトだからか。

<追記>
もっと小さいの(x0.3)と、もっと大きいの(x2.35)も撮ってみた。

元画像×0.3 元画像×2.35

[Rainmeter-dev] Imageに透明度指定を入れてみる

2009.09.01 | Rainmeter-dev // その他

0 Comments

Rainmeterは透過pngに対応しているので、もし画像を表示する際に透過効果を持たせたければ、あらかじめ透過pngとしてファイルを作っておく必要があります。
ですが、jpg画像を使いたいときや、オリジナルファイルをいじりたくないときもあります。DynamicVariablesで文字色やその透明度が動的に変えられるようになったのもあって、画像描画時の透明度も同じように替えられてもいいんじゃないかと思い、試しにコードを書いてみました。

設定としてAlphaValueを追加し、値には0(透明)~255(不透明)を指定します。

    m_AlphaValue = parser.ReadInt(section, L"AlphaValue", 255);
    m_AlphaValue = min(255, m_AlphaValue);
    m_AlphaValue = max(0, m_AlphaValue);

255が指定されているときは今まで通りに描画し、それ以外ではColorMatrixを使って透明度を反映させます。

        if (m_AlphaValue == 255)
        {
            graphics.DrawImage(m_Bitmap, r, 0, 0, imageW, imageH, UnitPixel);
        }
        else
        {
            REAL alp = m_AlphaValue / 255.0f;
 
            // Initialize the color matrix
            ColorMatrix colorMatrix = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                                        0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                                        0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                                        0.0f, 0.0f, 0.0f, alp,  0.0f,
                                        0.0f, 0.0f, 0.0f, 0.0f, 1.0f };
 
            // Create an ImageAttributes object and set its color matrix
            ImageAttributes imageAtt;
            imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault, ColorAdjustTypeBitmap);
 
            // Draw the semitransparent bitmap image
            graphics.DrawImage(m_Bitmap, r, 0, 0, imageW, imageH, UnitPixel, &imageAtt);
        }

ColorMatrixの5x5のうち、縦横それぞれの4番目が透明度に対応します(赤字の部分)。取る範囲は0.0-1.0なので、0-255から変換して指定します。
あとはそのColorMatrixをImageAttributesに設定して、DrawImage関数の引数に加えるだけです。MeterBitmapでも同じようにできそうです。

やはり実行時に透明度処理をするので、若干CPU使用率は上がってしまいますが、どうしても実行時に反映させたいという用途にはいいのかなと。
本来ならばDynamicVariablesでの透明度更新も含めてフェードアニメーションに使うようなものかもしれないけど、Rainmeterは仕組み上(表示にGDI+を使っているのも含め)アニメーションに弱いので、使いづらいものではあるんですが……。

微修正点とか

2009.04.14 | Rainmeter-dev // その他

0 Comments

Rainmeter本家ではどんどんと追加要素が入っていってますが、何を追加していってるのかさっぱりなので(スキンの部分ではないとはいえ、今まであった設定項目を削るってどうなの?とは思ったりしましたが)、そちらは少し置いといて。
今回は、自分用にビルドして使っているRainmeterのソースのうち、変な処理などを微修正した部分を書き出してみます。追加要素はまた別の機会に。
(修正前のソースを貼るとえらい長くなるので、GoogleCodeへのリンクと行番号だけ書いておきます)

■いろんなとこ
・new char[]やnew WCHAR[]で確保したバッファを、単にdeleteしてしまっている部分を修正(delete tmpSz; → delete [] tmpSz;)。ほとんどがConvertToAscii()、ConvertToWide()、ConvertToUTF8()絡み。複数のファイルにあるので全部(主にプラグインのソースにあります)。
・後置インクリメント/デクリメントをしてる部分のうち、処理的に後置でなくていいものをすべて前置に置き換えた。主にforループでまわしてるイテレータのため。
・forなどのループの条件のうち、処理的に変化のない条件を何度も計算しないようにした。主に「i < wcslen(tmpSz)」みたいなもの。
・構造体の初期化をmemset()でなく、宣言時に{0}を代入することで済ますようにした。NOTIFYICONDATAのcbSizeなど、サイズを指定しなければいけないものは{sizeof(NOTIFYICONDATA)}で初期化(サイズ指定部分は大抵、構造体の先頭にあるため。先頭でない場合は仕方ないので後から代入する)。

■Application.cpp
・コマンドラインからクォート(")を取り除く処理で、取り除いた後の文字列を格納しておくバッファ(WCHAR Path[256])のサイズを超えて書き込もうとするのを修正。……でも、これって何のために存在する処理なのかがよくわかりませんでした。(後述)
・すべてのMeterWindowが"On Desktop"に設定されているときに、!BANG Commandが届かない問題を修正。(後述)

■MeterHistogram.cpp
・ヒストグラムのバーの高さが微妙に設定とズレるのを修正。DrawLine()で描いていたものを、すべてFillRectangle()で描くようにする。(ソースは追加要素と入り混じりすぎてて抜き出せないので割愛)

■MeterString.cpp
・フォントによって、StringAlign=RIGHTのときに文字の位置がズレることがあるのを修正(?)。……というよりは、直っているのかどうか、正しいのかどうかすらわからないやり方なので、おまじない程度。(後述)

■MeterWindow.cpp
・スキン内容を読み込むためのバッファの解放漏れを修正。1054行目で、returnする前にitemsをdelete[]する。
・描画用のダブルバッファを、毎度deleteして作り直すのではなく、サイズの変化がないときは透明色で塗りつぶして再利用するようにしてみた。単に、やたら増えるページフォルトを減らしたかっただけ。速度的には作り直すよりも遅い。(後述)

■Rainmeter.cpp
・OSの判定で、XPでもたぶん2kとして判定されてしまうのを修正。dwMajorVersionだけでなくdwMinorVersionも含めて判定する。……とはいえ、どのへんでOSごとに(例えば2k or XPで)処理を変えるのに使われているのかは、よくわからない。Vista以上で処理を変えたいとかいう流れになってくると、判定処理をしっかり書いたほうがいいのかも。

■WebParser.cpp
・すべてのMeterWindowが"On Desktop"に設定されているときに、FinishActionが届かず実行されない問題を修正。原因はApplication.cppのものと同じ。

■WindowMessagePlugin.cpp
・std::mapにwindowData丸ごとでなく、ポインタを突っ込むようにした。どっちがいいのかは……。

……と、こんな感じです。
他にも、「Meter=STRINGでAutoScale=1のときに、Measureによっては値が小さく表示されてしまう(210か、103かの違い)」なんてのもあるのですが、これは設定を追加するなりして処理を分けないと無理かなぁということで、今回は省略しました。ディスクやメモリ容量などの表示には問題ないけど、Net関連は少しズレてるかもしれません。

続きからは、(後述)って書いてあるものの詳細。

続きを読む »

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。