summaryrefslogtreecommitdiff
path: root/render/glyph.c
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2007-07-30 17:31:47 -0700
committerCarl Worth <cworth@cworth.org>2007-08-02 22:49:56 -0700
commit516b96387b0e57b524a37a96da22dbeeeb041712 (patch)
tree5fa54ddec7fcdf937b50234223773afc91b234a6 /render/glyph.c
parent4c6abe1c7c8abcf203572bbf86b21d97ea4e756f (diff)
ProcRenderAddGlyphs: Avoid allocating a glyph just to find it cached
This is a cleanup without any real savings (yet). Previously, the implementation would allocate a new glyph, then (often) find it in the cache, and immediately discard the allocated object. This re-organization first uses a new FindGlyphByHash function and only allocates the glyph if nothing is found. This isn't a real savings yet, since FindGlyphByHash currently still does a temporary glyph allocation, but this is expected to be replaced immediately as we switch to an alternate hashing mechanism (SHA1).
Diffstat (limited to 'render/glyph.c')
-rw-r--r--render/glyph.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/render/glyph.c b/render/glyph.c
index 53c00b326..1204c3b79 100644
--- a/render/glyph.c
+++ b/render/glyph.c
@@ -490,6 +490,31 @@ HashGlyph (GlyphPtr glyph)
glyph->size - sizeof (xGlyphInfo));
}
+GlyphPtr
+FindGlyphByHash (CARD32 hash,
+ xGlyphInfo *gi,
+ CARD8 *bits,
+ int format)
+{
+ GlyphRefPtr gr;
+ GlyphPtr template;
+
+ /* XXX: Should handle out-of-memory here */
+ template = AllocateGlyph (gi, format);
+ memcpy ((CARD8 *) (template + 1), bits,
+ template->size - sizeof (xGlyphInfo));
+
+ gr = FindGlyphRef (&globalGlyphs[format],
+ hash, TRUE, template);
+
+ xfree (template);
+
+ if (gr->glyph && gr->glyph != DeletedGlyph)
+ return gr->glyph;
+ else
+ return NULL;
+}
+
#ifdef CHECK_DUPLICATES
void
DuplicateRef (GlyphPtr glyph, char *where)
@@ -572,7 +597,7 @@ AddGlyph (GlyphSetPtr glyphSet, GlyphPtr glyph, Glyph id)
/* Locate existing matching glyph */
hash = HashGlyph (glyph);
gr = FindGlyphRef (&globalGlyphs[glyphSet->fdepth], hash, TRUE, glyph);
- if (gr->glyph && gr->glyph != DeletedGlyph)
+ if (gr->glyph && gr->glyph != DeletedGlyph && gr->glyph != glyph)
{
PictureScreenPtr ps;
int i;
@@ -588,7 +613,7 @@ AddGlyph (GlyphSetPtr glyphSet, GlyphPtr glyph, Glyph id)
xfree (glyph);
glyph = gr->glyph;
}
- else
+ else if (gr->glyph != glyph)
{
gr->glyph = glyph;
gr->signature = hash;