| //======================================================================== |
| // |
| // BuiltinFont.cc |
| // |
| // Copyright 2001-2003 Glyph & Cog, LLC |
| // |
| //======================================================================== |
| |
| #include <config.h> |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include "goo/gmem.h" |
| #include "FontEncodingTables.h" |
| #include "BuiltinFont.h" |
| |
| //------------------------------------------------------------------------ |
| |
| BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) { |
| int i, h; |
| |
| size = sizeA; |
| tab = (BuiltinFontWidth **)gmallocn(size, sizeof(BuiltinFontWidth *)); |
| for (i = 0; i < size; ++i) { |
| tab[i] = nullptr; |
| } |
| for (i = 0; i < sizeA; ++i) { |
| h = hash(widths[i].name); |
| widths[i].next = tab[h]; |
| tab[h] = &widths[i]; |
| } |
| } |
| |
| BuiltinFontWidths::~BuiltinFontWidths() { |
| gfree(tab); |
| } |
| |
| bool BuiltinFontWidths::getWidth(const char *name, unsigned short *width) { |
| int h; |
| BuiltinFontWidth *p; |
| |
| h = hash(name); |
| for (p = tab[h]; p; p = p->next) { |
| if (!strcmp(p->name, name)) { |
| *width = p->width; |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| int BuiltinFontWidths::hash(const char *name) { |
| const char *p; |
| unsigned int h; |
| |
| h = 0; |
| for (p = name; *p; ++p) { |
| h = 17 * h + (int)(*p & 0xff); |
| } |
| return (int)(h % size); |
| } |