More font dialog work. Ugh if only I could just use the Windows 7 sample code one...
This commit is contained in:
parent
f3ae17793d
commit
9a1367c0bc
|
@ -115,6 +115,8 @@ static void familyChanged(struct fontDialog *f)
|
||||||
logLastError("error setting font data in styles box in familyChanged()");
|
logLastError("error setting font data in styles box in familyChanged()");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
specifics->Release();
|
||||||
|
|
||||||
// TODO how do we preserve style selection? the real thing seems to have a very elaborate method of doing so
|
// TODO how do we preserve style selection? the real thing seems to have a very elaborate method of doing so
|
||||||
// TODO check error
|
// TODO check error
|
||||||
SendMessageW(f->styleCombobox, CB_SETCURSEL, 0, 0);
|
SendMessageW(f->styleCombobox, CB_SETCURSEL, 0, 0);
|
||||||
|
@ -336,15 +338,29 @@ STDMETHODIMP gdiRenderer::DrawGlyphRun(
|
||||||
IUnknown *clientDrawingEffect)
|
IUnknown *clientDrawingEffect)
|
||||||
{
|
{
|
||||||
IDWriteBitmapRenderTarget *target = (IDWriteBitmapRenderTarget *) clientDrawingContext;
|
IDWriteBitmapRenderTarget *target = (IDWriteBitmapRenderTarget *) clientDrawingContext;
|
||||||
|
RECT dirtyRect;
|
||||||
|
IDWriteRenderingParams *rp;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
return target->DrawGlyphRun(
|
// TODO I cannot believe this is required; we really do need to switch to Direct2D
|
||||||
|
hr = dwfactory->CreateRenderingParams(&rp);
|
||||||
|
if (hr != S_OK)
|
||||||
|
return hr;
|
||||||
|
hr = target->DrawGlyphRun(
|
||||||
baselineOriginX,
|
baselineOriginX,
|
||||||
baselineOriginY,
|
baselineOriginY,
|
||||||
measuringMode,
|
measuringMode,
|
||||||
glyphRun,
|
glyphRun,
|
||||||
NULL,
|
rp,
|
||||||
RGB(0, 0, 0),
|
RGB(0, 0, 0),
|
||||||
NULL);
|
&dirtyRect);
|
||||||
|
rp->Release();
|
||||||
|
if (hr != S_OK)
|
||||||
|
return hr;
|
||||||
|
if (SetBoundsRect(target->GetMemoryDC(), &dirtyRect, DCB_ACCUMULATE) == 0)
|
||||||
|
// TODO
|
||||||
|
return E_FAIL;
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
STDMETHODIMP gdiRenderer::DrawInlineObject(void *clientDrawingContext, FLOAT originX, FLOAT originY, IDWriteInlineObject *inlineObject, BOOL isSideways, BOOL isRightToLeft, IUnknown *clientDrawingEffect)
|
STDMETHODIMP gdiRenderer::DrawInlineObject(void *clientDrawingContext, FLOAT originX, FLOAT originY, IDWriteInlineObject *inlineObject, BOOL isSideways, BOOL isRightToLeft, IUnknown *clientDrawingEffect)
|
||||||
|
@ -375,6 +391,9 @@ static void doPaint(struct fontDialog *f)
|
||||||
IDWriteLocalizedStrings *sampleStrings;
|
IDWriteLocalizedStrings *sampleStrings;
|
||||||
BOOL exists;
|
BOOL exists;
|
||||||
WCHAR *sample;
|
WCHAR *sample;
|
||||||
|
WCHAR *family;
|
||||||
|
WCHAR *wsize;
|
||||||
|
double size;
|
||||||
IDWriteTextFormat *format;
|
IDWriteTextFormat *format;
|
||||||
IDWriteTextLayout *layout;
|
IDWriteTextLayout *layout;
|
||||||
HDC memoryDC;
|
HDC memoryDC;
|
||||||
|
@ -391,24 +410,74 @@ static void doPaint(struct fontDialog *f)
|
||||||
if (hr != S_OK)
|
if (hr != S_OK)
|
||||||
logHRESULT("error creating bitmap render target for font dialog in doPaint()", hr);
|
logHRESULT("error creating bitmap render target for font dialog in doPaint()", hr);
|
||||||
|
|
||||||
|
// TODO why is this needed?
|
||||||
|
// TODO error check
|
||||||
|
{
|
||||||
|
RECT rdraw;
|
||||||
|
|
||||||
|
rdraw.left = 0;
|
||||||
|
rdraw.top = 0;
|
||||||
|
rdraw.right = f->sampleRect.right - f->sampleRect.left;
|
||||||
|
rdraw.bottom = f->sampleRect.bottom - f->sampleRect.top;
|
||||||
|
FillRect(target->GetMemoryDC(), &rdraw, GetSysColorBrush(COLOR_BTNFACE));
|
||||||
|
}
|
||||||
|
|
||||||
renderer = new gdiRenderer;
|
renderer = new gdiRenderer;
|
||||||
renderer->refcount = 1;
|
renderer->refcount = 1;
|
||||||
|
|
||||||
i = SendMessageW(f->familyCombobox, CB_GETCURSEL, 0, 0);
|
i = SendMessageW(f->styleCombobox, CB_GETCURSEL, 0, 0);
|
||||||
if (i == (LRESULT) CB_ERR)
|
if (i == (LRESULT) CB_ERR)
|
||||||
return; // TODO something more appropriate
|
{EndPaint(f->hwnd,&ps);return;} // TODO something more appropriate
|
||||||
font = (IDWriteFont *) SendMessageW(f->styleCombobox, CB_GETITEMDATA, (WPARAM) i, 0);
|
font = (IDWriteFont *) SendMessageW(f->styleCombobox, CB_GETITEMDATA, (WPARAM) i, 0);
|
||||||
if (font == (IDWriteFont *) CB_ERR)
|
if (font == (IDWriteFont *) CB_ERR)
|
||||||
logLastError("error getting font to draw font dialog sample in doPaint()");
|
logLastError("error getting font to draw font dialog sample in doPaint()");
|
||||||
// TOOD allow for a fallback
|
// TOOD allow for a fallback
|
||||||
// TODO exists parameter
|
|
||||||
hr = font->GetInformationalStrings(DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT, &sampleStrings, &exists);
|
hr = font->GetInformationalStrings(DWRITE_INFORMATIONAL_STRING_SAMPLE_TEXT, &sampleStrings, &exists);
|
||||||
if (hr != S_OK)
|
if (hr != S_OK)
|
||||||
logHRESULT("error getting sample sring to draw in font dialog in doPaint()", hr);
|
exists = FALSE;
|
||||||
|
if (exists) {
|
||||||
sample = fontCollectionCorrectString(f->fc, sampleStrings);
|
sample = fontCollectionCorrectString(f->fc, sampleStrings);
|
||||||
sampleStrings->Release();
|
sampleStrings->Release();
|
||||||
|
} else
|
||||||
|
sample = L"TODO get this from GTK+ instead of AaBbYyZz";
|
||||||
|
// TODO get this from the currently selected item
|
||||||
|
family = windowText(f->familyCombobox);
|
||||||
|
// TODO but NOT this
|
||||||
|
wsize = windowText(f->sizeCombobox);
|
||||||
|
// TODO error check?
|
||||||
|
size = _wtof(wsize);
|
||||||
|
uiFree(wsize);
|
||||||
|
|
||||||
// TODO actually draw
|
hr = dwfactory->CreateTextFormat(family,
|
||||||
|
NULL,
|
||||||
|
font->GetWeight(),
|
||||||
|
font->GetStyle(),
|
||||||
|
font->GetStretch(),
|
||||||
|
// typographic points are 1/72 inch; this parameter is 1/96 inch
|
||||||
|
// fortunately Microsoft does this too, in https://msdn.microsoft.com/en-us/library/windows/desktop/dd371554%28v=vs.85%29.aspx
|
||||||
|
size * (96.0 / 72.0),
|
||||||
|
// see http://stackoverflow.com/questions/28397971/idwritefactorycreatetextformat-failing and https://msdn.microsoft.com/en-us/library/windows/desktop/dd368203.aspx
|
||||||
|
// TODO use the current locale again?
|
||||||
|
L"",
|
||||||
|
&format);
|
||||||
|
if (hr != S_OK)
|
||||||
|
logHRESULT("error creating IDWriteTextFormat for font dialog sample in doPaint()", hr);
|
||||||
|
uiFree(family);
|
||||||
|
|
||||||
|
hr = dwfactory->CreateTextLayout(sample, wcslen(sample),
|
||||||
|
format,
|
||||||
|
// FLOAT is float, not double, so this should work... TODO
|
||||||
|
// TODO we don't want wrapping here
|
||||||
|
FLT_MAX, FLT_MAX,
|
||||||
|
&layout);
|
||||||
|
if (hr != S_OK)
|
||||||
|
logHRESULT("error creating IDWriteTextLayout for font dialog sample in doPaint()", hr);
|
||||||
|
|
||||||
|
hr = layout->Draw(target,
|
||||||
|
renderer,
|
||||||
|
0, 0);
|
||||||
|
if (hr != S_OK)
|
||||||
|
logHRESULT("error drawing font dialog sample text in doPaint()", hr);
|
||||||
|
|
||||||
memoryDC = target->GetMemoryDC();
|
memoryDC = target->GetMemoryDC();
|
||||||
if (GetBoundsRect(memoryDC, &memoryRect, 0) == 0)
|
if (GetBoundsRect(memoryDC, &memoryRect, 0) == 0)
|
||||||
|
@ -421,6 +490,9 @@ static void doPaint(struct fontDialog *f)
|
||||||
SRCCOPY | NOMIRRORBITMAP) == 0)
|
SRCCOPY | NOMIRRORBITMAP) == 0)
|
||||||
logLastError("error blitting sample text to font dialog in doPaint()");
|
logLastError("error blitting sample text to font dialog in doPaint()");
|
||||||
|
|
||||||
|
layout->Release();
|
||||||
|
format->Release();
|
||||||
|
if (exists)
|
||||||
uiFree(sample);
|
uiFree(sample);
|
||||||
renderer->Release();
|
renderer->Release();
|
||||||
target->Release();
|
target->Release();
|
||||||
|
@ -455,6 +527,14 @@ static INT_PTR CALLBACK fontDialogDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, L
|
||||||
return FALSE;
|
return FALSE;
|
||||||
familyChanged(f);
|
familyChanged(f);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
// TODO
|
||||||
|
case rcFontStyleCombobox:
|
||||||
|
case rcFontSizeCombobox:
|
||||||
|
if (HIWORD(wParam) != CBN_SELCHANGE)
|
||||||
|
return FALSE;
|
||||||
|
// TODO error check; refine
|
||||||
|
InvalidateRect(f->hwnd, NULL, TRUE);
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
|
|
Loading…
Reference in New Issue