Module: wine Branch: master Commit: bb165d22e0f7d134e592088880353aff42729a5f URL: http://source.winehq.org/git/wine.git/?a=commit;h=bb165d22e0f7d134e592088880...
Author: Huw Davies huw@codeweavers.com Date: Mon Nov 9 16:11:41 2015 +0000
riched20: Store the font cache entry rather than the HFONT.
This also removes an incorrect DeleteObject() from DestroyStyle().
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/riched20/editstr.h | 22 +++++++++++----------- dlls/riched20/style.c | 46 ++++++++++++++++++++-------------------------- 2 files changed, 31 insertions(+), 37 deletions(-)
diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 90f7fa0..3e98dac 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -60,11 +60,21 @@ typedef struct tagME_String int nLen, nBuffer; } ME_String;
+typedef struct tagME_FontCacheItem +{ + LOGFONTW lfSpecs; + HFONT hFont; + int nRefs; + int nAge; +} ME_FontCacheItem; + +#define HFONT_CACHE_SIZE 10 + typedef struct tagME_Style { CHARFORMAT2W fmt;
- HFONT hFont; /* cached font for the style */ + ME_FontCacheItem *font_cache; /* cached font for the style */ TEXTMETRICW tm; /* cached font metrics for the style */ int nRefs; /* reference count */ SCRIPT_CACHE script_cache; @@ -372,16 +382,6 @@ typedef struct tagME_OutStream { UINT nNestingLevel; } ME_OutStream;
-typedef struct tagME_FontCacheItem -{ - LOGFONTW lfSpecs; - HFONT hFont; - int nRefs; - int nAge; -} ME_FontCacheItem; - -#define HFONT_CACHE_SIZE 10 - typedef struct tagME_TextEditor { HWND hWnd, hwndParent; diff --git a/dlls/riched20/style.c b/dlls/riched20/style.c index 0817ea8..0e990e2 100644 --- a/dlls/riched20/style.c +++ b/dlls/riched20/style.c @@ -146,7 +146,7 @@ ME_Style *ME_MakeStyle(CHARFORMAT2W *style) assert(style->cbSize == sizeof(CHARFORMAT2W)); s->fmt = *style; s->nRefs = 1; - s->hFont = NULL; + s->font_cache = NULL; memset(&s->tm, 0, sizeof(s->tm)); s->tm.tmAscent = -1; s->script_cache = NULL; @@ -383,8 +383,6 @@ HFONT ME_SelectStyleFont(ME_Context *c, ME_Style *s) { item = &c->editor->pFontCache[i]; TRACE_(richedit_style)("font reused %d\n", i); - - s->hFont = item->hFont; item->nRefs++; } else @@ -397,44 +395,40 @@ HFONT ME_SelectStyleFont(ME_Context *c, ME_Style *s) DeleteObject(item->hFont); item->hFont = NULL; } - s->hFont = CreateFontIndirectW(&lf); - assert(s->hFont); + item->hFont = CreateFontIndirectW(&lf); TRACE_(richedit_style)("font created %d\n", nEmpty); - item->hFont = s->hFont; item->nRefs = 1; item->lfSpecs = lf; } - hOldFont = SelectObject(c->hDC, s->hFont); + s->font_cache = item; + hOldFont = SelectObject(c->hDC, item->hFont); /* should be cached too, maybe ? */ GetTextMetricsW(c->hDC, &s->tm); return hOldFont; }
-void ME_UnselectStyleFont(ME_Context *c, ME_Style *s, HFONT hOldFont) +static void release_font_cache(ME_FontCacheItem *item) { - int i; - - assert(s); - SelectObject(c->hDC, hOldFont); - for (i=0; i<HFONT_CACHE_SIZE; i++) - { - ME_FontCacheItem *pItem = &c->editor->pFontCache[i]; - if (pItem->hFont == s->hFont && pItem->nRefs > 0) + if (item->nRefs > 0) { - pItem->nRefs--; - pItem->nAge = 0; - s->hFont = NULL; - return; + item->nRefs--; + item->nAge = 0; } - } - assert(0 == "UnselectStyleFont without SelectStyleFont"); }
-static void ME_DestroyStyle(ME_Style *s) { - if (s->hFont) +void ME_UnselectStyleFont(ME_Context *c, ME_Style *s, HFONT hOldFont) +{ + SelectObject(c->hDC, hOldFont); + release_font_cache(s->font_cache); + s->font_cache = NULL; +} + +static void ME_DestroyStyle(ME_Style *s) +{ + if (s->font_cache) { - DeleteObject(s->hFont); - s->hFont = NULL; + release_font_cache( s->font_cache ); + s->font_cache = NULL; } ScriptFreeCache( &s->script_cache ); FREE_OBJ(s);