Eric Pouech : richedit: Added support for reading DI bitmaps in RTF streams .

Alexandre Julliard julliard at winehq.org
Mon Mar 17 10:46:32 CDT 2008


Module: wine
Branch: master
Commit: f628a1c2454eb558f99f8f5c769058d3938240b9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f628a1c2454eb558f99f8f5c769058d3938240b9

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Sun Mar 16 21:45:52 2008 +0100

richedit: Added support for reading DI bitmaps in RTF streams.

---

 dlls/riched20/editor.c |   61 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 53 insertions(+), 8 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index a803773..ce8473d 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -691,7 +691,8 @@ static void ME_RTFTblAttrHook(RTF_Info *info)
   }
 }
 
-static BOOL ME_RTFInsertOleObject(RTF_Info *info, HENHMETAFILE h, const SIZEL* sz)
+static BOOL ME_RTFInsertOleObject(RTF_Info *info, HENHMETAFILE hemf, HBITMAP hbmp,
+                                  const SIZEL* sz)
 {
   LPOLEOBJECT         lpObject = NULL;
   LPSTORAGE           lpStorage = NULL;
@@ -704,11 +705,20 @@ static BOOL ME_RTFInsertOleObject(RTF_Info *info, HENHMETAFILE h, const SIZEL* s
   BOOL                ret = FALSE;
   DWORD               conn;
 
-  stgm.tymed = TYMED_ENHMF;
-  stgm.u.hEnhMetaFile = h;
+  if (hemf)
+  {
+      stgm.tymed = TYMED_ENHMF;
+      stgm.u.hEnhMetaFile = hemf;
+      fm.cfFormat = CF_ENHMETAFILE;
+  }
+  else if (hbmp)
+  {
+      stgm.tymed = TYMED_GDI;
+      stgm.u.hBitmap = hbmp;
+      fm.cfFormat = CF_BITMAP;
+  }
   stgm.pUnkForRelease = NULL;
 
-  fm.cfFormat = CF_ENHMETAFILE;
   fm.ptd = NULL;
   fm.dwAspect = DVASPECT_CONTENT;
   fm.lindex = -1;
@@ -768,6 +778,8 @@ static void ME_RTFReadPictGroup(RTF_Info *info)
   BYTE          val;
   METAFILEPICT  mfp;
   HENHMETAFILE  hemf;
+  HBITMAP       hbmp;
+  enum gfxkind {gfx_unknown = 0, gfx_enhmetafile, gfx_dib} gfx = gfx_unknown;
 
   RTFGetToken (info);
   if (info->rtfClass == rtfEOF)
@@ -777,6 +789,12 @@ static void ME_RTFReadPictGroup(RTF_Info *info)
   if (RTFCheckMM (info, rtfPictAttr, rtfWinMetafile))
   {
     mfp.mm = info->rtfParam;
+    gfx = gfx_enhmetafile;
+  }
+  else if (RTFCheckMM (info, rtfPictAttr, rtfDevIndBitmap))
+  {
+    if (info->rtfParam != 0) FIXME("dibitmap should be 0 (%d)\n", info->rtfParam);
+    gfx = gfx_dib;
   }
   else
   {
@@ -799,9 +817,13 @@ static void ME_RTFReadPictGroup(RTF_Info *info)
       goto skip_group;
     }
     else if (RTFCheckMM (info, rtfPictAttr, rtfPicWid))
-      mfp.xExt = info->rtfParam;
+    {
+      if (gfx == gfx_enhmetafile) mfp.xExt = info->rtfParam;
+    }
     else if (RTFCheckMM (info, rtfPictAttr, rtfPicHt))
-      mfp.yExt = info->rtfParam;
+    {
+      if (gfx == gfx_enhmetafile) mfp.yExt = info->rtfParam;
+    }
     else if (RTFCheckMM (info, rtfPictAttr, rtfPicGoalWid))
       sz.cx = info->rtfParam;
     else if (RTFCheckMM (info, rtfPictAttr, rtfPicGoalHt))
@@ -837,8 +859,31 @@ static void ME_RTFReadPictGroup(RTF_Info *info)
   }
   if (flip) FIXME("wrong hex string\n");
 
-  if ((hemf = SetWinMetaFileBits(bufidx, buffer, NULL, &mfp)))
-    ME_RTFInsertOleObject(info, hemf, &sz);
+  switch (gfx)
+  {
+  case gfx_enhmetafile:
+    if ((hemf = SetWinMetaFileBits(bufidx, buffer, NULL, &mfp)))
+        ME_RTFInsertOleObject(info, hemf, NULL, &sz);
+    break;
+  case gfx_dib:
+    {
+      BITMAPINFO* bi = (BITMAPINFO*)buffer;
+      HDC         hdc = GetDC(0);
+      unsigned    nc = bi->bmiHeader.biClrUsed;
+
+      /* not quite right, especially for bitfields type of compression */
+      if (!nc && bi->bmiHeader.biBitCount <= 8)
+        nc = 1 << bi->bmiHeader.biBitCount;
+      if ((hbmp = CreateDIBitmap(hdc, &bi->bmiHeader,
+                                 CBM_INIT, (char*)(bi + 1) + nc * sizeof(RGBQUAD),
+                                 bi, DIB_RGB_COLORS)))
+          ME_RTFInsertOleObject(info, NULL, hbmp, &sz);
+      ReleaseDC(0, hdc);
+    }
+    break;
+  default:
+    break;
+  }
   HeapFree(GetProcessHeap(), 0, buffer);
   RTFRouteToken (info);	/* feed "}" back to router */
   return;




More information about the wine-cvs mailing list