Fixed compile errors. Jesus.

Runtime errors next.
This commit is contained in:
Pietro Gagliardi 2017-01-20 03:24:06 -05:00
parent cac390a821
commit c0781a13ae
5 changed files with 62 additions and 56 deletions

View File

@ -1,5 +1,8 @@
// 6 april 2015 // 6 april 2015
// this must go outside other extern "C" blocks, otherwise we'll get double-declaration errors
#include "utf.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -7,7 +10,6 @@ extern "C" {
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include "controlsigs.h" #include "controlsigs.h"
#include "utf.h"
extern uiInitOptions options; extern uiInitOptions options;

View File

@ -237,30 +237,6 @@ 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)
{ {

View File

@ -1,36 +1,41 @@
// 17 january 2017 // 17 january 2017
#include "uipriv_windows.hpp" #include "uipriv_windows.hpp"
#include "draw.hpp"
struct uiDrawTextLayout { struct uiDrawTextLayout {
IDWriteTextFormat *format; IDWriteTextFormat *format;
IDWriteTextLayout *layout; IDWriteTextLayout *layout;
UINT32 *nLines; UINT32 nLines;
struct lineInfo *lineInfo; struct lineInfo *lineInfo;
// for converting DirectWrite indices to byte offsets // for converting DirectWrite indices to byte offsets
size_t *u16tou8; size_t *u16tou8;
size_t nu16tou8; // TODO I don't like the casing of this name; is it even necessary? size_t nu16tou8; // TODO I don't like the casing of this name; is it even necessary?
}; };
// TODO copy notes about DirectWrite DIPs being equal to Direct2D DIPs here
// typographic points are 1/72 inch; this parameter is 1/96 inch // 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 // fortunately Microsoft does this too, in https://msdn.microsoft.com/en-us/library/windows/desktop/dd371554%28v=vs.85%29.aspx
#define pointSizeToDWriteSize(size) (size * (96.0 / 72.0)) #define pointSizeToDWriteSize(size) (size * (96.0 / 72.0))
static const DWRITE_FONT_STYLE dwriteItalics[] = { // TODO should be const but then I can't operator[] on it; the real solution is to find a way to do designated array initializers in C++11 but I do not know enough C++ voodoo to make it work (it is possible but no one else has actually done it before)
[uiDrawTextItalicNormal] = DWRITE_FONT_STYLE_NORMAL, static std::map<uiDrawTextItalic, DWRITE_FONT_STYLE> dwriteItalics = {
[uiDrawTextItalicOblique] = DWRITE_FONT_STYLE_OBLIQUE, { uiDrawTextItalicNormal, DWRITE_FONT_STYLE_NORMAL },
[uiDrawTextItalicItalic] = DWRITE_FONT_STYLE_ITALIC, { uiDrawTextItalicOblique, DWRITE_FONT_STYLE_OBLIQUE },
{ uiDrawTextItalicItalic, DWRITE_FONT_STYLE_ITALIC },
}; };
static const DWRITE_FONT_STRETCH dwriteStretches[] = { // TODO should be const but then I can't operator[] on it; the real solution is to find a way to do designated array initializers in C++11 but I do not know enough C++ voodoo to make it work (it is possible but no one else has actually done it before)
[uiDrawTextStretchUltraCondensed] = DWRITE_FONT_STRETCH_ULTRA_CONDENSED, static std::map<uiDrawTextStretch, DWRITE_FONT_STRETCH> dwriteStretches = {
[uiDrawTextStretchExtraCondensed] = DWRITE_FONT_STRETCH_EXTRA_CONDENSED, { uiDrawTextStretchUltraCondensed, DWRITE_FONT_STRETCH_ULTRA_CONDENSED },
[uiDrawTextStretchCondensed] = DWRITE_FONT_STRETCH_CONDENSED, { uiDrawTextStretchExtraCondensed, DWRITE_FONT_STRETCH_EXTRA_CONDENSED },
[uiDrawTextStretchSemiCondensed] = DWRITE_FONT_STRETCH_SEMI_CONDENSED, { uiDrawTextStretchCondensed, DWRITE_FONT_STRETCH_CONDENSED },
[uiDrawTextStretchNormal] = DWRITE_FONT_STRETCH_NORMAL, { uiDrawTextStretchSemiCondensed, DWRITE_FONT_STRETCH_SEMI_CONDENSED },
[uiDrawTextStretchSemiExpanded] = DWRITE_FONT_STRETCH_SEMI_EXPANDED, { uiDrawTextStretchNormal, DWRITE_FONT_STRETCH_NORMAL },
[uiDrawTextStretchExpanded] = DWRITE_FONT_STRETCH_EXPANDED, { uiDrawTextStretchSemiExpanded, DWRITE_FONT_STRETCH_SEMI_EXPANDED },
[uiDrawTextStretchExtraExpanded] = DWRITE_FONT_STRETCH_EXTRA_EXPANDED, { uiDrawTextStretchExpanded, DWRITE_FONT_STRETCH_EXPANDED },
[uiDrawTextStretchUltraExpanded] = DWRITE_FONT_STRETCH_ULTRA_EXPANDED, { uiDrawTextStretchExtraExpanded, DWRITE_FONT_STRETCH_EXTRA_EXPANDED },
{ uiDrawTextStretchUltraExpanded, DWRITE_FONT_STRETCH_ULTRA_EXPANDED },
}; };
struct lineInfo { struct lineInfo {
@ -56,14 +61,11 @@ static void computeLineInfo(uiDrawTextLayout *tl)
// TODO make sure this is legal; if not, switch to GetMetrics() and use its line count field instead // TODO make sure this is legal; if not, switch to GetMetrics() and use its line count field instead
hr = tl->layout->GetLineMetrics(NULL, 0, &(tl->nLines)); hr = tl->layout->GetLineMetrics(NULL, 0, &(tl->nLines));
switch (hr) { // ugh, HRESULT_TO_WIN32() is an inline function and is not constexpr so we can't use switch here
case S_OK: if (hr == S_OK) {
// TODO what do we do here // TODO what do we do here
case E_NOT_SUFFICIENT_BUFFER: } else if (hr != E_NOT_SUFFICIENT_BUFFER)
break;
default:
logHRESULT(L"error getting number of lines in IDWriteTextLayout", hr); logHRESULT(L"error getting number of lines in IDWriteTextLayout", hr);
}
tl->lineInfo = (struct lineInfo *) uiAlloc(tl->nLines * sizeof (struct lineInfo), "struct lineInfo[] (text layout)"); tl->lineInfo = (struct lineInfo *) uiAlloc(tl->nLines * sizeof (struct lineInfo), "struct lineInfo[] (text layout)");
dlm = new DWRITE_LINE_METRICS[tl->nLines]; dlm = new DWRITE_LINE_METRICS[tl->nLines];
@ -75,12 +77,12 @@ static void computeLineInfo(uiDrawTextLayout *tl)
// assume the first line starts at position 0 and the string flow is incremental // assume the first line starts at position 0 and the string flow is incremental
nextStart = 0; nextStart = 0;
for (i = 0; i < tl->nLines; i++) { for (i = 0; i < tl->nLines; i++) {
tl->lineinfo[i].startPos = nextStart; tl->lineInfo[i].startPos = nextStart;
tl->lineinfo[i].endPos = nextStart + dlm[i].length; tl->lineInfo[i].endPos = nextStart + dlm[i].length;
tl->lineinfo[i].newlineCount = dlm[i].newlineLength; tl->lineInfo[i].newlineCount = dlm[i].newlineLength;
nextStart = tl->lineinfo[i].endpos; nextStart = tl->lineInfo[i].endPos;
hr = layout->HitTestTextRange(line->startPos, (line->endPos - line->newlineCount) - line->startPos, hr = tl->layout->HitTestTextRange(tl->lineInfo[i].startPos, (tl->lineInfo[i].endPos - tl->lineInfo[i].newlineCount) - tl->lineInfo[i].startPos,
0, 0, 0, 0,
&htm, 1, &unused); &htm, 1, &unused);
if (hr == E_NOT_SUFFICIENT_BUFFER) if (hr == E_NOT_SUFFICIENT_BUFFER)
@ -97,7 +99,7 @@ static void computeLineInfo(uiDrawTextLayout *tl)
// TODO on Windows 8.1 and/or 10 we can use DWRITE_LINE_METRICS1 to get specific info about the ascent and descent; do we have an alternative? // TODO on Windows 8.1 and/or 10 we can use DWRITE_LINE_METRICS1 to get specific info about the ascent and descent; do we have an alternative?
// TODO and even on those platforms can we somehow split tyographic leading from spacing? // TODO and even on those platforms can we somehow split tyographic leading from spacing?
// TODO and on that note, can we have both line spacing proportionally above and uniformly below? // TODO and on that note, can we have both line spacing proportionally above and uniformly below?
tl->lineinfo[i].baseline = dlm[i].baseline; tl->lineInfo[i].baseline = dlm[i].baseline;
} }
delete[] dlm; delete[] dlm;
@ -123,7 +125,7 @@ uiDrawTextLayout *uiDrawNewTextLayout(uiAttributedString *s, uiDrawFontDescripto
// TODO figure out what to do about this shorter range (the actual major values are the same (but with different names), so it's just a range issue) // TODO figure out what to do about this shorter range (the actual major values are the same (but with different names), so it's just a range issue)
(DWRITE_FONT_WEIGHT) (defaultFont->Weight), (DWRITE_FONT_WEIGHT) (defaultFont->Weight),
dwriteItalics[defaultFont->Italic], dwriteItalics[defaultFont->Italic],
dwriteStrecthes[defaultFont->Stretch], dwriteStretches[defaultFont->Stretch],
pointSizeToDWriteSize(defaultFont->Size), pointSizeToDWriteSize(defaultFont->Size),
// see http://stackoverflow.com/questions/28397971/idwritefactorycreatetextformat-failing and https://msdn.microsoft.com/en-us/library/windows/desktop/dd368203.aspx // 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? // TODO use the current locale?
@ -133,7 +135,7 @@ uiDrawTextLayout *uiDrawNewTextLayout(uiAttributedString *s, uiDrawFontDescripto
logHRESULT(L"error creating IDWriteTextFormat", hr); logHRESULT(L"error creating IDWriteTextFormat", hr);
hr = dwfactory->CreateTextLayout( hr = dwfactory->CreateTextLayout(
attrstrUTF16(s), attrstrUTF16Len(s), (const WCHAR *) attrstrUTF16(s), attrstrUTF16Len(s),
tl->format, tl->format,
// FLOAT is float, not double, so this should work... TODO // FLOAT is float, not double, so this should work... TODO
FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX,
@ -177,6 +179,31 @@ void uiDrawFreeTextLayout(uiDrawTextLayout *tl)
uiFree(tl); uiFree(tl);
} }
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;
}
void uiDrawText(uiDrawContext *c, uiDrawTextLayout *tl, double x, double y) void uiDrawText(uiDrawContext *c, uiDrawTextLayout *tl, double x, double y)
{ {
D2D1_POINT_2F pt; D2D1_POINT_2F pt;

View File

@ -57,7 +57,7 @@ struct graphemes *graphemes(void *s, size_t len)
g = uiNew(struct graphemes); g = uiNew(struct graphemes);
hr = itemize(str, len, &items, &n); hr = itemize(str, len, &items, &nItems);
if (hr != S_OK) if (hr != S_OK)
logHRESULT(L"error itemizing string for finding grapheme cluster boundaries", hr); logHRESULT(L"error itemizing string for finding grapheme cluster boundaries", hr);
g->len = nItems; g->len = nItems;
@ -72,6 +72,7 @@ struct graphemes *graphemes(void *s, size_t len)
SCRIPT_ITEM *curItem, *nextItem; SCRIPT_ITEM *curItem, *nextItem;
SCRIPT_LOGATTR *logattr; SCRIPT_LOGATTR *logattr;
size_t *curGTP; size_t *curGTP;
int i;
curItem = items + curItemIndex; curItem = items + curItemIndex;
nextItem = curItem + 1; nextItem = curItem + 1;

View File

@ -36,7 +36,7 @@ char *toUTF8(const WCHAR *wstr)
str = (char *) uiAlloc((n + 1) * sizeof (char), "char[]"); str = (char *) uiAlloc((n + 1) * sizeof (char), "char[]");
sp = str; sp = str;
while (*wstr) { while (*wstr) {
wstr = utf16DecodeRune(wstr, &rune); wstr = utf16DecodeRune(wstr, 0, &rune);
n = utf8EncodeRune(rune, sp); n = utf8EncodeRune(rune, sp);
sp += n; sp += n;
} }