From d9ff5918b8f1219cf86aa9299ef396362adf20c2 Mon Sep 17 00:00:00 2001 From: maniek2332 Date: Tue, 29 Oct 2024 00:18:25 +0100 Subject: [PATCH 1/2] Using `CUnicodeBuffer` internally for storing string for `TextWidget`, added option to bake additional glyphs during `Font` creation. --- kaacore | 2 +- src/kaa/fonts.pxi | 39 ++++++++++++++++++++++++------ src/kaa/kaacore/fonts.pxd | 8 ++++-- src/kaa/kaacore/unicode_buffer.pxd | 19 +++++++++++++++ 4 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 src/kaa/kaacore/unicode_buffer.pxd diff --git a/kaacore b/kaacore index 3baa19f9..aef66058 160000 --- a/kaacore +++ b/kaacore @@ -1 +1 @@ -Subproject commit 3baa19f963b1db9c0d3df1fa52dd22283b462ab4 +Subproject commit aef660581ac968b6749e2f5c6f943a48734cd488 diff --git a/src/kaa/fonts.pxi b/src/kaa/fonts.pxi index b302e613..067a41a1 100644 --- a/src/kaa/fonts.pxi +++ b/src/kaa/fonts.pxi @@ -1,6 +1,28 @@ +from cpython.unicode cimport ( + PyUnicode_FromKindAndData, PyUnicode_KIND, PyUnicode_DATA, + PyUnicode_GET_LENGTH, +) + from .kaacore.nodes cimport CNodeType from .kaacore.fonts cimport CFont, CTextNode from .kaacore.hashing cimport c_calculate_hash +from .kaacore.unicode_buffer cimport CUnicodeRepresentationSize, CUnicodeView + + +cdef object unicode_view_to_str(CUnicodeView view): + return PyUnicode_FromKindAndData( + view.representation_size(), + view.data(), + view.length(), + ) + + +cdef CUnicodeView str_to_unicode_view(str text): + return CUnicodeView( + PyUnicode_DATA(text), + PyUnicode_GET_LENGTH(text), + (PyUnicode_KIND(text)), + ) cdef class Font: @@ -9,8 +31,11 @@ cdef class Font: cdef void attach_c_font(self, const CFont& c_font): self.c_font = c_font - def __init__(self, str font_filepath): - self.attach_c_font(CFont.load(font_filepath.encode())) + def __init__(self, str font_filepath, str additional_codepoints=None): + if additional_codepoints is None: + self.attach_c_font(CFont.load(font_filepath.encode())) + else: + self.attach_c_font(CFont.load(font_filepath.encode(), str_to_unicode_view(additional_codepoints))) def __eq__(self, Font other): return self.c_font == other.c_font @@ -50,19 +75,19 @@ cdef class TextNode(NodeBase): @property def content(self): - return (self.get_c_node().text.content()).decode() + return unicode_view_to_str(self.get_c_node().text.content()) @content.setter def content(self, str content_text): - self.get_c_node().text.content(content_text.encode()) + self.get_c_node().text.content(str_to_unicode_view(content_text)) @property def text(self): - return (self.get_c_node().text.content()).decode() + return unicode_view_to_str(self.get_c_node().text.content()) @text.setter - def text(self, str text): - self.get_c_node().text.content(text.encode()) + def text(self, str content_text): + self.get_c_node().text.content(str_to_unicode_view(content_text)) @property def font_size(self): diff --git a/src/kaa/kaacore/fonts.pxd b/src/kaa/kaacore/fonts.pxd index 423ca5db..cec1bab1 100644 --- a/src/kaa/kaacore/fonts.pxd +++ b/src/kaa/kaacore/fonts.pxd @@ -2,6 +2,7 @@ from libcpp.string cimport string from libcpp cimport bool from .exceptions cimport raise_py_error +from .unicode_buffer cimport CUnicodeView cdef extern from "kaacore/fonts.h" namespace "kaacore" nogil: @@ -9,13 +10,16 @@ cdef extern from "kaacore/fonts.h" namespace "kaacore" nogil: @staticmethod CFont load(const string& font_filepath) \ except +raise_py_error + @staticmethod + CFont load(const string& font_filepath, const CUnicodeView additional_codepoints) \ + except +raise_py_error bool operator==(const CFont&) cdef cppclass CTextNode "kaacore::TextNode": - string content() \ + CUnicodeView content() \ except +raise_py_error - void content(const string& content) \ + void content(const CUnicodeView content) \ except +raise_py_error double font_size() \ diff --git a/src/kaa/kaacore/unicode_buffer.pxd b/src/kaa/kaacore/unicode_buffer.pxd new file mode 100644 index 00000000..3651dabd --- /dev/null +++ b/src/kaa/kaacore/unicode_buffer.pxd @@ -0,0 +1,19 @@ +from libc.stdint cimport uint8_t +from libcpp.string cimport string +from libcpp cimport bool + +from .exceptions cimport raise_py_error + + +cdef extern from "kaacore/unicode_buffer.h" namespace "kaacore" nogil: + cdef enum CUnicodeRepresentationSize "kaacore::UnicodeRepresentationSize": + ucs1 "kaacore::UnicodeRepresentationSize::ucs1", + ucs2 "kaacore::UnicodeRepresentationSize::ucs2", + ucs4 "kaacore::UnicodeRepresentationSize::ucs4", + + cdef cppclass CUnicodeView "kaacore::UnicodeView": + CUnicodeView() + CUnicodeView(uint8_t* data, size_t length, CUnicodeRepresentationSize representation_size) + CUnicodeRepresentationSize representation_size() const + size_t length() const + uint8_t* data() const From 3e8be45a854455e087c633840e504d8354f30584 Mon Sep 17 00:00:00 2001 From: maniek2332 Date: Sun, 3 Nov 2024 17:21:58 +0100 Subject: [PATCH 2/2] Updated `kaacore`. --- kaacore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kaacore b/kaacore index aef66058..228b9f89 160000 --- a/kaacore +++ b/kaacore @@ -1 +1 @@ -Subproject commit aef660581ac968b6749e2f5c6f943a48734cd488 +Subproject commit 228b9f892d243ccd06613000d9093c6600b4c5ff