Fixed up windows/drawtext.cpp.
This commit is contained in:
parent
725a97faba
commit
4b3084c2fe
|
@ -12,7 +12,6 @@ extern void uninitDraw(void);
|
||||||
extern ID2D1HwndRenderTarget *makeHWNDRenderTarget(HWND hwnd);
|
extern ID2D1HwndRenderTarget *makeHWNDRenderTarget(HWND hwnd);
|
||||||
extern uiDrawContext *newContext(ID2D1RenderTarget *);
|
extern uiDrawContext *newContext(ID2D1RenderTarget *);
|
||||||
extern void freeContext(uiDrawContext *);
|
extern void freeContext(uiDrawContext *);
|
||||||
extern ID2D1Brush *createSolidColorBrushInternal(ID2D1RenderTarget *rt, double r, double g, double b, double a);
|
|
||||||
|
|
||||||
// dwrite.cpp
|
// dwrite.cpp
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -46,7 +45,6 @@ struct dwriteAttr {
|
||||||
extern void attrToDWriteAttr(struct dwriteAttr *attr);
|
extern void attrToDWriteAttr(struct dwriteAttr *attr);
|
||||||
extern void dwriteAttrToAttr(struct dwriteAttr *attr);
|
extern void dwriteAttrToAttr(struct dwriteAttr *attr);
|
||||||
#endif
|
#endif
|
||||||
extern void doDrawText(ID2D1RenderTarget *rt, ID2D1Brush *black, double x, double y, uiDrawTextLayout *layout);
|
|
||||||
|
|
||||||
// fontdialog.cpp
|
// fontdialog.cpp
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -483,36 +483,3 @@ void uiDrawRestore(uiDrawContext *c)
|
||||||
// no need to explicitly addref or release; just transfer the ref
|
// no need to explicitly addref or release; just transfer the ref
|
||||||
c->currentClip = state.clip;
|
c->currentClip = state.clip;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO C++-ize the rest of the file
|
|
||||||
|
|
||||||
// TODO document that fully opaque black is the default text color; figure out whether this is upheld in various scenarios on other platforms
|
|
||||||
void uiDrawText(uiDrawContext *c, double x, double y, uiDrawTextLayout *layout)
|
|
||||||
{
|
|
||||||
uiDrawBrush brush;
|
|
||||||
ID2D1Brush *black;
|
|
||||||
|
|
||||||
ZeroMemory(&brush, sizeof (uiDrawBrush));
|
|
||||||
brush.Type = uiDrawBrushTypeSolid;
|
|
||||||
brush.R = 0.0;
|
|
||||||
brush.G = 0.0;
|
|
||||||
brush.B = 0.0;
|
|
||||||
brush.A = 1.0;
|
|
||||||
black = makeBrush(&brush, c->rt);
|
|
||||||
doDrawText(c->rt, black, x, y, layout);
|
|
||||||
black->Release();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO this is a mess
|
|
||||||
ID2D1Brush *createSolidColorBrushInternal(ID2D1RenderTarget *rt, double r, double g, double b, double a)
|
|
||||||
{
|
|
||||||
uiDrawBrush brush;
|
|
||||||
|
|
||||||
ZeroMemory(&brush, sizeof (uiDrawBrush));
|
|
||||||
brush.Type = uiDrawBrushTypeSolid;
|
|
||||||
brush.R = r;
|
|
||||||
brush.G = g;
|
|
||||||
brush.B = b;
|
|
||||||
brush.A = a;
|
|
||||||
return makeBrush(&brush, rt);
|
|
||||||
}
|
|
||||||
|
|
|
@ -77,8 +77,6 @@ uiDrawTextFont *mkTextFont(IDWriteFont *df, BOOL addRef, WCHAR *family, BOOL cop
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We could use a C99-style array initializer like the other backends, but C++ doesn't support those.
|
|
||||||
// But it turns out we need to look up both by uival and dwval, so this loop method is fine...
|
|
||||||
// TODO consider moving these all to dwrite.cpp
|
// TODO consider moving these all to dwrite.cpp
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
|
@ -315,6 +313,7 @@ void uiDrawTextFontGetMetrics(uiDrawTextFont *font, uiDrawTextFontMetrics *metri
|
||||||
metrics->Ascent = scaleUnits(dm.ascent, dm.designUnitsPerEm, font->size);
|
metrics->Ascent = scaleUnits(dm.ascent, dm.designUnitsPerEm, font->size);
|
||||||
metrics->Descent = scaleUnits(dm.descent, dm.designUnitsPerEm, font->size);
|
metrics->Descent = scaleUnits(dm.descent, dm.designUnitsPerEm, font->size);
|
||||||
// TODO what happens if dm.xxx is negative?
|
// TODO what happens if dm.xxx is negative?
|
||||||
|
// TODO remember what this was for
|
||||||
metrics->Leading = scaleUnits(dm.lineGap, dm.designUnitsPerEm, font->size);
|
metrics->Leading = scaleUnits(dm.lineGap, dm.designUnitsPerEm, font->size);
|
||||||
metrics->UnderlinePos = scaleUnits(dm.underlinePosition, dm.designUnitsPerEm, font->size);
|
metrics->UnderlinePos = scaleUnits(dm.underlinePosition, dm.designUnitsPerEm, font->size);
|
||||||
metrics->UnderlineThickness = scaleUnits(dm.underlineThickness, dm.designUnitsPerEm, font->size);
|
metrics->UnderlineThickness = scaleUnits(dm.underlineThickness, dm.designUnitsPerEm, font->size);
|
||||||
|
@ -381,6 +380,31 @@ void uiDrawFreeTextLayout(uiDrawTextLayout *layout)
|
||||||
uiFree(layout);
|
uiFree(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ID2D1SolidColorBrush *mkSolidBrush(ID2D1RenderTarget *rt, double r, double g, double b, double a)
|
||||||
|
{
|
||||||
|
D2D1_BRUSH_PROPERTIES props;
|
||||||
|
D2D1_COLOR_F color;
|
||||||
|
ID2D1SolidColorBrush *brush;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
ZeroMemory(&props, sizeof (D2D1_BRUSH_PROPERTIES));
|
||||||
|
props.opacity = 1.0;
|
||||||
|
// identity matrix
|
||||||
|
props.transform._11 = 1;
|
||||||
|
props.transform._22 = 1;
|
||||||
|
color.r = r;
|
||||||
|
color.g = g;
|
||||||
|
color.b = b;
|
||||||
|
color.a = a;
|
||||||
|
hr = rt->CreateSolidColorBrush(
|
||||||
|
&color,
|
||||||
|
&props,
|
||||||
|
&brush);
|
||||||
|
if (hr != S_OK)
|
||||||
|
logHRESULT(L"error creating solid brush", hr);
|
||||||
|
return brush;
|
||||||
|
}
|
||||||
|
|
||||||
IDWriteTextLayout *prepareLayout(uiDrawTextLayout *layout, ID2D1RenderTarget *rt)
|
IDWriteTextLayout *prepareLayout(uiDrawTextLayout *layout, ID2D1RenderTarget *rt)
|
||||||
{
|
{
|
||||||
IDWriteTextLayout *dl;
|
IDWriteTextLayout *dl;
|
||||||
|
@ -405,7 +429,11 @@ IDWriteTextLayout *prepareLayout(uiDrawTextLayout *layout, ID2D1RenderTarget *rt
|
||||||
case layoutAttrColor:
|
case layoutAttrColor:
|
||||||
if (rt == NULL) // determining extents, not drawing
|
if (rt == NULL) // determining extents, not drawing
|
||||||
break;
|
break;
|
||||||
unkBrush = createSolidColorBrushInternal(rt, attr.components[0], attr.components[1], attr.components[2], attr.components[3]);
|
unkBrush = mkSolidBrush(rt,
|
||||||
|
attr.components[0],
|
||||||
|
attr.components[1],
|
||||||
|
attr.components[2],
|
||||||
|
attr.components[3]);
|
||||||
hr = dl->SetDrawingEffect(unkBrush, range);
|
hr = dl->SetDrawingEffect(unkBrush, range);
|
||||||
unkBrush->Release(); // associated with dl
|
unkBrush->Release(); // associated with dl
|
||||||
break;
|
break;
|
||||||
|
@ -459,20 +487,26 @@ void uiDrawTextLayoutExtents(uiDrawTextLayout *layout, double *width, double *he
|
||||||
dl->Release();
|
dl->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void doDrawText(ID2D1RenderTarget *rt, ID2D1Brush *black, double x, double y, uiDrawTextLayout *layout)
|
void uiDrawText(uiDrawContext *c, double x, double y, uiDrawTextLayout *layout)
|
||||||
{
|
{
|
||||||
IDWriteTextLayout *dl;
|
IDWriteTextLayout *dl;
|
||||||
D2D1_POINT_2F pt;
|
D2D1_POINT_2F pt;
|
||||||
|
ID2D1Brush *black;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
dl = prepareLayout(layout, rt);
|
// TODO document that fully opaque black is the default text color; figure out whether this is upheld in various scenarios on other platforms
|
||||||
|
black = mkSolidBrush(c->rt, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
dl = prepareLayout(layout, c->rt);
|
||||||
pt.x = x;
|
pt.x = x;
|
||||||
pt.y = y;
|
pt.y = y;
|
||||||
// TODO D2D1_DRAW_TEXT_OPTIONS_NO_SNAP?
|
// TODO D2D1_DRAW_TEXT_OPTIONS_NO_SNAP?
|
||||||
// TODO D2D1_DRAW_TEXT_OPTIONS_CLIP?
|
// TODO D2D1_DRAW_TEXT_OPTIONS_CLIP?
|
||||||
// TODO when setting 8.1 as minimum, D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT?
|
// TODO when setting 8.1 as minimum, D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT?
|
||||||
rt->DrawTextLayout(pt, dl, black, D2D1_DRAW_TEXT_OPTIONS_NONE);
|
c->rt->DrawTextLayout(pt, dl, black, D2D1_DRAW_TEXT_OPTIONS_NONE);
|
||||||
dl->Release();
|
dl->Release();
|
||||||
|
|
||||||
|
black->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
void uiDrawTextLayoutSetColor(uiDrawTextLayout *layout, intmax_t startChar, intmax_t endChar, double r, double g, double b, double a)
|
void uiDrawTextLayoutSetColor(uiDrawTextLayout *layout, intmax_t startChar, intmax_t endChar, double r, double g, double b, double a)
|
||||||
|
|
Loading…
Reference in New Issue