Skip to content

Commit bcebfee

Browse files
authored
Wrap hb_buffer_[s|g]et_cluster_level (#42)
* Wrap hb_buffer_[s|g]et_cluster_level * Use IntEnum class for cluster level
1 parent a5d1b3a commit bcebfee

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

src/uharfbuzz/_harfbuzz.pyx

+18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#cython: language_level=3
2+
from enum import IntEnum
23
from charfbuzz cimport *
34
from libc.stdlib cimport free, malloc
45
from libc.string cimport const_char
@@ -80,6 +81,13 @@ cdef class GlyphPosition:
8081
return self._hb_glyph_position.y_offset
8182

8283

84+
class BufferClusterLevel(IntEnum):
85+
MONOTONE_GRAPHEMES = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
86+
MONOTONE_CHARACTERS = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS
87+
CHARACTERS = HB_BUFFER_CLUSTER_LEVEL_CHARACTERS
88+
DEFAULT = HB_BUFFER_CLUSTER_LEVEL_DEFAULT
89+
90+
8391
cdef class Buffer:
8492
cdef hb_buffer_t* _hb_buffer
8593
cdef object _message_callback
@@ -173,6 +181,16 @@ cdef class Buffer:
173181
hb_buffer_set_script(
174182
self._hb_buffer, hb_script_from_string(cstr, -1))
175183

184+
@property
185+
def cluster_level(self) -> BufferClusterLevel:
186+
level = hb_buffer_get_cluster_level(self._hb_buffer)
187+
return BufferClusterLevel(level)
188+
189+
@cluster_level.setter
190+
def cluster_level(self, value: BufferClusterLevel):
191+
level = BufferClusterLevel(value)
192+
hb_buffer_set_cluster_level(self._hb_buffer, level)
193+
176194
def set_language_from_ot_tag(self, value: str):
177195
cdef bytes packed = value.encode()
178196
cdef char* cstr = packed

src/uharfbuzz/charfbuzz.pxd

+9
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@ cdef extern from "hb.h":
8383
hb_position_t y_offset
8484
hb_var_int_t var
8585

86+
ctypedef enum hb_buffer_cluster_level_t:
87+
HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES
88+
HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS
89+
HB_BUFFER_CLUSTER_LEVEL_CHARACTERS
90+
HB_BUFFER_CLUSTER_LEVEL_DEFAULT
91+
8692
hb_buffer_t* hb_buffer_create()
8793
hb_bool_t hb_buffer_allocation_successful(hb_buffer_t* buffer)
8894
void hb_buffer_add_codepoints(
@@ -116,6 +122,9 @@ cdef extern from "hb.h":
116122
void hb_buffer_set_script(hb_buffer_t* buffer, hb_script_t script)
117123
hb_language_t hb_buffer_get_language(hb_buffer_t* buffer)
118124
void hb_buffer_set_language(hb_buffer_t* buffer, hb_language_t language)
125+
void hb_buffer_set_cluster_level(hb_buffer_t *buffer,
126+
hb_buffer_cluster_level_t cluster_level)
127+
hb_buffer_cluster_level_t hb_buffer_get_cluster_level(hb_buffer_t *buffer)
119128
void hb_buffer_destroy(hb_buffer_t* buffer)
120129
ctypedef hb_bool_t (*hb_buffer_message_func_t) (
121130
hb_buffer_t *buffer,

tests/test_uharfbuzz.py

+30
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,36 @@ def test_guess_set_segment_properties(self):
9292
buf.set_language_from_ot_tag("BGR")
9393
assert buf.language == "bg"
9494

95+
def test_cluster_level(self):
96+
buf = hb.Buffer()
97+
98+
assert buf.cluster_level == hb.BufferClusterLevel.DEFAULT
99+
100+
buf.cluster_level = hb.BufferClusterLevel.MONOTONE_CHARACTERS
101+
assert buf.cluster_level == hb.BufferClusterLevel.MONOTONE_CHARACTERS
102+
103+
buf.cluster_level = hb.BufferClusterLevel.MONOTONE_GRAPHEMES
104+
assert buf.cluster_level == hb.BufferClusterLevel.MONOTONE_GRAPHEMES
105+
106+
buf.cluster_level = hb.BufferClusterLevel.CHARACTERS
107+
assert buf.cluster_level == hb.BufferClusterLevel.CHARACTERS
108+
109+
buf.cluster_level = hb.BufferClusterLevel.DEFAULT
110+
assert buf.cluster_level == hb.BufferClusterLevel.DEFAULT
111+
112+
def test_cluster_level_int(self):
113+
buf = hb.Buffer()
114+
115+
assert buf.cluster_level == 0
116+
117+
buf.cluster_level = 1
118+
assert buf.cluster_level == 1
119+
120+
with pytest.raises(ValueError):
121+
# 5 is not a valid BufferClusterLevel
122+
buf.cluster_level = 5
123+
assert buf.cluster_level == 1
124+
95125

96126
class TestShape:
97127
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)