Blender V4.3
vfont.cc File Reference
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cwctype>
#include <optional>
#include "CLG_log.h"
#include "MEM_guardedalloc.h"
#include "BLI_ghash.h"
#include "BLI_listbase.h"
#include "BLI_math_base_safe.h"
#include "BLI_math_matrix.h"
#include "BLI_math_vector.h"
#include "BLI_path_utils.hh"
#include "BLI_rect.h"
#include "BLI_string.h"
#include "BLI_string_utf8.h"
#include "BLI_threads.h"
#include "BLI_utildefines.h"
#include "BLT_translation.hh"
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_vfont_types.h"
#include "BKE_anim_path.h"
#include "BKE_bpath.hh"
#include "BKE_curve.hh"
#include "BKE_global.hh"
#include "BKE_idtype.hh"
#include "BKE_lib_id.hh"
#include "BKE_main.hh"
#include "BKE_object_types.hh"
#include "BKE_packedFile.hh"
#include "BKE_vfont.hh"
#include "BKE_vfontdata.hh"
#include "BLO_read_write.hh"

Go to the source code of this file.

Classes

struct  TempLineInfo
 
struct  VFontToCurveIter
 
struct  VFontCursor_Params
 
struct  TextBoxBounds_ForCursor
 

Macros

#define MARGIN_X_MIN   (xof_scale + tb_scale.x)
 
#define MARGIN_Y_MIN   (yof_scale + tb_scale.y)
 

Functions

static PackedFileget_builtin_packedfile (void)
 
static void vfont_init_data (ID *id)
 
static void vfont_copy_data (Main *, std::optional< Library * >, ID *id_dst, const ID *, const int flag)
 
static void vfont_free_data (ID *id)
 
static void vfont_foreach_path (ID *id, BPathForeachPathData *bpath_data)
 
static void vfont_blend_write (BlendWriter *writer, ID *id, const void *id_address)
 
static void vfont_blend_read_data (BlendDataReader *reader, ID *id)
 
void BKE_vfont_free_data (VFont *vfont)
 
bool BKE_vfont_is_builtin (const VFont *vfont)
 
void BKE_vfont_builtin_register (const void *mem, int size)
 
static VFontDatavfont_get_data (VFont *vfont)
 
VFontBKE_vfont_load (Main *bmain, const char *filepath)
 
VFontBKE_vfont_load_exists_ex (Main *bmain, const char *filepath, bool *r_exists)
 
VFontBKE_vfont_load_exists (Main *bmain, const char *filepath)
 
static VFontwhich_vfont (Curve *cu, const CharInfo *info)
 
VFontBKE_vfont_builtin_get ()
 
static VCharfind_vfont_char (const VFontData *vfd, uint character)
 
static void build_underline (Curve *cu, ListBase *nubase, const rctf *rect, float yofs, float rot, int charidx, short mat_nr, const float font_size)
 
void BKE_vfont_build_char (Curve *cu, ListBase *nubase, uint character, const CharInfo *info, float ofsx, float ofsy, float rot, int charidx, const float fsize)
 
int BKE_vfont_select_get (Object *ob, int *r_start, int *r_end)
 
void BKE_vfont_select_clamp (Object *ob)
 
static float char_width (Curve *cu, VChar *che, const CharInfo *info)
 
static void textbox_scale (TextBox *tb_dst, const TextBox *tb_src, float scale)
 
static float vfont_ascent (const VFontData *vfd)
 
static float vfont_descent (const VFontData *vfd)
 
static bool vfont_to_curve (Object *ob, Curve *cu, const eEditFontMode mode, VFontToCurveIter *iter_data, VFontCursor_Params *cursor_params, ListBase *r_nubase, const char32_t **r_text, int *r_text_len, bool *r_text_free, CharTrans **r_chartransdata)
 
bool BKE_vfont_to_curve_ex (Object *ob, Curve *cu, const eEditFontMode mode, ListBase *r_nubase, const char32_t **r_text, int *r_text_len, bool *r_text_free, CharTrans **r_chartransdata)
 
int BKE_vfont_cursor_to_text_index (Object *ob, const float cursor_location[2])
 
