Module: wine Branch: master Commit: 0154b59c7eb28613342def98dc580083695d8833 URL: https://source.winehq.org/git/wine.git/?a=commit;h=0154b59c7eb28613342def98d...
Author: Jactry Zeng jzeng@codeweavers.com Date: Fri Apr 13 15:56:54 2018 +0800
riched20: Save reobj in linked list.
Signed-off-by: Jactry Zeng jzeng@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/riched20/caret.c | 32 ++++++++++++++++++++++++++++++-- dlls/riched20/editor.c | 1 + dlls/riched20/editor.h | 2 +- dlls/riched20/editstr.h | 9 ++++++++- dlls/riched20/list.c | 6 +++++- dlls/riched20/richole.c | 30 +++++++++++++++--------------- dlls/riched20/run.c | 2 +- dlls/riched20/writer.c | 6 +++--- 8 files changed, 64 insertions(+), 24 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index d676a1b..1d35696 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -471,12 +471,26 @@ ME_InternalInsertTextFromCursor(ME_TextEditor *editor, int nCursor, return ME_InsertRunAtCursor(editor, p, style, str, len, flags); }
+static struct re_object* create_re_object(const REOBJECT *reo) +{ + struct re_object *reobj = heap_alloc(sizeof(*reobj)); + + if (!reobj) + { + WARN("Fail to allocate re_object.\n"); + return NULL; + } + ME_CopyReObject(&reobj->obj, reo); + return reobj; +}
void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor) { ME_Style *pStyle = ME_GetInsertStyle(editor, nCursor); ME_DisplayItem *di; WCHAR space = ' '; + ME_DisplayItem *di_prev = NULL; + struct re_object *reobj_prev = NULL;
/* FIXME no no no */ if (ME_IsSelection(editor)) @@ -484,8 +498,22 @@ void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCur
di = ME_InternalInsertTextFromCursor(editor, nCursor, &space, 1, pStyle, MERF_GRAPHICS); - di->member.run.ole_obj = heap_alloc(sizeof(*reo)); - ME_CopyReObject(di->member.run.ole_obj, reo); + di->member.run.reobj = create_re_object(reo); + + di_prev = di; + while (ME_PrevRun(NULL, &di_prev, TRUE)) + { + if (di_prev->member.run.reobj) + { + reobj_prev = di_prev->member.run.reobj; + break; + } + } + if (reobj_prev) + list_add_after(&reobj_prev->entry, &di->member.run.reobj->entry); + else + list_add_head(&editor->reobj_list, &di->member.run.reobj->entry); + ME_ReleaseStyle(pStyle); }
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index c442512..c57d3ea 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -3113,6 +3113,7 @@ ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10) ed->wheel_remain = 0;
list_init( &ed->style_list ); + list_init( &ed->reobj_list ); OleInitialize(NULL);
return ed; diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 0db5326..1a9bec3 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -232,7 +232,7 @@ LRESULT CreateIRichEditOle(IUnknown *outer_unk, ME_TextEditor *editor, LPVOID *p void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run* run, BOOL selected) DECLSPEC_HIDDEN; void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) DECLSPEC_HIDDEN; void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src) DECLSPEC_HIDDEN; -void ME_DeleteReObject(REOBJECT* reo) DECLSPEC_HIDDEN; +void ME_DeleteReObject(struct re_object *re_object) DECLSPEC_HIDDEN; void ME_GetITextDocumentInterface(IRichEditOle *iface, LPVOID *ppvObj) DECLSPEC_HIDDEN;
/* editor.c */ diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index a37c4de..206ce85 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -153,6 +153,12 @@ typedef enum {
struct tagME_DisplayItem;
+struct re_object +{ + struct list entry; + REOBJECT obj; +}; + typedef struct tagME_Run { ME_Style *style; @@ -163,7 +169,7 @@ typedef struct tagME_Run int nFlags; int nAscent, nDescent; /* pixels above/below baseline */ POINT pt; /* relative to para's position */ - REOBJECT *ole_obj; /* FIXME: should be a union with strText (at least) */ + struct re_object *reobj; /* FIXME: should be a union with strText (at least) */
SCRIPT_ANALYSIS script_analysis; int num_glyphs, max_glyphs; @@ -436,6 +442,7 @@ typedef struct tagME_TextEditor BOOL bMouseCaptured; int wheel_remain; struct list style_list; + struct list reobj_list; } ME_TextEditor;
typedef struct tagME_Context diff --git a/dlls/riched20/list.c b/dlls/riched20/list.c index 8c4f0de..ba35a90 100644 --- a/dlls/riched20/list.c +++ b/dlls/riched20/list.c @@ -169,7 +169,11 @@ void ME_DestroyDisplayItem(ME_DisplayItem *item)
if (item->type==diRun) { - if (item->member.run.ole_obj) ME_DeleteReObject(item->member.run.ole_obj); + if (item->member.run.reobj) + { + list_remove(&item->member.run.reobj->entry); + ME_DeleteReObject(item->member.run.reobj); + } heap_free( item->member.run.glyphs ); heap_free( item->member.run.clusters ); ME_ReleaseStyle(item->member.run.style); diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c index c19a2e7..ef985fe 100644 --- a/dlls/riched20/richole.c +++ b/dlls/riched20/richole.c @@ -5284,11 +5284,11 @@ void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) ENHMETAHEADER emh;
assert(run->nFlags & MERF_GRAPHICS); - assert(run->ole_obj); + assert(run->reobj);
- if (run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0) + if (run->reobj->obj.sizel.cx != 0 || run->reobj->obj.sizel.cy != 0) { - convert_sizel(c, &run->ole_obj->sizel, pSize); + convert_sizel(c, &run->reobj->obj.sizel, pSize); if (c->editor->nZoomNumerator != 0) { pSize->cx = MulDiv(pSize->cx, c->editor->nZoomNumerator, c->editor->nZoomDenominator); @@ -5297,13 +5297,13 @@ void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) return; }
- if (!run->ole_obj->poleobj) + if (!run->reobj->obj.poleobj) { pSize->cx = pSize->cy = 0; return; }
- if (IOleObject_QueryInterface(run->ole_obj->poleobj, &IID_IDataObject, (void**)&ido) != S_OK) + if (IOleObject_QueryInterface(run->reobj->obj.poleobj, &IID_IDataObject, (void**)&ido) != S_OK) { FIXME("Query Interface IID_IDataObject failed!\n"); pSize->cx = pSize->cy = 0; @@ -5366,13 +5366,13 @@ void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run *run, BOOL selected) RECT rc;
assert(run->nFlags & MERF_GRAPHICS); - assert(run->ole_obj); - if (IOleObject_QueryInterface(run->ole_obj->poleobj, &IID_IDataObject, (void**)&ido) != S_OK) + assert(run->reobj); + if (IOleObject_QueryInterface(run->reobj->obj.poleobj, &IID_IDataObject, (void**)&ido) != S_OK) { FIXME("Couldn't get interface\n"); return; } - has_size = run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0; + has_size = run->reobj->obj.sizel.cx != 0 || run->reobj->obj.sizel.cy != 0; fmt.cfFormat = CF_BITMAP; fmt.ptd = NULL; fmt.dwAspect = DVASPECT_CONTENT; @@ -5399,7 +5399,7 @@ void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run *run, BOOL selected) old_bm = SelectObject(hMemDC, stgm.u.hBitmap); if (has_size) { - convert_sizel(c, &run->ole_obj->sizel, &sz); + convert_sizel(c, &run->reobj->obj.sizel, &sz); } else { sz.cx = dibsect.dsBm.bmWidth; sz.cy = dibsect.dsBm.bmHeight; @@ -5419,7 +5419,7 @@ void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run *run, BOOL selected) GetEnhMetaFileHeader(stgm.u.hEnhMetaFile, sizeof(emh), &emh); if (has_size) { - convert_sizel(c, &run->ole_obj->sizel, &sz); + convert_sizel(c, &run->reobj->obj.sizel, &sz); } else { sz.cx = emh.rclBounds.right - emh.rclBounds.left; sz.cy = emh.rclBounds.bottom - emh.rclBounds.top; @@ -5447,12 +5447,12 @@ void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run *run, BOOL selected) PatBlt(c->hDC, x, y - sz.cy, sz.cx, sz.cy, DSTINVERT); }
-void ME_DeleteReObject(REOBJECT* reo) +void ME_DeleteReObject(struct re_object *reobj) { - if (reo->poleobj) IOleObject_Release(reo->poleobj); - if (reo->pstg) IStorage_Release(reo->pstg); - if (reo->polesite) IOleClientSite_Release(reo->polesite); - heap_free(reo); + if (reobj->obj.poleobj) IOleObject_Release(reobj->obj.poleobj); + if (reobj->obj.pstg) IStorage_Release(reobj->obj.pstg); + if (reobj->obj.polesite) IOleClientSite_Release(reobj->obj.polesite); + heap_free(reobj); }
void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src) diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c index 098c4f8..73adc7e 100644 --- a/dlls/riched20/run.c +++ b/dlls/riched20/run.c @@ -290,7 +290,7 @@ ME_DisplayItem *ME_MakeRun(ME_Style *s, int nFlags) { ME_DisplayItem *item = ME_MakeDI(diRun); item->member.run.style = s; - item->member.run.ole_obj = NULL; + item->member.run.reobj = NULL; item->member.run.nFlags = nFlags; item->member.run.nCharOfs = -1; item->member.run.len = 0; diff --git a/dlls/riched20/writer.c b/dlls/riched20/writer.c index aad2e44..b1e99d6 100644 --- a/dlls/riched20/writer.c +++ b/dlls/riched20/writer.c @@ -947,7 +947,7 @@ static BOOL stream_out_graphics( ME_TextEditor *editor, ME_OutStream *stream, SIZE goal, pic; ME_Context c;
- hr = IOleObject_QueryInterface( run->ole_obj->poleobj, &IID_IDataObject, (void **)&data ); + hr = IOleObject_QueryInterface( run->reobj->obj.poleobj, &IID_IDataObject, (void **)&data ); if (FAILED(hr)) return FALSE;
ME_InitContext( &c, editor, ITextHost_TxGetDC( editor->texthost ) ); @@ -975,8 +975,8 @@ static BOOL stream_out_graphics( ME_TextEditor *editor, ME_OutStream *stream, emf_bits->szlMillimeters.cy * c.dpi.cy * 10 );
/* convert goal size to twips */ - goal.cx = MulDiv( run->ole_obj->sizel.cx, 144, 254 ); - goal.cy = MulDiv( run->ole_obj->sizel.cy, 144, 254 ); + goal.cx = MulDiv( run->reobj->obj.sizel.cx, 144, 254 ); + goal.cy = MulDiv( run->reobj->obj.sizel.cy, 144, 254 );
if (!ME_StreamOutPrint( stream, "{\*\shppict{\pict\emfblip\picw%d\pich%d\picwgoal%d\pichgoal%d\n", pic.cx, pic.cy, goal.cx, goal.cy ))