[PATCH v2 8/8] d3dx9: Implement ID3DXFont_DrawText.
nsivov at codeweavers.com
Thu Jan 23 04:36:52 CST 2020
On 1/22/20 7:14 PM, Matteo Bruni wrote:
> On Mon, Jan 6, 2020 at 3:36 PM Sven Baars <sbaars at 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.
More information about the wine-devel