bool BKE_vfont_to_curve_nubase (Object *ob, const eEditFontMode mode, ListBase *r_nubase)
 
bool BKE_vfont_to_curve (Object *ob, const eEditFontMode mode)
 

Variables

static CLG_LogRef LOG = {"bke.data_transfer"}
 
static ThreadRWMutex vfont_rwlock = BLI_RWLOCK_INITIALIZER
 
const void * builtin_font_data = nullptr
 
int builtin_font_size = 0
 
IDTypeInfo IDType_ID_VF
 

VFont Mouse Cursor to Text Offset

This is an optional argument to vfont_to_curve for getting the text offset into the string at a mouse cursor location. Used for getting text cursor (caret) position or selection range.

#define FONT_TO_CURVE_SCALE_ITERATIONS   20
 
#define FONT_TO_CURVE_SCALE_THRESHOLD   0.0001f
 
enum  { VFONT_TO_CURVE_INIT = 0 , VFONT_TO_CURVE_BISECT , VFONT_TO_CURVE_SCALE_ONCE , VFONT_TO_CURVE_DONE }
 

VFont Clipboard

struct { 
 
   char32_t *   text_buffer 
 
   CharInfo *   info_buffer 
 
   size_t   len_utf32 
 
   size_t   len_utf8 
 
g_vfont_clipboard = {nullptr} 
 
void BKE_vfont_clipboard_free ()
 
void BKE_vfont_clipboard_set (const char32_t *text_buf, const CharInfo *info_buf, const size_t len)
 
void BKE_vfont_clipboard_get (char32_t **r_text_buf, CharInfo **r_info_buf, size_t *r_len_utf8, size_t *r_len_utf32)
 

Macro Definition Documentation

◆ FONT_TO_CURVE_SCALE_ITERATIONS

#define FONT_TO_CURVE_SCALE_ITERATIONS   20

Definition at line 768 of file vfont.cc.

Referenced by BKE_vfont_cursor_to_text_index(), and BKE_vfont_to_curve_ex().

◆ FONT_TO_CURVE_SCALE_THRESHOLD

#define FONT_TO_CURVE_SCALE_THRESHOLD   0.0001f

Definition at line 769 of file vfont.cc.

Referenced by vfont_to_curve().

◆ MARGIN_X_MIN

#define MARGIN_X_MIN   (xof_scale + tb_scale.x)

Referenced by vfont_to_curve().

◆ MARGIN_Y_MIN

#define MARGIN_Y_MIN   (yof_scale + tb_scale.y)

Referenced by vfont_to_curve().

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
VFONT_TO_CURVE_INIT 
VFONT_TO_CURVE_BISECT 
VFONT_TO_CURVE_SCALE_ONCE 
VFONT_TO_CURVE_DONE 

Definition at line 761 of file vfont.cc.

Function Documentation

◆ BKE_vfont_build_char()

◆ BKE_vfont_builtin_get()

VFont * BKE_vfont_builtin_get ( )

Return the built-in VFont, without adding a user (the user-count may be zero). The caller is responsible for adding a user.

Definition at line 422 of file vfont.cc.

References BKE_vfont_is_builtin(), BKE_vfont_load(), BLI_assert, FO_BUILTIN_NAME, G_MAIN, VFont::id, id_us_min(), LISTBASE_FOREACH, and ID::us.

Referenced by BKE_curve_init(), font_unlink_exec(), blender::nodes::node_geo_string_to_curves_cc::node_init(), and txt_add_object().

◆ BKE_vfont_builtin_register()

void BKE_vfont_builtin_register ( const void * mem,
int size )

Definition at line 237 of file vfont.cc.

References builtin_font_data, builtin_font_size, and size().

Referenced by main(), and BlendfileLoadingBaseTest::SetUpTestCase().

◆ BKE_vfont_clipboard_free()

void BKE_vfont_clipboard_free ( )

Definition at line 2063 of file vfont.cc.

References g_vfont_clipboard, and MEM_SAFE_FREE.

Referenced by BKE_vfont_clipboard_set(), paste_text_exec(), and WM_exit_ex().

◆ BKE_vfont_clipboard_get()

void BKE_vfont_clipboard_get ( char32_t ** r_text_buf,
CharInfo ** r_info_buf,
size_t * r_len_utf8,
size_t * r_len_utf32 )

Definition at line 2101 of file vfont.cc.

References g_vfont_clipboard.

Referenced by copy_selection(), paste_selection(), and paste_text_exec().

◆ BKE_vfont_clipboard_set()

void BKE_vfont_clipboard_set ( const char32_t * text_buf,
const CharInfo * info_buf,
const size_t len )

◆ BKE_vfont_cursor_to_text_index()

◆ BKE_vfont_free_data()

◆ BKE_vfont_is_builtin()

bool BKE_vfont_is_builtin ( const VFont * vfont)

◆ BKE_vfont_load()

◆ BKE_vfont_load_exists()

VFont * BKE_vfont_load_exists ( Main * bmain,
const char * filepath )

Definition at line 403 of file vfont.cc.

References BKE_vfont_load_exists_ex().

◆ BKE_vfont_load_exists_ex()

VFont * BKE_vfont_load_exists_ex ( Main * bmain,
const char * filepath,
bool * r_exists )

◆ BKE_vfont_select_clamp()

void BKE_vfont_select_clamp ( Object * ob)

◆ BKE_vfont_select_get()

◆ BKE_vfont_to_curve()

bool BKE_vfont_to_curve ( Object * ob,
eEditFontMode mode )
Warning
Expects to have access to evaluated data (i.e. passed object should be evaluated one).

Definition at line 2044 of file vfont.cc.

References BKE_vfont_to_curve_ex(), Object::data, and Curve::nurb.

Referenced by move_cursor(), and text_update_edited().

◆ BKE_vfont_to_curve_ex()

◆ BKE_vfont_to_curve_nubase()

bool BKE_vfont_to_curve_nubase ( Object * ob,
const eEditFontMode mode,
ListBase * r_nubase )

◆ build_underline()

static void build_underline ( Curve * cu,
ListBase * nubase,
const rctf * rect,
float yofs,
float rot,
int charidx,
short mat_nr,
const float font_size )
static

◆ char_width()

static float char_width ( Curve * cu,
VChar * che,
const CharInfo * info )
static

Definition at line 682 of file vfont.cc.

References CU_CHINFO_SMALLCAPS_CHECK, CharInfo::flag, Curve::smallcaps_scale, and VChar::width.

Referenced by vfont_to_curve().

◆ find_vfont_char()

static VChar * find_vfont_char ( const VFontData * vfd,
uint character )
static

Definition at line 438 of file vfont.cc.

References BLI_ghash_lookup(), VFontData::characters, and POINTER_FROM_UINT.

Referenced by BKE_vfont_build_char(), and vfont_to_curve().

◆ get_builtin_packedfile()

static PackedFile * get_builtin_packedfile ( void )
static

◆ textbox_scale()

static void textbox_scale ( TextBox * tb_dst,
const TextBox * tb_src,
float scale )
static

Definition at line 695 of file vfont.cc.

References TextBox::h, TextBox::w, TextBox::x, and TextBox::y.

Referenced by vfont_to_curve().

◆ vfont_ascent()

static float vfont_ascent ( const VFontData * vfd)
static

Font metric values explained:

Baseline: Line where the text "rests", used as the origin vertical position for the glyphs. Em height: Space most glyphs should fit within. Ascent: the recommended distance above the baseline to fit most characters. Descent: the recommended distance below the baseline to fit most characters.

We obtain ascent and descent from the font itself (FT_Face->ascender / face->height). And in some cases it is even the same value as FT_Face->bbox.yMax/yMin (font top and bottom respectively).

The em_height here is relative to FT_Face->bbox.

Definition at line 788 of file vfont.cc.

References VFontData::ascender, and VFontData::em_height.

Referenced by vfont_descent(), and vfont_to_curve().

◆ vfont_blend_read_data()

static void vfont_blend_read_data ( BlendDataReader * reader,
ID * id )
static

◆ vfont_blend_write()

static void vfont_blend_write ( BlendWriter * writer,
ID * id,
const void * id_address )
static

◆ vfont_copy_data()

static void vfont_copy_data ( Main * ,
std::optional< Library * > ,
ID * id_dst,
const ID * ,
const int flag )
static

◆ vfont_descent()

static float vfont_descent ( const VFontData * vfd)
static

Definition at line 792 of file vfont.cc.

References VFontData::em_height, and vfont_ascent().

Referenced by vfont_to_curve().

◆ vfont_foreach_path()

◆ vfont_free_data()

static void vfont_free_data ( ID * id)
static

Free (or release) any data used by this font (does not free the font itself).

Definition at line 110 of file vfont.cc.

References BKE_packedfile_free(), BKE_vfont_free_data(), and VFont::packedfile.

◆ vfont_get_data()

◆ vfont_init_data()

static void vfont_init_data ( ID * id)
static

◆ vfont_to_curve()

static bool vfont_to_curve ( Object * ob,
Curve * cu,
const eEditFontMode mode,
VFontToCurveIter * iter_data,
VFontCursor_Params * cursor_params,
ListBase * r_nubase,
const char32_t ** r_text,
int * r_text_len,
bool * r_text_free,
CharTrans ** r_chartransdata )
static

Definition at line 813 of file vfont.cc.

References Curve::align_y, atan2f, VFontToCurveIter::bisect, BKE_anim_path_get_length(), BKE_nurbList_free(), BKE_vfont_build_char(), BKE_vfont_select_get(), BKE_vfontdata_char_from_freetypefont(), BKE_where_on_path(), BLI_assert, BLI_assert_msg, BLI_rctf_mul(), BLI_rw_mutex_lock(), BLI_rw_mutex_unlock(), BLI_str_utf8_as_utf32(), bounds(), TextBoxBounds_ForCursor::bounds, build_underline(), ceilf, TextBoxBounds_ForCursor::char_index_last, TempLineInfo::char_nr, char_width(), CLAMP, clamp_f(), CLAMP_MIN, compare_ff_relative(), copy_m3_m4(), cosf, CU_ALIGN_X_FLUSH, CU_ALIGN_X_JUSTIFY, CU_ALIGN_X_LEFT, CU_ALIGN_X_MIDDLE, CU_ALIGN_X_RIGHT, CU_ALIGN_Y_BOTTOM, CU_ALIGN_Y_BOTTOM_BASELINE, CU_ALIGN_Y_CENTER, CU_ALIGN_Y_TOP, CU_ALIGN_Y_TOP_BASELINE, CU_CHINFO_OVERFLOW, CU_CHINFO_SMALLCAPS, CU_CHINFO_SMALLCAPS_CHECK, CU_CHINFO_STYLE_ALL, CU_CHINFO_UNDERLINE, CU_CHINFO_WRAP, CU_OVERFLOW_NONE, CU_OVERFLOW_SCALE, CU_OVERFLOW_TRUNCATE, VFontCursor_Params::cursor_location, CharTrans::dobreak, Curve::editfont, ELEM, VFontData::em_height, find_vfont_char(), CharInfo::flag, flag, float, FLT_MAX, FO_CURS, FO_CURSDOWN, FO_CURSUP, FO_DUPLI, FO_EDIT, FO_PAGEDOWN, FO_PAGEUP, FO_SELCHANGE, FONT_TO_CURVE_SCALE_THRESHOLD, Curve::fsize, Curve::fsize_realtime, EditFontSelBox::h, TextBox::h, invert_m4_m4(), VFontToCurveIter::iteraction, CharInfo::kern, EditFont::len, Curve::len_char32, len_squared_v2v2(), Curve::linedist, CharTrans::linenr, Curve::lines, M_PI, MARGIN_X_MIN, MARGIN_Y_MIN, CharInfo::mat_nr, VFontToCurveIter::max, max_ff(), max_ii(), MAXTEXTBOX, MEM_calloc_arrayN, MEM_freeN(), MEM_malloc_arrayN, VFontToCurveIter::min, min_ff(), min_ii(), Object::mode, mul_m3_m3m3(), mul_v3_fl(), normalize_v3(), OB_CURVES_LEGACY, OB_FONT, OB_MODE_EDIT, Curve::overflow, EditFont::pos, VFontCursor_Params::r_string_offset, CharTrans::rot, EditFontSelBox::rot, rotate_v2_v2fl(), Object::runtime, safe_divide(), VFontToCurveIter::scale_to_fit, EditFont::selboxes, EditFont::selboxes_len, EditFont::select_char_info_flag, EditFont::selend, EditFont::selstart, sinf, Curve::spacemode, Curve::spacing, VFontToCurveIter::status, Curve::str, Curve::strinfo, Curve::tb, textbox_scale(), EditFont::textbuf, EditFont::textbufinfo, EditFont::textcurs, Curve::textoncurve, THREAD_LOCK_READ, THREAD_LOCK_WRITE, Curve::totbox, Object::totcol, Object::type, Curve::ulheight, Curve::ulpos, unit_m4(), UNLIKELY, Curve::vfont, vfont_ascent(), vfont_descent(), vfont_get_data(), vfont_rwlock, VFONT_TO_CURVE_BISECT, VFONT_TO_CURVE_DONE, VFONT_TO_CURVE_INIT, VFONT_TO_CURVE_SCALE_ONCE, EditFontSelBox::w, TextBox::w, which_vfont(), VFontToCurveIter::word_wrap, Curve::wordspace, TempLineInfo::wspace_nr, EditFontSelBox::x, TextBox::x, TempLineInfo::x_max, TempLineInfo::x_min, rctf::xmax, rctf::xmin, CharTrans::xof, Curve::xof, EditFontSelBox::y, TextBox::y, rctf::ymax, rctf::ymin, CharTrans::yof, and Curve::yof.

Referenced by BKE_vfont_cursor_to_text_index(), and BKE_vfont_to_curve_ex().

◆ which_vfont()

static VFont * which_vfont ( Curve * cu,
const CharInfo * info )
static

Variable Documentation

◆ builtin_font_data

const void* builtin_font_data = nullptr

◆ builtin_font_size

int builtin_font_size = 0

◆ [struct]

struct { ... } g_vfont_clipboard

◆ IDType_ID_VF

IDTypeInfo IDType_ID_VF
Initial value:
= {
0,
sizeof(VFont),
"Font",
N_("fonts"),
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
}
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
Definition BKE_idtype.hh:39
@ IDTYPE_FLAGS_NO_ANIMDATA
Definition BKE_idtype.hh:41
#define BLT_I18NCONTEXT_ID_VFONT
#define FILTER_ID_VF
Definition DNA_ID.h:1189
@ INDEX_ID_VF
Definition DNA_ID.h:1268
@ ID_VF
struct VFont VFont
#define N_(msgid)
static void vfont_init_data(ID *id)
Definition vfont.cc:66
static void vfont_blend_read_data(BlendDataReader *reader, ID *id)
Definition vfont.cc:160
static void vfont_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *, const int flag)
Definition vfont.cc:86
static void vfont_foreach_path(ID *id, BPathForeachPathData *bpath_data)
Definition vfont.cc:121
static void vfont_blend_write(BlendWriter *writer, ID *id, const void *id_address)
Definition vfont.cc:138
static void vfont_free_data(ID *id)
Definition vfont.cc:110

Definition at line 168 of file vfont.cc.

◆ info_buffer

CharInfo* info_buffer

Definition at line 2058 of file vfont.cc.

◆ len_utf32

size_t len_utf32

Definition at line 2059 of file vfont.cc.

◆ len_utf8

size_t len_utf8

Definition at line 2060 of file vfont.cc.

Referenced by copy_selection(), font_select_to_buffer(), and paste_text_exec().

◆ LOG

CLG_LogRef LOG = {"bke.data_transfer"}
static

Definition at line 54 of file vfont.cc.

Referenced by get_builtin_packedfile(), and vfont_get_data().

◆ text_buffer

char32_t* text_buffer

Definition at line 2057 of file vfont.cc.

◆ vfont_rwlock

ThreadRWMutex vfont_rwlock = BLI_RWLOCK_INITIALIZER
static

Definition at line 55 of file vfont.cc.

Referenced by vfont_get_data(), and vfont_to_curve().