From 74704f51e33ed3c75389cbac7d998a8a5bf77190 Mon Sep 17 00:00:00 2001 From: Alexander Malmberg Date: Thu, 3 Apr 2003 18:31:25 +0000 Subject: [PATCH] When steping forward at the end of the glyph runs, correctly handle the case where the current run is extended. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@16345 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 7 ++++++ .../gnustep/gui/GSLayoutManager_internal.h | 19 +++++++++------ Source/GSLayoutManager.m | 23 +++++-------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 150f36633..fb6b7706a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2003-04-03 20:28 Alexander Malmberg + + * Headers/gnustep/gui/GSLayoutManager_internal.h, + Source/GSLayoutManager.m: When stepping forward at the end of the + glyph runs, correctly handle the case where the current run is + extended. + 2003-04-02 15:26 Alexander Malmberg * Source/GSHorizontalTypesetter.m: Tweak glyph caching parameters diff --git a/Headers/gnustep/gui/GSLayoutManager_internal.h b/Headers/gnustep/gui/GSLayoutManager_internal.h index 3b662ab97..ae3b9929d 100644 --- a/Headers/gnustep/gui/GSLayoutManager_internal.h +++ b/Headers/gnustep/gui/GSLayoutManager_internal.h @@ -246,18 +246,23 @@ the last run and i==r->head.glyph_length. */ #define GLYPH_STEP_FORWARD(r, i, pos, cpos) \ { \ i++; \ - while (i==r->head.glyph_length) \ + while (i == r->head.glyph_length) \ { \ if (!r->head.next || !r->head.next->complete) \ { \ - if (cpos+r->head.char_length==[_textStorage length]) \ + if (cpos + r->head.char_length == [_textStorage length]) \ break; \ - [self _generateGlyphsUpToCharacter: cpos+r->head.char_length]; \ + /* This call might lead to the current run being extended, so \ + we make sure that we check r->head.glyph_length again. */ \ + [self _generateGlyphsUpToCharacter: cpos + r->head.char_length]; \ + } \ + else \ + { \ + pos += r->head.glyph_length; \ + cpos += r->head.char_length; \ + r = (glyph_run_t *)r->head.next; \ + i = 0; \ } \ - pos+=r->head.glyph_length; \ - cpos+=r->head.char_length; \ - r=(glyph_run_t *)r->head.next; \ - i=0; \ } \ } diff --git a/Source/GSLayoutManager.m b/Source/GSLayoutManager.m index acb2105da..0ee99703f 100644 --- a/Source/GSLayoutManager.m +++ b/Source/GSLayoutManager.m @@ -498,7 +498,7 @@ static glyph_run_t *run_insert(glyph_run_head_t **context) pos += new->head.char_length; } -// [self _glyphDumpRuns]; + [self _sanityChecks]; } @@ -858,22 +858,11 @@ static glyph_run_t *run_insert(glyph_run_head_t **context) cadj = cpos; while (r2->glyphs[i].char_offset + cadj == j) { - i++; - while (i == r2->head.glyph_length) + GLYPH_STEP_FORWARD(r2,i,adj,cadj) + if (i==r2->head.glyph_length) { - if (!r2->head.next || !r2->head.next->complete) - { - if (cadj + r2->head.char_length == [_textStorage length]) - { - last = cadj + r2->head.char_length; - goto found; - } - [self _generateGlyphsUpToCharacter: cadj + r2->head.char_length]; - } - adj += r2->head.glyph_length; - cadj += r2->head.char_length; - r2 = (glyph_run_t *)r2->head.next; - i = 0; + last = cadj + r2->head.char_length; + goto found; } } last = r2->glyphs[i].char_offset + cadj; @@ -998,7 +987,7 @@ places where we switch. *actualRange = range; -// printf("range=(%i+%i) lengthChange=%i\n", range.location, range.length, lengthChange); +// printf("\n +++ range=(%i+%i) lengthChange=%i\n", range.location, range.length, lengthChange); [self _sanityChecks]; // [self _glyphDumpRuns];