[PATCH v2 5/8] d3dx9: Implement ID3DXFont_GetGlyphData.

Sven Baars sbaars at codeweavers.com
Mon Jan 27 09:59:21 CST 2020


On 22-01-2020 17:12, Matteo Bruni wrote:
> On Mon, Jan 6, 2020 at 3:35 PM Sven Baars <sbaars at codeweavers.com> wrote:
>> +
>> +    for (i = 0; i < This->glyph_count; i++)
>> +        if (This->glyphs[i].id == glyph)
>> +        {
>> +            if (cellinc)
>> +                *cellinc = This->glyphs[i].cellinc;
>> +            if (blackbox)
>> +                *blackbox = This->glyphs[i].blackbox;
>> +            if (texture)
>> +                *texture = This->glyphs[i].texture;
>> +            if (texture && *texture)
>> +                IDirect3DTexture9_AddRef(This->glyphs[i].texture);
>> +            return D3D_OK;
>> +        }
>> +
>> +    hr = ID3DXFont_PreloadGlyphs(iface, glyph, glyph);
>> +    if (FAILED(hr))
>> +        return hr;
>> +
>> +    /* Try again */
>> +    for (i = 0; i < This->glyph_count; i++)
>> +        if (This->glyphs[i].id == glyph)
>> +        {
>> +            if (cellinc)
>> +                *cellinc = This->glyphs[i].cellinc;
>> +            if (blackbox)
>> +                *blackbox = This->glyphs[i].blackbox;
>> +            if (texture)
>> +                *texture = This->glyphs[i].texture;
>> +            if (texture && *texture)
>> +                IDirect3DTexture9_AddRef(This->glyphs[i].texture);
>> +            return D3D_OK;
>> +        }
> 
> A couple of things. Is this "try once, if not found try again"
> justified by tests? Otherwise it seems easier to call PreloadGlyphs()
> unconditionally (i.e. get rid of the first loop).
> The other one is: given that looking up glyphs is going to be a
> frequent operation, linearly searching an array every time isn't going
> to be ideal. We probably want to use the RB tree from
> include/wine/rbtree.h for storing the glyphs.
> 

Hi Matteo,

I implemented this with an RB tree, and after that tested it with and
without the first lookup. With the first lookup my test program has
about 25% more FPS. This is (partially) because it also has to do a
lookup in PreloadGlyphs to see if it's already present. So removing the
first lookup makes it always preform the lookup twice. I could implement
a helper function for the for loop in PreloadGlyphs that returns the
glyph if you like that better. Should I do that?

Cheers,
Sven



More information about the wine-devel mailing list