Codechange: Use reusable temporary buffer in Win32FontCache. (#12666)

This avoids allocating and deleting a temporary buffer for every glyph that is rendered into a sprite.
This commit is contained in:
Peter Nelson 2024-05-17 08:50:59 +01:00 committed by GitHub
parent 4940b6ff0b
commit c85481564f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 4 additions and 4 deletions

View File

@ -10,7 +10,6 @@
#include "../../stdafx.h"
#include "../../debug.h"
#include "../../blitter/factory.hpp"
#include "../../core/alloc_func.hpp"
#include "../../core/math_func.hpp"
#include "../../core/mem_func.hpp"
#include "../../error_func.h"
@ -209,7 +208,7 @@ void Win32FontCache::ClearFontCache()
if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) UserError("Font glyph is too large");
/* Call GetGlyphOutline again with size to actually render the glyph. */
uint8_t *bmp = new uint8_t[size];
uint8_t *bmp = this->render_buffer.Allocate(size);
GetGlyphOutline(this->dc, key, GGO_GLYPH_INDEX | (aa ? GGO_GRAY8_BITMAP : GGO_BITMAP), &gm, size, bmp, &mat);
/* GDI has rendered the glyph, now we allocate a sprite and copy the image into it. */
@ -259,8 +258,6 @@ void Win32FontCache::ClearFontCache()
this->SetGlyphPtr(key, &new_glyph);
delete[] bmp;
return new_glyph.sprite;
}

View File

@ -10,6 +10,7 @@
#ifndef FONT_WIN32_H
#define FONT_WIN32_H
#include "../../core/alloc_type.hpp"
#include "../../fontcache/truetypefontcache.h"
#include "win32.h"
@ -25,6 +26,8 @@ private:
SIZE glyph_size; ///< Maximum size of regular glyphs.
std::string fontname; ///< Cached copy of loaded font facename
ReusableBuffer<uint8_t> render_buffer; ///< Temporary buffer for rendering glyphs.
void SetFontSize(int pixels);
protected: