Store the line frags array as an ivar instead of allocating and freeing it everytime -layoutLineNewParagraph: is called.

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@15977 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Alexander Malmberg 2003-02-16 16:54:45 +00:00
parent 27e5baeab3
commit 7e1801395c
3 changed files with 44 additions and 32 deletions

View file

@ -1,3 +1,10 @@
2003-02-16 17:48 Alexander Malmberg <alexander@malmberg.org>
* Headers/gnustep/gui/GSHorizontalTypesetter.h,
Source/GSHorizontalTypesetter.m: Store the line frags array as
an ivar instead of allocating and freeing it everytime
-layoutLineNewParagraph: is called.
2003-02-16 15:51 Alexander Malmberg <alexander@malmberg.org>
* Source/NSLayoutManager.m: Bring back the old implementation of

View file

@ -65,6 +65,10 @@
struct GSHorizontalTypesetter_glyph_cache_s *cache;
unsigned int cache_base, cache_size, cache_length;
BOOL at_end;
struct GSHorizontalTypesetter_line_frag_s *line_frags;
int line_frags_num, line_frags_size;
}
+(GSHorizontalTypesetter *) sharedInstance;

View file

@ -65,6 +65,11 @@ cache fairly aggressively without having to worry about memory consumption.
free(cache);
cache = NULL;
}
if (line_frags)
{
free(line_frags);
line_frags = NULL;
}
DESTROY(lock);
[super dealloc];
}
@ -270,7 +275,7 @@ including gi will have been cached.
}
typedef struct
typedef struct GSHorizontalTypesetter_line_frag_s
{
NSRect rect;
float last_used;
@ -380,9 +385,6 @@ typedef struct
*/
#define COMPUTE_BASELINE baseline = line_height - descender
line_frag_t *line_frags = NULL;
int num_line_frags = 0;
[self _cacheMoveTo: curGlyph];
if (!cache_length)
@ -457,26 +459,25 @@ restart:
rects (eg. a text container with "hole"-columns every 100 points and
width 1e8)
*/
num_line_frags = 0;
if (line_frags)
{
free(line_frags);
line_frags = NULL;
}
line_frags_num = 0;
while (1)
{
rect = [curTextContainer lineFragmentRectForProposedRect: remain
sweepDirection: NSLineSweepRight
movementDirection: num_line_frags?NSLineDoesntMove:NSLineMoveDown
movementDirection: line_frags_num?NSLineDoesntMove:NSLineMoveDown
remainingRect: &remain];
if (NSEqualRects(rect,NSZeroRect))
break;
num_line_frags++;
line_frags = realloc(line_frags,sizeof(line_frag_t) * num_line_frags);
line_frags[num_line_frags - 1].rect = rect;
line_frags_num++;
if (line_frags_num > line_frags_size)
{
line_frags_size += 2;
line_frags = realloc(line_frags, sizeof(line_frag_t) * line_frags_size);
}
line_frags[line_frags_num - 1].rect = rect;
}
if (!num_line_frags)
if (!line_frags_num)
{
if (curPoint.y == 0.0 &&
line_height > [curTextContainer containerSize].height)
@ -820,7 +821,7 @@ restart:
lf++;
lfi++;
if (lfi == num_line_frags)
if (lfi == line_frags_num)
{
newParagraph = NO;
break;
@ -847,26 +848,26 @@ restart:
/* Basic layout is done. */
/* Take care of the alignments. */
if (lfi != num_line_frags)
if (lfi != line_frags_num)
{
lf->last_glyph = i;
lf->last_used = p.x;
/* TODO: incorrect if there is more than one line frag */
if ([curParagraphStyle alignment] == NSRightTextAlignment)
[self rightAlignLine: line_frags : num_line_frags];
[self rightAlignLine: line_frags : line_frags_num];
else if ([curParagraphStyle alignment] == NSCenterTextAlignment)
[self centerAlignLine: line_frags : num_line_frags];
[self centerAlignLine: line_frags : line_frags_num];
}
else
{
if ([curParagraphStyle lineBreakMode] == NSLineBreakByWordWrapping &&
[curParagraphStyle alignment] == NSJustifiedTextAlignment)
[self fullJustifyLine: line_frags : num_line_frags];
[self fullJustifyLine: line_frags : line_frags_num];
else if ([curParagraphStyle alignment] == NSRightTextAlignment)
[self rightAlignLine: line_frags : num_line_frags];
[self rightAlignLine: line_frags : line_frags_num];
else if ([curParagraphStyle alignment] == NSCenterTextAlignment)
[self centerAlignLine: line_frags : num_line_frags];
[self centerAlignLine: line_frags : line_frags_num];
lfi--;
}
@ -895,10 +896,16 @@ restart:
usedRect: used_rect];
p = g->pos;
/* TODO: probably don't need to call unless the flags are YES */
[curLayoutManager setDrawsOutsideLineFragment: g->outside_line_frag
forGlyphAtIndex: cache_base + i];
[curLayoutManager setNotShownAttribute: g->dont_show
forGlyphAtIndex: cache_base + i];
if (g->outside_line_frag)
{
[curLayoutManager setDrawsOutsideLineFragment: YES
forGlyphAtIndex: cache_base + i];
}
if (g->dont_show)
{
[curLayoutManager setNotShownAttribute: YES
forGlyphAtIndex: cache_base + i];
}
p.y += baseline;
j = i;
while (i < lf->last_glyph)
@ -935,12 +942,6 @@ restart:
curPoint = NSMakePoint(0,NSMaxY(line_frags->rect));
if (line_frags)
{
free(line_frags);
line_frags = NULL;
}
/* Check if we're at the end. */
{
BOOL valid;