On 1/22/20 7:14 PM, Matteo Bruni wrote:
On Mon, Jan 6, 2020 at 3:36 PM Sven Baars sbaars@codeweavers.com wrote:
+/* DrawText helpers copied from user32 */ +#define TAB 9 +#define LF 10 +#define CR 13 +#define SPACE 32 +static void TEXT_WordBreak(HDC hdc, WCHAR *str, unsigned int max_str,
unsigned int *len_str,
int width, int format, unsigned int chars_fit,
unsigned int *chars_used, SIZE *size)
As I already mentioned in a private email a while back, I don't think copying whole chunks of user32 is going to be a good idea.
ID3DXFont's DrawText is supposed to be quite a bit simpler than the user32 counterpart. I imagine that it should be possible to reimplement the required features without carrying this much stuff over. Maybe Uniscribe can help more, I don't know the API (Nikolay?)
The reason it's exploded like that is because you need access to glyph sequence + positions at the end, to render from glyph-indexed cache. As far as I can tell it should at least support multiple lines.
Uniscribe is lower level, it won't do such layout for you, and that's why existing DrawText has line breaking logic, while using Uniscribe.
There is a way with minimal or potentially no duplication of formatting code - you can use regular DrawTextExW() enhanced metafile context. This will create a number of EXTTEXTOUT records that could be iterated over and rendered. Each record should contain glyph ids, and positions. This way you don't have to deal with formatting at all.
Either way, I'd initially introduce a simpler DrawText implementation (no line breaks, no word breaks, as bare-bones as possible) and then proceed to add features incrementally over a number of patches. That will also make the initial DrawText patch easier to review.