diff options
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/text_server_adv/text_server_adv.cpp | 40 | ||||
| -rw-r--r-- | modules/text_server_adv/text_server_adv.h | 5 | ||||
| -rw-r--r-- | modules/text_server_fb/text_server_fb.cpp | 37 | ||||
| -rw-r--r-- | modules/text_server_fb/text_server_fb.h | 5 |
4 files changed, 75 insertions, 12 deletions
diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 5d9bc69d03..bb198c9c2b 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -4019,7 +4019,7 @@ void TextServerAdvanced::full_copy(ShapedTextDataAdvanced *p_shaped) { ShapedTextDataAdvanced *parent = shaped_owner.get_or_null(p_shaped->parent); for (const KeyValue<Variant, ShapedTextDataAdvanced::EmbeddedObject> &E : parent->objects) { - if (E.value.pos >= p_shaped->start && E.value.pos < p_shaped->end) { + if (E.value.start >= p_shaped->start && E.value.start < p_shaped->end) { p_shaped->objects[E.key] = E.value; } } @@ -4319,7 +4319,8 @@ bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Vari ShapedTextDataAdvanced::EmbeddedObject obj; obj.inline_align = p_inline_align; obj.rect.size = p_size; - obj.pos = span.start; + obj.start = span.start; + obj.end = span.end; obj.baseline = p_baseline; sd->spans.push_back(span); @@ -4354,7 +4355,7 @@ bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const V Variant key; if (gl.count == 1) { for (const KeyValue<Variant, ShapedTextDataAdvanced::EmbeddedObject> &E : sd->objects) { - if (E.value.pos == gl.start) { + if (E.value.start == gl.start) { key = E.key; break; } @@ -4405,7 +4406,7 @@ void TextServerAdvanced::_realign(ShapedTextDataAdvanced *p_sd) const { double full_ascent = p_sd->ascent; double full_descent = p_sd->descent; for (KeyValue<Variant, ShapedTextDataAdvanced::EmbeddedObject> &E : p_sd->objects) { - if ((E.value.pos >= p_sd->start) && (E.value.pos < p_sd->end)) { + if ((E.value.start >= p_sd->start) && (E.value.start < p_sd->end)) { if (p_sd->orientation == ORIENTATION_HORIZONTAL) { switch (E.value.inline_align & INLINE_ALIGNMENT_TEXT_MASK) { case INLINE_ALIGNMENT_TO_TOP: { @@ -4617,7 +4618,7 @@ bool TextServerAdvanced::_shape_substr(ShapedTextDataAdvanced *p_new_sd, const S bool find_embedded = false; if (gl.count == 1) { for (const KeyValue<Variant, ShapedTextDataAdvanced::EmbeddedObject> &E : p_sd->objects) { - if (E.value.pos == gl.start) { + if (E.value.start == gl.start) { find_embedded = true; key = E.key; p_new_sd->objects[key] = E.value; @@ -6457,6 +6458,35 @@ Rect2 TextServerAdvanced::_shaped_text_get_object_rect(const RID &p_shaped, cons return sd->objects[p_key].rect; } +Vector2i TextServerAdvanced::_shaped_text_get_object_range(const RID &p_shaped, const Variant &p_key) const { + const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); + ERR_FAIL_NULL_V(sd, Vector2i()); + + MutexLock lock(sd->mutex); + ERR_FAIL_COND_V(!sd->objects.has(p_key), Vector2i()); + return Vector2i(sd->objects[p_key].start, sd->objects[p_key].end); +} + +int64_t TextServerAdvanced::_shaped_text_get_object_glyph(const RID &p_shaped, const Variant &p_key) const { + const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); + ERR_FAIL_NULL_V(sd, -1); + + MutexLock lock(sd->mutex); + ERR_FAIL_COND_V(!sd->objects.has(p_key), -1); + if (!sd->valid) { + const_cast<TextServerAdvanced *>(this)->_shaped_text_shape(p_shaped); + } + const ShapedTextDataAdvanced::EmbeddedObject &obj = sd->objects[p_key]; + int sd_size = sd->glyphs.size(); + const Glyph *sd_glyphs = sd->glyphs.ptr(); + for (int i = 0; i < sd_size; i++) { + if (obj.start == sd_glyphs[i].start) { + return i; + } + } + return -1; +} + Size2 TextServerAdvanced::_shaped_text_get_size(const RID &p_shaped) const { const ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_NULL_V(sd, Size2()); diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index a43ea1e7da..154fe670eb 100644 --- a/modules/text_server_adv/text_server_adv.h +++ b/modules/text_server_adv/text_server_adv.h @@ -476,7 +476,8 @@ class TextServerAdvanced : public TextServerExtension { Vector<Span> spans; struct EmbeddedObject { - int pos = 0; + int start = -1; + int end = -1; InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER; Rect2 rect; double baseline = 0; @@ -963,6 +964,8 @@ public: MODBIND1RC(Array, shaped_text_get_objects, const RID &); MODBIND2RC(Rect2, shaped_text_get_object_rect, const RID &, const Variant &); + MODBIND2RC(Vector2i, shaped_text_get_object_range, const RID &, const Variant &); + MODBIND2RC(int64_t, shaped_text_get_object_glyph, const RID &, const Variant &); MODBIND1RC(Size2, shaped_text_get_size, const RID &); MODBIND1RC(double, shaped_text_get_ascent, const RID &); diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 75374ecab4..1a63e5ac42 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -2893,7 +2893,7 @@ void TextServerFallback::full_copy(ShapedTextDataFallback *p_shaped) { ShapedTextDataFallback *parent = shaped_owner.get_or_null(p_shaped->parent); for (const KeyValue<Variant, ShapedTextDataFallback::EmbeddedObject> &E : parent->objects) { - if (E.value.pos >= p_shaped->start && E.value.pos < p_shaped->end) { + if (E.value.start >= p_shaped->start && E.value.start < p_shaped->end) { p_shaped->objects[E.key] = E.value; } } @@ -3189,7 +3189,8 @@ bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Vari ShapedTextDataFallback::EmbeddedObject obj; obj.inline_align = p_inline_align; obj.rect.size = p_size; - obj.pos = span.start; + obj.start = span.start; + obj.end = span.end; obj.baseline = p_baseline; sd->spans.push_back(span); @@ -3224,7 +3225,7 @@ bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const V Variant key; if (gl.count == 1) { for (const KeyValue<Variant, ShapedTextDataFallback::EmbeddedObject> &E : sd->objects) { - if (E.value.pos == gl.start) { + if (E.value.start == gl.start) { key = E.key; break; } @@ -3273,7 +3274,7 @@ void TextServerFallback::_realign(ShapedTextDataFallback *p_sd) const { double full_ascent = p_sd->ascent; double full_descent = p_sd->descent; for (KeyValue<Variant, ShapedTextDataFallback::EmbeddedObject> &E : p_sd->objects) { - if ((E.value.pos >= p_sd->start) && (E.value.pos < p_sd->end)) { + if ((E.value.start >= p_sd->start) && (E.value.start < p_sd->end)) { if (p_sd->orientation == ORIENTATION_HORIZONTAL) { switch (E.value.inline_align & INLINE_ALIGNMENT_TEXT_MASK) { case INLINE_ALIGNMENT_TO_TOP: { @@ -3394,7 +3395,7 @@ RID TextServerFallback::_shaped_text_substr(const RID &p_shaped, int64_t p_start bool find_embedded = false; if (gl.count == 1) { for (const KeyValue<Variant, ShapedTextDataFallback::EmbeddedObject> &E : sd->objects) { - if (E.value.pos == gl.start) { + if (E.value.start == gl.start) { find_embedded = true; key = E.key; new_sd->objects[key] = E.value; @@ -4308,6 +4309,32 @@ Rect2 TextServerFallback::_shaped_text_get_object_rect(const RID &p_shaped, cons return sd->objects[p_key].rect; } +Vector2i TextServerFallback::_shaped_text_get_object_range(const RID &p_shaped, const Variant &p_key) const { + const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); + ERR_FAIL_NULL_V(sd, Vector2i()); + + MutexLock lock(sd->mutex); + ERR_FAIL_COND_V(!sd->objects.has(p_key), Vector2i()); + return Vector2i(sd->objects[p_key].start, sd->objects[p_key].end); +} + +int64_t TextServerFallback::_shaped_text_get_object_glyph(const RID &p_shaped, const Variant &p_key) const { + const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); + ERR_FAIL_NULL_V(sd, -1); + + MutexLock lock(sd->mutex); + ERR_FAIL_COND_V(!sd->objects.has(p_key), -1); + const ShapedTextDataFallback::EmbeddedObject &obj = sd->objects[p_key]; + int sd_size = sd->glyphs.size(); + const Glyph *sd_glyphs = sd->glyphs.ptr(); + for (int i = 0; i < sd_size; i++) { + if (obj.start == sd_glyphs[i].start) { + return i; + } + } + return -1; +} + Size2 TextServerFallback::_shaped_text_get_size(const RID &p_shaped) const { const ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_NULL_V(sd, Size2()); diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index 54a2a949f0..0db1f7318f 100644 --- a/modules/text_server_fb/text_server_fb.h +++ b/modules/text_server_fb/text_server_fb.h @@ -422,7 +422,8 @@ class TextServerFallback : public TextServerExtension { Vector<Span> spans; struct EmbeddedObject { - int pos = 0; + int start = -1; + int end = -1; InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER; Rect2 rect; double baseline = 0; @@ -831,6 +832,8 @@ public: MODBIND1RC(Array, shaped_text_get_objects, const RID &); MODBIND2RC(Rect2, shaped_text_get_object_rect, const RID &, const Variant &); + MODBIND2RC(Vector2i, shaped_text_get_object_range, const RID &, const Variant &); + MODBIND2RC(int64_t, shaped_text_get_object_glyph, const RID &, const Variant &); MODBIND1RC(Size2, shaped_text_get_size, const RID &); MODBIND1RC(double, shaped_text_get_ascent, const RID &); |
