Skip to content

Commit

Permalink
Refactor|CompositeBitmapFont|Client: Applied pimpl idiom; cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
danij-deng committed Nov 10, 2013
1 parent d91ec88 commit a300d1b
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 51 deletions.
10 changes: 3 additions & 7 deletions doomsday/client/include/resource/compositebitmapfont.h
Expand Up @@ -44,15 +44,8 @@ class CompositeBitmapFont : public AbstractFont
uint8_t border;
};

/// Definition used to construct this else @c NULL if not applicable.
struct ded_compositefont_s *_def;

/// Character map.
bitmapcompositefont_char_t _chars[MAX_CHARS];

public:
CompositeBitmapFont(fontid_t bindId);
~CompositeBitmapFont();

static CompositeBitmapFont *fromDef(fontid_t bindId, ded_compositefont_t *def);

Expand Down Expand Up @@ -84,6 +77,9 @@ class CompositeBitmapFont : public AbstractFont
RectRaw const *charGeometry(unsigned char ch);
int charWidth(unsigned char ch);
int charHeight(unsigned char ch);

private:
DENG2_PRIVATE(d)
};

#endif // CLIENT_RESOURCE_COMPOSITEBITMAPFONT_H
94 changes: 50 additions & 44 deletions doomsday/client/src/resource/compositebitmapfont.cpp
@@ -1,4 +1,4 @@
/** @file bitmapfont.cpp Composite bitmap font.
/** @file compositebitmapfont.cpp Composite bitmap font.
*
* @authors Copyright © 2003-2013 Jaakko Keränen <jaakko.keranen@iki.fi>
* @authors Copyright © 2006-2013 Daniel Swanson <danij@dengine.net>
Expand Down Expand Up @@ -28,41 +28,52 @@

using namespace de;

CompositeBitmapFont::CompositeBitmapFont(fontid_t bindId)
: AbstractFont(FT_BITMAPCOMPOSITE, bindId)
DENG2_PIMPL(CompositeBitmapFont)
{
_def = 0;
std::memset(_chars, 0, sizeof(_chars));
_flags |= FF_COLORIZE;
}
ded_compositefont_t *def; /// Definition on which "this" font is derived (if any).

CompositeBitmapFont::~CompositeBitmapFont()
{
glDeinit();
}
/// Character map.
bitmapcompositefont_char_t chars[MAX_CHARS];

Instance(Public *i)
: Base(i)
, def(0)
{
zap(chars);
self._flags |= FF_COLORIZE;
}

~Instance()
{
self.glDeinit();
}
};

CompositeBitmapFont::CompositeBitmapFont(fontid_t bindId)
: AbstractFont(FT_BITMAPCOMPOSITE, bindId), d(new Instance(this))
{}

RectRaw const *CompositeBitmapFont::charGeometry(unsigned char chr)
{
glInit();
bitmapcompositefont_char_t *ch = &_chars[chr];
return &ch->geometry;
return &d->chars[chr].geometry;
}

int CompositeBitmapFont::charWidth(unsigned char ch)
{
glInit();
if(_chars[ch].geometry.size.width == 0) return _noCharSize.width;
return _chars[ch].geometry.size.width;
if(d->chars[ch].geometry.size.width == 0) return _noCharSize.width;
return d->chars[ch].geometry.size.width;
}

int CompositeBitmapFont::charHeight(unsigned char ch)
{
glInit();
if(_chars[ch].geometry.size.height == 0) return _noCharSize.height;
return _chars[ch].geometry.size.height;
if(d->chars[ch].geometry.size.height == 0) return _noCharSize.height;
return d->chars[ch].geometry.size.height;
}

static inline texturevariantspecification_t &charTextureSpec()
static texturevariantspecification_t &charTextureSpec()
{
return GL_TextureVariantSpec(TC_UI, TSF_MONOCHROME | TSF_UPSCALE_AND_SHARPEN,
0, 0, 0, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE,
Expand All @@ -71,21 +82,16 @@ static inline texturevariantspecification_t &charTextureSpec()

void CompositeBitmapFont::glInit()
{
Size2Raw avgSize;
int numPatches;
uint i;

if(!_isDirty) return;
if(novideo || isDedicated || BusyMode_Active()) return;

glDeinit();

avgSize.width = avgSize.height = 0;
numPatches = 0;

for(i = 0; i < MAX_CHARS; ++i)
int numPatches = 0;
Size2Raw avgSize;
for(int i = 0; i < MAX_CHARS; ++i)
{
bitmapcompositefont_char_t *ch = &_chars[i];
bitmapcompositefont_char_t *ch = &d->chars[i];
patchid_t patch = ch->patch;
patchinfo_t info;

Expand Down Expand Up @@ -136,7 +142,7 @@ void CompositeBitmapFont::glDeinit()

for(int i = 0; i < 256; ++i)
{
bitmapcompositefont_char_t *ch = &_chars[i];
bitmapcompositefont_char_t *ch = &d->chars[i];
if(!ch->tex) continue;
GL_ReleaseVariantTexture(*ch->tex);
ch->tex = 0;
Expand Down Expand Up @@ -171,31 +177,31 @@ CompositeBitmapFont *CompositeBitmapFont::fromDef(fontid_t bindId, ded_composite
return font;
}

struct ded_compositefont_s *CompositeBitmapFont::definition() const
ded_compositefont_t *CompositeBitmapFont::definition() const
{
return _def;
return d->def;
}

void CompositeBitmapFont::setDefinition(struct ded_compositefont_s *newDef)
void CompositeBitmapFont::setDefinition(ded_compositefont_t *newDef)
{
_def = newDef;
d->def = newDef;
}

void CompositeBitmapFont::rebuildFromDef(ded_compositefont_t *def)
void CompositeBitmapFont::rebuildFromDef(ded_compositefont_t *newDef)
{
LOG_AS("CompositeBitmapFont::rebuildFromDef");

setDefinition(def);
if(!def) return;
setDefinition(newDef);
if(!newDef) return;

for(int i = 0; i < def->charMapCount.num; ++i)
for(int i = 0; i < newDef->charMapCount.num; ++i)
{
if(!def->charMap[i].path) continue;
if(!newDef->charMap[i].path) continue;

try
{
QByteArray path = reinterpret_cast<de::Uri &>(*def->charMap[i].path).resolved().toUtf8();
charSetPatch(def->charMap[i].ch, path.constData());
QByteArray path = reinterpret_cast<de::Uri &>(*newDef->charMap[i].path).resolved().toUtf8();
charSetPatch(newDef->charMap[i].ch, path.constData());
}
catch(de::Uri::ResolveError const& er)
{
Expand All @@ -204,28 +210,28 @@ void CompositeBitmapFont::rebuildFromDef(ded_compositefont_t *def)
}
}

Texture::Variant *CompositeBitmapFont::charTexture(unsigned char ch)
TextureVariant *CompositeBitmapFont::charTexture(unsigned char ch)
{
glInit();
return _chars[ch].tex;
return d->chars[ch].tex;
}

patchid_t CompositeBitmapFont::charPatch(unsigned char ch)
{
glInit();
return _chars[ch].patch;
return d->chars[ch].patch;
}

void CompositeBitmapFont::charSetPatch(unsigned char chr, char const *encodedPatchName)
{
bitmapcompositefont_char_t *ch = &_chars[chr];
bitmapcompositefont_char_t *ch = &d->chars[chr];
ch->patch = App_ResourceSystem().declarePatch(encodedPatchName);
_isDirty = true;
}

uint8_t CompositeBitmapFont::charBorder(unsigned char chr)
{
bitmapcompositefont_char_t *ch = &_chars[chr];
bitmapcompositefont_char_t *ch = &d->chars[chr];
glInit();
return ch->border;
}
Expand Down

0 comments on commit a300d1b

Please sign in to comment.