diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c index c4463c0a875..8339b12e9c4 100644 --- a/dlls/riched20/editor.c +++ b/dlls/riched20/editor.c @@ -73,7 +73,7 @@ - EM_GETWORDBREAKPROC - EM_GETWORDBREAKPROCEX - EM_GETWORDWRAPMODE 1.0asian - - EM_SETZOOM 3.0 + + EM_GETZOOM 3.0 - EM_HIDESELECTION - EM_LIMITTEXT + EM_LINEFROMCHAR @@ -119,7 +119,7 @@ - EM_SETWORDBREAKPROC - EM_SETWORDBREAKPROCEX - EM_SETWORDWRAPMODE 1.0asian - - EM_SETZOOM 3.0 + + EM_SETZOOM 3.0 - EM_SHOWSCROLLBAR 2.0 - EM_STOPGROUPTYPING 2.0 + EM_STREAMIN @@ -747,6 +747,7 @@ ME_TextEditor *ME_MakeEditor(HWND hWnd) { ed->nParagraphs = 1; ed->nLastSelStart = ed->nLastSelEnd = 0; ed->nScrollPosY = 0; + ed->nZoomNumerator = ed->nZoomDenominator = 0; for (i=0; ipFontCache[i].nRefs = 0; @@ -1051,7 +1052,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP UNSUPPORTED_MSG(EM_GETUNDONAME) UNSUPPORTED_MSG(EM_GETWORDBREAKPROC) UNSUPPORTED_MSG(EM_GETWORDBREAKPROCEX) - UNSUPPORTED_MSG(EM_GETZOOM) UNSUPPORTED_MSG(EM_HIDESELECTION) UNSUPPORTED_MSG(EM_LIMITTEXT) /* also known as EM_SETLIMITTEXT */ UNSUPPORTED_MSG(EM_PASTESPECIAL) @@ -1079,7 +1079,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP UNSUPPORTED_MSG(EM_SETWORDBREAKPROC) UNSUPPORTED_MSG(EM_SETWORDBREAKPROCEX) UNSUPPORTED_MSG(EM_SHOWSCROLLBAR) - UNSUPPORTED_MSG(EM_SETZOOM) UNSUPPORTED_MSG(WM_SETFONT) UNSUPPORTED_MSG(WM_STYLECHANGING) UNSUPPORTED_MSG(WM_STYLECHANGED) @@ -1580,6 +1579,14 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP FINDTEXTEXW *ex = (FINDTEXTEXW *)lParam; return ME_FindText(editor, wParam, &ex->chrg, ex->lpstrText, &ex->chrgText); } + case EM_GETZOOM: + if (!wParam || !lParam) + return FALSE; + *(int *)wParam = editor->nZoomNumerator; + *(int *)lParam = editor->nZoomDenominator; + return TRUE; + case EM_SETZOOM: + return ME_SetZoom(editor, wParam, lParam); case WM_CREATE: ME_CommitUndo(editor); ME_WrapMarkedParagraphs(editor); @@ -1736,10 +1743,7 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP } case WM_SIZE: { - ME_MarkAllForWrapping(editor); - ME_WrapMarkedParagraphs(editor); - ME_UpdateScrollBar(editor); - ME_Repaint(editor); + ME_RewrapRepaint(editor); return DefWindowProcW(hWnd, msg, wParam, lParam); } case EM_GETOLEINTERFACE: @@ -1755,6 +1759,7 @@ LRESULT WINAPI RichEditANSIWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP return 0L; } + /****************************************************************** * RichEdit10ANSIWndProc (RICHED20.9) */ diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index c4c352c7910..9f5f6bdd0ab 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -191,6 +191,7 @@ void ME_MarkAllForWrapping(ME_TextEditor *editor); /* paint.c */ void ME_PaintContent(ME_TextEditor *editor, HDC hDC, BOOL bOnlyNew, RECT *rcUpdate); void ME_Repaint(ME_TextEditor *editor); +void ME_RewrapRepaint(ME_TextEditor *editor); void ME_UpdateRepaint(ME_TextEditor *editor); void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph); void ME_UpdateScrollBar(ME_TextEditor *editor); @@ -198,6 +199,7 @@ int ME_GetYScrollPos(ME_TextEditor *editor); void ME_EnsureVisible(ME_TextEditor *editor, ME_DisplayItem *pRun); COLORREF ME_GetBackColor(ME_TextEditor *editor); void ME_Scroll(ME_TextEditor *editor, int cx, int cy); +BOOL ME_SetZoom(ME_TextEditor *editor, int numerator, int denominator); /* richole.c */ extern LRESULT CreateIRichEditOle(LPVOID *); diff --git a/dlls/riched20/editstr.h b/dlls/riched20/editstr.h index 40384900c9a..b6df58774cd 100644 --- a/dlls/riched20/editstr.h +++ b/dlls/riched20/editstr.h @@ -269,6 +269,7 @@ typedef struct tagME_TextEditor ME_OutStream *pStream; BOOL bScrollX, bScrollY; int nScrollPosY; + int nZoomNumerator, nZoomDenominator; } ME_TextEditor; typedef struct tagME_Context diff --git a/dlls/riched20/paint.c b/dlls/riched20/paint.c index 41cedd628df..7b734af1ef3 100644 --- a/dlls/riched20/paint.c +++ b/dlls/riched20/paint.c @@ -173,6 +173,17 @@ void ME_UpdateRepaint(ME_TextEditor *editor) ME_SendSelChange(editor); } + +void +ME_RewrapRepaint(ME_TextEditor *editor) +{ + ME_MarkAllForWrapping(editor); + ME_WrapMarkedParagraphs(editor); + ME_UpdateScrollBar(editor); + ME_Repaint(editor); +} + + static void ME_DrawTextWithStyle(ME_Context *c, int x, int y, LPCWSTR szText, int nChars, ME_Style *s, int *width, int nSelFrom, int nSelTo, int ymin, int cy) { HDC hDC = c->hDC; @@ -193,7 +204,17 @@ static void ME_DrawTextWithStyle(ME_Context *c, int x, int y, LPCWSTR szText, in if (s->fmt.dwEffects & CFE_SUBSCRIPT) yTwipsOffset = -s->fmt.yHeight/12; } if (yTwipsOffset) - yOffset = yTwipsOffset*GetDeviceCaps(hDC, LOGPIXELSY)/1440; + { + int numerator = 1; + int denominator = 1; + + if (c->editor->nZoomNumerator) + { + numerator = c->editor->nZoomNumerator; + denominator = c->editor->nZoomDenominator; + } + yOffset = yTwipsOffset * GetDeviceCaps(hDC, LOGPIXELSY) * numerator / denominator / 1440; + } ExtTextOutW(hDC, x, y-yOffset, 0, NULL, szText, nChars, NULL); if (width) { SIZE sz; @@ -484,3 +505,25 @@ void ME_EnsureVisible(ME_TextEditor *editor, ME_DisplayItem *pRun) UpdateWindow(hWnd); } } + + +BOOL +ME_SetZoom(ME_TextEditor *editor, int numerator, int denominator) +{ + /* TODO: Zoom images and objects */ + + if (numerator != 0) + { + if (denominator == 0) + return FALSE; + if (1.0 / 64.0 > (float)numerator / (float)denominator + || (float)numerator / (float)denominator > 64.0) + return FALSE; + } + + editor->nZoomNumerator = numerator; + editor->nZoomDenominator = denominator; + + ME_RewrapRepaint(editor); + return TRUE; +} diff --git a/dlls/riched20/style.c b/dlls/riched20/style.c index 3bc8b9e4173..3cc543a3b9e 100644 --- a/dlls/riched20/style.c +++ b/dlls/riched20/style.c @@ -249,14 +249,23 @@ void ME_DumpStyleToBuf(CHARFORMAT2W *pFmt, char buf[2048]) ME_DumpStyleEffect(&p, "Text protected:", pFmt, CFM_PROTECTED); } -void ME_LogFontFromStyle(HDC hDC, LOGFONTW *lf, ME_Style *s) + +static void +ME_LogFontFromStyle(HDC hDC, LOGFONTW *lf, ME_Style *s, int nZoomNumerator, int nZoomDenominator) { int rx, ry; rx = GetDeviceCaps(hDC, LOGPIXELSX); ry = GetDeviceCaps(hDC, LOGPIXELSY); ZeroMemory(lf, sizeof(LOGFONTW)); lstrcpyW(lf->lfFaceName, s->fmt.szFaceName); - lf->lfHeight = -s->fmt.yHeight*ry/1440; + + if (nZoomNumerator == 0) + { + nZoomNumerator = 1; + nZoomDenominator = 1; + } + lf->lfHeight = -s->fmt.yHeight*ry*nZoomNumerator/nZoomDenominator/1440; + lf->lfWeight = 400; if (s->fmt.dwEffects & s->fmt.dwMask & CFM_BOLD) lf->lfWeight = 700; @@ -294,7 +303,7 @@ HFONT ME_SelectStyleFont(ME_TextEditor *editor, HDC hDC, ME_Style *s) assert(hDC); assert(s); - ME_LogFontFromStyle(hDC, &lf, s); + ME_LogFontFromStyle(hDC, &lf, s, editor->nZoomNumerator, editor->nZoomDenominator); for (i=0; ipFontCache[i].nAge++;