Signed-off-by: Jactry Zeng jzeng@codeweavers.com --- dlls/riched20/caret.c | 30 ++++++++++++++++++++++++++++-- dlls/riched20/editor.c | 1 + dlls/riched20/editstr.h | 8 +++++++- dlls/riched20/list.c | 8 ++++++-- dlls/riched20/richole.c | 20 ++++++++++---------- dlls/riched20/run.c | 2 +- dlls/riched20/writer.c | 6 +++--- 7 files changed, 56 insertions(+), 19 deletions(-)
On Thu, Apr 12, 2018 at 11:31:29AM +0800, Jactry Zeng wrote:
Signed-off-by: Jactry Zeng jzeng@codeweavers.com
dlls/riched20/caret.c | 30 ++++++++++++++++++++++++++++-- dlls/riched20/editor.c | 1 + dlls/riched20/editstr.h | 8 +++++++- dlls/riched20/list.c | 8 ++++++-- dlls/riched20/richole.c | 20 ++++++++++---------- dlls/riched20/run.c | 2 +- dlls/riched20/writer.c | 6 +++--- 7 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index d676a1bc38..1e654a0a80 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -471,6 +471,14 @@ ME_InternalInsertTextFromCursor(ME_TextEditor *editor, int nCursor, return ME_InsertRunAtCursor(editor, p, style, str, len, flags); }
+static ME_ReObjItem* create_reobj_item(const REOBJECT* reo) +{
- ME_ReObjItem *reo_item = heap_alloc(sizeof(ME_ReObjItem));
sizeof(*reo_item) like the one you do on the next line.
Failure test.
- reo_item->reobj = heap_alloc(sizeof(*reo));
Having two allocs here is needless. embed the REOBJECT structure inside ME_ReObjItem.
- ME_CopyReObject(reo_item->reobj, reo);
- return reo_item;
+}
void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor) { @@ -484,8 +492,26 @@ 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.reo_item = create_reobj_item(reo);
- if (list_empty(&editor->reobj_list))
list_add_head(&editor->reobj_list, &di->member.run.reo_item->entry);
I don't think this is a useful optimization. It's probably also hiding a bug below.
- else
- {
ME_DisplayItem *di_prev = di;
ME_ReObjItem *reo_item_prev = NULL;
while (ME_PrevRun(NULL, &di_prev, TRUE))
{
if (di_prev->member.run.reo_item)
{
reo_item_prev = di_prev->member.run.reo_item;
break;
}
}
At this point reo_item_prev could be NULL, if it would be the first item in the list.
list_add_after(&reo_item_prev->entry, &di->member.run.reo_item->entry);
- }
- ME_ReleaseStyle(pStyle);
}
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index c4425127e7..c57d3ea9b9 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/editstr.h b/dlls/riched20/editstr.h index a37c4de46e..b32c2622c6 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -153,6 +153,11 @@ typedef enum {
struct tagME_DisplayItem;
+typedef struct tagME_ReObjItem {
- struct list entry;
- REOBJECT *reobj;
As already suggested this become REOBJECT reobj
+} ME_ReObjItem;
Let's drop the ME_ noise and the typedef and go for:
struct re_object { struct list entry; REOBJECT obj; };
typedef struct tagME_Run { ME_Style *style; @@ -163,7 +168,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) */
ME_ReObjItem *reo_item; /* FIXME: should be a union with strText (at least) */
SCRIPT_ANALYSIS script_analysis; int num_glyphs, max_glyphs;
@@ -436,6 +441,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 58b64e8081..f7fb1e94b6 100644 --- a/dlls/riched20/list.c +++ b/dlls/riched20/list.c @@ -97,7 +97,7 @@ BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run, BOOL all_para) { if (p->type == diParagraph) { if (!all_para) return FALSE;
if (p->member.para.prev_para->type == diParagraph)
if (para && p->member.para.prev_para->type == diParagraph)
Why are you sneaking this change in here? It should be a separate patch.
*para = p->member.para.prev_para; } else if (p->type == diRun) { *run = p;
@@ -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.reo_item)
- {
list_remove(&item->member.run.reo_item->entry);
ME_DeleteReObject(item->member.run.reo_item->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 c19a2e7ffa..d315cb9877 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->reo_item);
- if (run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0)
- if (run->reo_item->reobj->sizel.cx != 0 || run->reo_item->reobj->sizel.cy != 0) {
- convert_sizel(c, &run->ole_obj->sizel, pSize);
- convert_sizel(c, &run->reo_item->reobj->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->reo_item->reobj->poleobj) { pSize->cx = pSize->cy = 0; return; }
- if (IOleObject_QueryInterface(run->ole_obj->poleobj, &IID_IDataObject, (void**)&ido) != S_OK)
- if (IOleObject_QueryInterface(run->reo_item->reobj->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->reo_item);
- if (IOleObject_QueryInterface(run->reo_item->reobj->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->reo_item->reobj->sizel.cx != 0 || run->reo_item->reobj->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);
} else { sz.cx = dibsect.dsBm.bmWidth; sz.cy = dibsect.dsBm.bmHeight;convert_sizel(c, &run->reo_item->reobj->sizel, &sz);
@@ -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);
} else { sz.cx = emh.rclBounds.right - emh.rclBounds.left; sz.cy = emh.rclBounds.bottom - emh.rclBounds.top;convert_sizel(c, &run->reo_item->reobj->sizel, &sz);
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c index 098c4f8b4d..1cf96b54c8 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.reo_item = 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 aad2e44879..7f170d20bc 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->reo_item->reobj->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->reo_item->reobj->sizel.cx, 144, 254 );
goal.cy = MulDiv( run->reo_item->reobj->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 ))
Thanks for review! I sent an improved series.
2018-04-12 16:47 GMT+08:00 Huw Davies huw@codeweavers.com:
On Thu, Apr 12, 2018 at 11:31:29AM +0800, Jactry Zeng wrote:
Signed-off-by: Jactry Zeng jzeng@codeweavers.com
dlls/riched20/caret.c | 30 ++++++++++++++++++++++++++++-- dlls/riched20/editor.c | 1 + dlls/riched20/editstr.h | 8 +++++++- dlls/riched20/list.c | 8 ++++++-- dlls/riched20/richole.c | 20 ++++++++++---------- dlls/riched20/run.c | 2 +- dlls/riched20/writer.c | 6 +++--- 7 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/dlls/riched20/caret.c b/dlls/riched20/caret.c index d676a1bc38..1e654a0a80 100644 --- a/dlls/riched20/caret.c +++ b/dlls/riched20/caret.c @@ -471,6 +471,14 @@ ME_InternalInsertTextFromCursor(ME_TextEditor
*editor, int nCursor,
return ME_InsertRunAtCursor(editor, p, style, str, len, flags); }
+static ME_ReObjItem* create_reobj_item(const REOBJECT* reo) +{
- ME_ReObjItem *reo_item = heap_alloc(sizeof(ME_ReObjItem));
sizeof(*reo_item) like the one you do on the next line.
Failure test.
- reo_item->reobj = heap_alloc(sizeof(*reo));
Having two allocs here is needless. embed the REOBJECT structure inside ME_ReObjItem.
- ME_CopyReObject(reo_item->reobj, reo);
- return reo_item;
+}
void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT*
reo, int nCursor)
{ @@ -484,8 +492,26 @@ 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.reo_item = create_reobj_item(reo);
- if (list_empty(&editor->reobj_list))
list_add_head(&editor->reobj_list, &di->member.run.reo_item->
entry);
I don't think this is a useful optimization. It's probably also hiding a bug below.
- else
- {
ME_DisplayItem *di_prev = di;
ME_ReObjItem *reo_item_prev = NULL;
while (ME_PrevRun(NULL, &di_prev, TRUE))
{
if (di_prev->member.run.reo_item)
{
reo_item_prev = di_prev->member.run.reo_item;
break;
}
}
At this point reo_item_prev could be NULL, if it would be the first item in the list.
list_add_after(&reo_item_prev->entry, &di->member.run.reo_item->
entry);
- }
- ME_ReleaseStyle(pStyle);
}
diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index c4425127e7..c57d3ea9b9 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/editstr.h b/dlls/riched20/editstr.h index a37c4de46e..b32c2622c6 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -153,6 +153,11 @@ typedef enum {
struct tagME_DisplayItem;
+typedef struct tagME_ReObjItem {
- struct list entry;
- REOBJECT *reobj;
As already suggested this become REOBJECT reobj
+} ME_ReObjItem;
Let's drop the ME_ noise and the typedef and go for:
struct re_object { struct list entry; REOBJECT obj; };
typedef struct tagME_Run { ME_Style *style; @@ -163,7 +168,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) */
- ME_ReObjItem *reo_item; /* FIXME: should be a union with strText (at
least) */
SCRIPT_ANALYSIS script_analysis; int num_glyphs, max_glyphs; @@ -436,6 +441,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 58b64e8081..f7fb1e94b6 100644 --- a/dlls/riched20/list.c +++ b/dlls/riched20/list.c @@ -97,7 +97,7 @@ BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem
**run, BOOL all_para)
{ if (p->type == diParagraph) { if (!all_para) return FALSE;
if (p->member.para.prev_para->type == diParagraph)
if (para && p->member.para.prev_para->type == diParagraph)
Why are you sneaking this change in here? It should be a separate patch.
*para = p->member.para.prev_para; } else if (p->type == diRun) { *run = p;
@@ -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.reo_item)
- {
list_remove(&item->member.run.reo_item->entry);
ME_DeleteReObject(item->member.run.reo_item->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 c19a2e7ffa..d315cb9877 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->reo_item);
- if (run->ole_obj->sizel.cx != 0 || run->ole_obj->sizel.cy != 0)
- if (run->reo_item->reobj->sizel.cx != 0 || run->reo_item->reobj->
sizel.cy != 0)
{
- convert_sizel(c, &run->ole_obj->sizel, pSize);
- convert_sizel(c, &run->reo_item->reobj->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->reo_item->reobj->poleobj) { pSize->cx = pSize->cy = 0; return; }
- if (IOleObject_QueryInterface(run->ole_obj->poleobj,
&IID_IDataObject, (void**)&ido) != S_OK)
- if (IOleObject_QueryInterface(run->reo_item->reobj->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->reo_item);
- if (IOleObject_QueryInterface(run->reo_item->reobj->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->reo_item->reobj->sizel.cx != 0 ||
run->reo_item->reobj->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);
} else { sz.cx = dibsect.dsBm.bmWidth; sz.cy = dibsect.dsBm.bmHeight;convert_sizel(c, &run->reo_item->reobj->sizel, &sz);
@@ -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);
} else { sz.cx = emh.rclBounds.right - emh.rclBounds.left; sz.cy = emh.rclBounds.bottom - emh.rclBounds.top;convert_sizel(c, &run->reo_item->reobj->sizel, &sz);
diff --git a/dlls/riched20/run.c b/dlls/riched20/run.c index 098c4f8b4d..1cf96b54c8 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.reo_item = 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 aad2e44879..7f170d20bc 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->reo_item->reobj->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->reo_item->reobj->sizel.cx, 144, 254 );
goal.cy = MulDiv( run->reo_item->reobj->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 ))