Cleanup: Store BLF Glyph cache with C++ Vector, use std::mutex #118222
|
@ -1376,7 +1376,6 @@ static void blf_font_fill(FontBLF *font)
|
||||||
font->char_width = 1.0f;
|
font->char_width = 1.0f;
|
||||||
font->char_spacing = 0.0f;
|
font->char_spacing = 0.0f;
|
||||||
|
|
||||||
BLI_listbase_clear(&font->cache);
|
|
||||||
font->kerning_cache = nullptr;
|
font->kerning_cache = nullptr;
|
||||||
#if BLF_BLUR_ENABLE
|
#if BLF_BLUR_ENABLE
|
||||||
font->blur = 0;
|
font->blur = 0;
|
||||||
|
@ -1736,7 +1735,7 @@ static FontBLF *blf_font_new_impl(const char *filepath,
|
||||||
const size_t mem_size,
|
const size_t mem_size,
|
||||||
void *ft_library)
|
void *ft_library)
|
||||||
{
|
{
|
||||||
FontBLF *font = (FontBLF *)MEM_callocN(sizeof(FontBLF), "blf_font_new");
|
FontBLF *font = MEM_new<FontBLF>(__func__);
|
||||||
|
|
||||||
font->mem_name = mem_name ? BLI_strdup(mem_name) : nullptr;
|
font->mem_name = mem_name ? BLI_strdup(mem_name) : nullptr;
|
||||||
font->filepath = filepath ? BLI_strdup(filepath) : nullptr;
|
font->filepath = filepath ? BLI_strdup(filepath) : nullptr;
|
||||||
|
@ -1756,8 +1755,6 @@ static FontBLF *blf_font_new_impl(const char *filepath,
|
||||||
|
|
||||||
font->ft_lib = ft_library ? (FT_Library)ft_library : ft_lib;
|
font->ft_lib = ft_library ? (FT_Library)ft_library : ft_lib;
|
||||||
|
|
||||||
BLI_mutex_init(&font->glyph_cache_mutex);
|
|
||||||
|
|
||||||
/* If we have static details about this font file, we don't have to load the Face yet. */
|
/* If we have static details about this font file, we don't have to load the Face yet. */
|
||||||
bool face_needed = true;
|
bool face_needed = true;
|
||||||
|
|
||||||
|
@ -1854,9 +1851,7 @@ void blf_font_free(FontBLF *font)
|
||||||
MEM_freeN(font->mem_name);
|
MEM_freeN(font->mem_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_mutex_end(&font->glyph_cache_mutex);
|
MEM_delete(font);
|
||||||
|
|
||||||
MEM_freeN(font);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
|
@ -75,28 +75,24 @@ static float from_16dot16(FT_Fixed value)
|
||||||
/** \name Glyph Cache
|
/** \name Glyph Cache
|
||||||
* \{ */
|
* \{ */
|
||||||
|
|
||||||
static GlyphCacheBLF *blf_glyph_cache_find(const FontBLF *font, const float size)
|
static GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, const float size)
|
||||||
{
|
{
|
||||||
GlyphCacheBLF *gc = (GlyphCacheBLF *)font->cache.first;
|
for (std::unique_ptr<GlyphCacheBLF> &gc : font->cache) {
|
||||||
while (gc) {
|
|
||||||
if (gc->size == size && (gc->bold == ((font->flags & BLF_BOLD) != 0)) &&
|
if (gc->size == size && (gc->bold == ((font->flags & BLF_BOLD) != 0)) &&
|
||||||
(gc->italic == ((font->flags & BLF_ITALIC) != 0)) &&
|
(gc->italic == ((font->flags & BLF_ITALIC) != 0)) &&
|
||||||
(gc->char_weight == font->char_weight) && (gc->char_slant == font->char_slant) &&
|
(gc->char_weight == font->char_weight) && (gc->char_slant == font->char_slant) &&
|
||||||
(gc->char_width == font->char_width) && (gc->char_spacing == font->char_spacing))
|
(gc->char_width == font->char_width) && (gc->char_spacing == font->char_spacing))
|
||||||
{
|
{
|
||||||
return gc;
|
return gc.get();
|
||||||
}
|
}
|
||||||
gc = gc->next;
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
|
static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
|
||||||
{
|
{
|
||||||
GlyphCacheBLF *gc = (GlyphCacheBLF *)MEM_callocN(sizeof(GlyphCacheBLF), "blf_glyph_cache_new");
|
std::unique_ptr<GlyphCacheBLF> gc = std::make_unique<GlyphCacheBLF>(GlyphCacheBLF{});
|
||||||
|
|
||||||
gc->next = nullptr;
|
|
||||||
gc->prev = nullptr;
|
|
||||||
gc->size = font->size;
|
gc->size = font->size;
|
||||||
gc->bold = ((font->flags & BLF_BOLD) != 0);
|
gc->bold = ((font->flags & BLF_BOLD) != 0);
|
||||||
gc->italic = ((font->flags & BLF_ITALIC) != 0);
|
gc->italic = ((font->flags & BLF_ITALIC) != 0);
|
||||||
|
@ -125,13 +121,14 @@ static GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
|
||||||
gc->fixed_width = 1;
|
gc->fixed_width = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLI_addhead(&font->cache, gc);
|
font->cache.append(std::move(gc));
|
||||||
return gc;
|
|
||||||
|
return font->cache.last().get();
|
||||||
}
|
}
|
||||||
|
|
||||||
GlyphCacheBLF *blf_glyph_cache_acquire(FontBLF *font)
|
GlyphCacheBLF *blf_glyph_cache_acquire(FontBLF *font)
|
||||||
{
|
{
|
||||||
BLI_mutex_lock(&font->glyph_cache_mutex);
|
font->glyph_cache_mutex.lock();
|
||||||
|
|
||||||
GlyphCacheBLF *gc = blf_glyph_cache_find(font, font->size);
|
GlyphCacheBLF *gc = blf_glyph_cache_find(font, font->size);
|
||||||
|
|
||||||
|
@ -144,34 +141,28 @@ GlyphCacheBLF *blf_glyph_cache_acquire(FontBLF *font)
|
||||||
|
|
||||||
void blf_glyph_cache_release(FontBLF *font)
|
void blf_glyph_cache_release(FontBLF *font)
|
||||||
{
|
{
|
||||||
BLI_mutex_unlock(&font->glyph_cache_mutex);
|
font->glyph_cache_mutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void blf_glyph_cache_free(GlyphCacheBLF *gc)
|
GlyphCacheBLF::~GlyphCacheBLF()
|
||||||
{
|
{
|
||||||
for (uint i = 0; i < ARRAY_SIZE(gc->bucket); i++) {
|
for (uint i = 0; i < ARRAY_SIZE(this->bucket); i++) {
|
||||||
while (GlyphBLF *g = static_cast<GlyphBLF *>(BLI_pophead(&gc->bucket[i]))) {
|
while (GlyphBLF *g = static_cast<GlyphBLF *>(BLI_pophead(&this->bucket[i]))) {
|
||||||
blf_glyph_free(g);
|
blf_glyph_free(g);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (gc->texture) {
|
if (this->texture) {
|
||||||
GPU_texture_free(gc->texture);
|
GPU_texture_free(this->texture);
|
||||||
}
|
}
|
||||||
if (gc->bitmap_result) {
|
if (this->bitmap_result) {
|
||||||
MEM_freeN(gc->bitmap_result);
|
MEM_freeN(this->bitmap_result);
|
||||||
}
|
}
|
||||||
MEM_freeN(gc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void blf_glyph_cache_clear(FontBLF *font)
|
void blf_glyph_cache_clear(FontBLF *font)
|
||||||
{
|
{
|
||||||
BLI_mutex_lock(&font->glyph_cache_mutex);
|
std::lock_guard lock{font->glyph_cache_mutex};
|
||||||
|
font->cache.clear_and_shrink();
|
||||||
while (GlyphCacheBLF *gc = static_cast<GlyphCacheBLF *>(BLI_pophead(&font->cache))) {
|
|
||||||
blf_glyph_cache_free(gc);
|
|
||||||
}
|
|
||||||
|
|
||||||
BLI_mutex_unlock(&font->glyph_cache_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -8,6 +8,10 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include "BLI_vector.hh"
|
||||||
|
|
||||||
#include "GPU_texture.h"
|
#include "GPU_texture.h"
|
||||||
#include "GPU_vertex_buffer.h"
|
#include "GPU_vertex_buffer.h"
|
||||||
|
|
||||||
|
@ -113,9 +117,6 @@ struct KerningCacheBLF {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GlyphCacheBLF {
|
struct GlyphCacheBLF {
|
||||||
GlyphCacheBLF *next;
|
|
||||||
GlyphCacheBLF *prev;
|
|
||||||
|
|
||||||
/** Font size. */
|
/** Font size. */
|
||||||
float size;
|
float size;
|
||||||
|
|
||||||
|
@ -139,6 +140,8 @@ struct GlyphCacheBLF {
|
||||||
int bitmap_len;
|
int bitmap_len;
|
||||||
int bitmap_len_landed;
|
int bitmap_len_landed;
|
||||||
int bitmap_len_alloc;
|
int bitmap_len_alloc;
|
||||||
|
|
||||||
|
~GlyphCacheBLF();
|
||||||
};
|
};
|
||||||
|
|
||||||
struct GlyphBLF {
|
struct GlyphBLF {
|
||||||
|
@ -361,7 +364,7 @@ struct FontBLF {
|
||||||
* List of glyph caches (#GlyphCacheBLF) for this font for size, DPI, bold, italic.
|
* List of glyph caches (#GlyphCacheBLF) for this font for size, DPI, bold, italic.
|
||||||
* Use blf_glyph_cache_acquire(font) and blf_glyph_cache_release(font) to access cache!
|
* Use blf_glyph_cache_acquire(font) and blf_glyph_cache_release(font) to access cache!
|
||||||
*/
|
*/
|
||||||
ListBase cache;
|
blender::Vector<std::unique_ptr<GlyphCacheBLF>> cache;
|
||||||
|
|
||||||
/** Cache of unscaled kerning values. Will be NULL if font does not have kerning. */
|
/** Cache of unscaled kerning values. Will be NULL if font does not have kerning. */
|
||||||
KerningCacheBLF *kerning_cache;
|
KerningCacheBLF *kerning_cache;
|
||||||
|
@ -385,5 +388,5 @@ struct FontBLF {
|
||||||
FontBufInfoBLF buf_info;
|
FontBufInfoBLF buf_info;
|
||||||
|
|
||||||
/** Mutex lock for glyph cache. */
|
/** Mutex lock for glyph cache. */
|
||||||
ThreadMutex glyph_cache_mutex;
|
std::mutex glyph_cache_mutex;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue