Garage uenoB このページをアンテナに追加 RSSフィード

2008-01-07

[][][] 初音ミクパッチ for Wine-0.9.52 19:43  初音ミクパッチ for Wine-0.9.52を含むブックマーク

CrossOverで初音ミクが動くらしいので,当然Wineでも動くはず,と思ってここ数日初音ミクを動かすためのWine環境をIntel Mac上に構築してたんですが,せっかく頑張ってもコントロールトラックが表示されないようでは面白くないのですよ.というわけでパッチ

--- wine-0.9.52/dlls/winex11.drv/xrender.c.orig	2007-12-29 00:26:23.000000000 +0900
+++ wine-0.9.52/dlls/winex11.drv/xrender.c	2008-01-07 11:19:19.000000000 +0900
@@ -1522,6 +1522,7 @@
     Picture dst_pict, src_pict;
     Pixmap xpm;
     DIBSECTION dib;
+    HBITMAP hbitmap = NULL;
     XImage *image;
     GC gc;
     XGCValues gcv;
@@ -1569,8 +1570,36 @@
 
     if (!devSrc->bitmap || GetObjectW( devSrc->bitmap->hbitmap, sizeof(dib), &dib ) != sizeof(dib))
     {
-        FIXME("not a dibsection\n");
-        return FALSE;
+        if (devSrc->bitmap && GetObjectW( devSrc->bitmap->hbitmap, sizeof(dib.dsBm), &dib.dsBm ) == sizeof(dib.dsBm))
+        {
+            void *bits;
+
+            /* FIXME: I don't know whether this way is correct or not. */
+            TRACE("forcely convert bitmap to dib\n");
+            dib.dsBmih.biSize = sizeof(BITMAPINFOHEADER);
+            dib.dsBmih.biWidth = dib.dsBm.bmWidth;
+            dib.dsBmih.biHeight = -dib.dsBm.bmHeight;
+            dib.dsBmih.biPlanes = dib.dsBm.bmPlanes;
+            dib.dsBmih.biBitCount = dib.dsBm.bmBitsPixel;
+            dib.dsBmih.biCompression = BI_RGB;
+            dib.dsBmih.biSizeImage = 0;
+            dib.dsBmih.biXPelsPerMeter = 0;
+            dib.dsBmih.biYPelsPerMeter = 0;
+            dib.dsBmih.biClrUsed = 0;
+            dib.dsBmih.biClrImportant = 0;
+            hbitmap = CreateDIBSection(NULL, (BITMAPINFO*)&dib.dsBmih, DIB_RGB_COLORS, &bits, NULL, 0);
+            if (!hbitmap) {
+                FIXME("Failed to convert bitmap to dib");
+                return FALSE;
+            }
+            GetObjectW(hbitmap, sizeof(dib), &dib);
+            GetBitmapBits(devSrc->bitmap->hbitmap, dib.dsBmih.biSizeImage, bits);
+        }
+        else
+        {
+            FIXME("neighter a dibsection nor a bitmap\n");
+            return FALSE;
+        }
     }
 
     if (xSrc < 0 || ySrc < 0 || widthSrc < 0 || heightSrc < 0 || xSrc + widthSrc > dib.dsBmih.biWidth
@@ -1578,6 +1607,7 @@
     {
         WARN("Invalid src coords: (%d,%d), size %dx%d\n", xSrc, ySrc, widthSrc, heightSrc);
         SetLastError(ERROR_INVALID_PARAMETER);
+        if (hbitmap) DeleteObject(hbitmap);
         return FALSE;
     }
 
@@ -1586,6 +1616,7 @@
 
     if(dib.dsBm.bmBitsPixel != 32) {
         FIXME("not a 32 bpp dibsection\n");
+        if (hbitmap) DeleteObject(hbitmap);
         return FALSE;
     }
     dstbits = data = HeapAlloc(GetProcessHeap(), 0, heightSrc * widthSrc * 4);
@@ -1702,6 +1733,7 @@
 
     wine_tsx11_unlock();
     HeapFree(GetProcessHeap(), 0, data);
+    if (hbitmap) DeleteObject(hbitmap);
     return TRUE;
 }
 

コントロールトラックが出ないのは,DDBアルファブレンディングがWineにまだ実装されていないからのようです*1.このパッチDDBを無理矢理DIBに変換してアルファブレンディングできるようにします.ただし,

  • x11drvのレベルではDIBもDDBも内部表現はほとんど同じはずなのにCreateDIBSectionなんて呼んでるのはどうみても無駄です.きっと偉い人がもっとマシな実装をしてくれるに違いない.
  • このパッチの汎用性は分かりません.とりあえずVOCALOID2 Editorには効く.

しかし,パラダイムの異なるモノを整然としたコードで書き下すWine開発チームは凄いと思います.

*1:逆(DDBにのみ対応)なら分かるんだけど,なんでこうなってるんだろう?どうでもいいけど.

おごちゃんおごちゃん 2008/01/07 22:26 ぶはっ。もう対応コードが!

言ってみるもんだなぁ。

新茶新茶 2008/01/14 13:18 このパッチは本家に送っているのですか?
0.9.53以降も当てる必要あるのでしょうか。。

uenoBuenoB 2008/01/21 21:38 反応遅くて申し訳ありません.
すみません,パッチはまだ送ってないです.ちょっと時間が取れなくて…(git formatとかめんどすぎってのもある
53以降も普通に当たると思うので,当ててください.

MGdeisgnerMGdeisgner 2008/06/26 18:04 Hello,I opened the data in wineHQ: http://appdb.winehq.org/objectManager.php?sClass=application&iId=7554

Please help to report back to wineHQ. Let’s the wine team pay attention to miku.

babasakibabasaki 2008/12/10 22:16 VineでWINEをパッケージしている者ですが、なかなかWINE本家で取り込まれてないようなんで、これを WINE-1.0.1 とWINE-1.1.10 に当てたパッケージを作っています。(※現在テスト中なのでまだ非公開ですが)
半透明が出てなかなか快適です。ありがとうございます。
(ちなみにxrender.cがバージョン毎に微妙に違うのでそのままではパッチが当たりません。そこで手動でパッチを再作成しております、すみません)

トラックバック - http://d.hatena.ne.jp/uenoB/20080107/1199702633