From: Brad A. <br...@us...> - 2012-07-23 20:38:37
|
gemrb: Infinity Engine emulator The branch master has been updated via 24890e342b5caa53a5d6bc6261bd12b65bdeee00 (commit) via 04cd2b988a823e9ead2d9045d28e15f7448dac4c (commit) via be2f9db6f50611177006abab8ca8302942b1753e (commit) via 3fb6434b2def2a10db870651210420e7481d884f (commit) via 82287de6a8afe93546c84e04ff1a8438eab33ecc (commit) via 3440f158fc9c53cadbb3783f69530fa369f6d12c (commit) via eac5ef577139c4d20148ef050ec3111a9ae3ccae (commit) Summary of changes: gemrb/core/Font.cpp | 174 ++++++++++---------------- gemrb/core/Font.h | 20 ++-- gemrb/core/FontManager.h | 2 +- gemrb/core/Video.h | 6 +- gemrb/plugins/BAMImporter/BAMFontManager.cpp | 43 ++++++- gemrb/plugins/BAMImporter/BAMImporter.cpp | 57 --------- gemrb/plugins/BAMImporter/BAMImporter.h | 2 - gemrb/plugins/SDLVideo/SDLVideo.cpp | 79 ++---------- gemrb/plugins/SDLVideo/SDLVideo.h | 4 +- gemrb/plugins/TTFImporter/TTFFontManager.cpp | 1 - 10 files changed, 138 insertions(+), 250 deletions(-) from df084f03d9a1e367cbda73b34ab537eca1944f5e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=24890e342b5caa53a5d6bc6261bd12b65bdeee00 commit 24890e342b5caa53a5d6bc6261bd12b65bdeee00 Merge: df084f0 04cd2b9 Author: Brad Allred <bra...@me...> Date: Mon Jul 23 14:37:59 2012 -0600 Merge branch 'font' http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=04cd2b988a823e9ead2d9045d28e15f7448dac4c commit 04cd2b988a823e9ead2d9045d28e15f7448dac4c Author: Brad Allred <bra...@me...> Date: Thu Jul 19 15:37:10 2012 -0600 BAMImporter: remove now unused GetFont() method. diff --git a/gemrb/plugins/BAMImporter/BAMImporter.cpp b/gemrb/plugins/BAMImporter/BAMImporter.cpp index 0c8538b..9a55dcc 100644 --- a/gemrb/plugins/BAMImporter/BAMImporter.cpp +++ b/gemrb/plugins/BAMImporter/BAMImporter.cpp @@ -280,62 +280,6 @@ AnimationFactory* BAMImporter::GetAnimationFactory(const char* ResRef, unsigned return af; } -/** This function will load the Animation as a Font */ -Font* BAMImporter::GetFont(ieWord FirstChar, ieWord LastChar) -{ - Log(MESSAGE, "BAMImporter", "Constructing BAM font %s.", str->filename); - - unsigned int i = 0, glyphIndexOffset = 0, limit = 0, Count = 0, glyphCount = 0; - ieWord *FLT = CacheFLT(Count); - // Numeric fonts have all frames in single cycle - if (CyclesCount > 1) { - Count = CyclesCount; - glyphCount = (LastChar - FirstChar + 1); - if (Count < glyphCount){ - LastChar = LastChar - (glyphCount - Count); - glyphCount = Count; - } - i = (FirstChar) ? FirstChar - 1 : FirstChar; - limit = (FirstChar) ? LastChar - 1 : LastChar; - glyphIndexOffset = i; - } else { //numeric font - Count = FramesCount; - glyphCount = Count; - if (FirstChar+Count != (unsigned int) LastChar+1) { - Log(ERROR, "BAMImporter", "inconsistent font %s: FirstChar=%d LastChar=%d Count=%d", - str->filename, FirstChar, LastChar, Count); - return NULL; - } - limit = glyphCount - 1; - } - assert(glyphCount); - Sprite2D** glyphs = (Sprite2D**)malloc( (glyphCount) * sizeof(Sprite2D*) ); - - for (; i <= limit; i++) { - unsigned int index; - if (CyclesCount > 1) { - index = FLT[cycles[i].FirstFrame]; - if (index >= FramesCount) { - glyphs[i - glyphIndexOffset] = NULL; - continue; - } - } else { - index = i; - } - - unsigned char* pixels = (unsigned char*)GetFramePixels( index ); - if( !pixels) { - glyphs[i - glyphIndexOffset] = NULL; - continue; - } - glyphs[i - glyphIndexOffset] = core->GetVideoDriver()->CreateSprite8(frames[index].Width, frames[index].Height, 8, pixels, palette->col, true, 0); - glyphs[i - glyphIndexOffset]->YPos = frames[index].YPos; - glyphs[i - glyphIndexOffset]->XPos = frames[index].XPos; - } - free( FLT ); - Font* fnt = new Font(glyphs, FirstChar, LastChar, palette); - return fnt; -} /** Debug Function: Returns the Global Animation Palette as a Sprite2D Object. If the Global Animation Palette is NULL, returns NULL. */ Sprite2D* BAMImporter::GetPalette() diff --git a/gemrb/plugins/BAMImporter/BAMImporter.h b/gemrb/plugins/BAMImporter/BAMImporter.h index cfee83f..9e67008 100644 --- a/gemrb/plugins/BAMImporter/BAMImporter.h +++ b/gemrb/plugins/BAMImporter/BAMImporter.h @@ -62,8 +62,6 @@ public: int GetCycleSize(unsigned char Cycle); AnimationFactory* GetAnimationFactory(const char* ResRef, unsigned char mode = IE_NORMAL); - /** This function will load the Animation as a Font */ - Font* GetFont(ieWord FirstChar, ieWord LastChar); /** Debug Function: Returns the Global Animation Palette as a Sprite2D Object. If the Global Animation Palette is NULL, returns NULL. */ Sprite2D* GetPalette(); http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=be2f9db6f50611177006abab8ca8302942b1753e commit be2f9db6f50611177006abab8ca8302942b1753e Author: Brad Allred <bra...@me...> Date: Thu Jul 19 15:36:50 2012 -0600 BAMFontManager: use an animation factory to get the font. Gives us the benefit of BAM sprites for the fonts + shorter/simpler code than BAMImporter::GetFont diff --git a/gemrb/plugins/BAMImporter/BAMFontManager.cpp b/gemrb/plugins/BAMImporter/BAMFontManager.cpp index cd8d1f5..7cdf6a1 100644 --- a/gemrb/plugins/BAMImporter/BAMFontManager.cpp +++ b/gemrb/plugins/BAMImporter/BAMFontManager.cpp @@ -19,6 +19,8 @@ */ #include "BAMFontManager.h" +#include "Palette.h" +#include "Sprite2D.h" using namespace GemRB; @@ -42,7 +44,46 @@ Font* BAMFontManager::GetFont(ieWord FirstChar, unsigned short /*ptSize*/, FontStyle /*style*/, Palette* pal) { - Font* fnt = bamImp->GetFont(FirstChar, LastChar); + AnimationFactory* af = bamImp->GetAnimationFactory("dummy"); // FIXME: how does this get released? + unsigned int i = 0, glyphIndexOffset = 0, limit = 0, Count = 0, glyphCount = 0; + unsigned int CyclesCount = af->GetCycleCount(); + + // Numeric fonts have all frames in single cycle + if (CyclesCount > 1) { + Count = CyclesCount; + glyphCount = (LastChar - FirstChar + 1); + if (Count < glyphCount){ + LastChar = LastChar - (glyphCount - Count); + glyphCount = Count; + } + i = (FirstChar) ? FirstChar - 1 : FirstChar; + limit = (FirstChar) ? LastChar - 1 : LastChar; + glyphIndexOffset = i; + } else { //numeric font + Count = af->GetFrameCount(); + glyphCount = Count; + if (FirstChar+Count != (unsigned int) LastChar+1) { + Log(ERROR, "BAMImporter", "inconsistent font %s: FirstChar=%d LastChar=%d Count=%d", + str->filename, FirstChar, LastChar, Count); + return NULL; + } + limit = glyphCount - 1; + } + + Sprite2D** glyphs = (Sprite2D**)malloc( glyphCount * sizeof(Sprite2D*) ); + + for (; i <= limit; i++) { + if (CyclesCount > 1) { + glyphs[i - glyphIndexOffset] = af->GetFrame(0, i); + } else { + glyphs[i - glyphIndexOffset] = af->GetFrameWithoutCycle(i); + } + } + + // assume all sprites have same palette + Palette* palette = glyphs[0]->GetPalette(); + Font* fnt = new Font(glyphs, FirstChar, LastChar, palette); + palette->Release(); if (pal) { fnt->SetPalette(pal); } http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=3fb6434b2def2a10db870651210420e7481d884f commit 3fb6434b2def2a10db870651210420e7481d884f Author: Brad Allred <bra...@me...> Date: Thu Jul 19 15:34:19 2012 -0600 Video: remove now unused BlitSpriteRegion() diff --git a/gemrb/core/Video.h b/gemrb/core/Video.h index 9e80864..3978722 100644 --- a/gemrb/core/Video.h +++ b/gemrb/core/Video.h @@ -149,10 +149,6 @@ public: virtual void BlitSprite(const Sprite2D* spr, int x, int y, bool anchor = false, const Region* clip = NULL, Palette* palette = NULL) = 0; - // Note: BlitSpriteRegion's clip region is shifted by Viewport.x/y if - // anchor is false. This is different from the other BlitSprite functions. - virtual void BlitSpriteRegion(const Sprite2D* spr, const Region& size, int x, int y, - bool anchor = true, const Region* clip = NULL) = 0; // Note: Tint cannot be constified, because it is modified locally // not a pretty interface :) virtual void BlitGameSprite(const Sprite2D* spr, int x, int y, diff --git a/gemrb/plugins/SDLVideo/SDLVideo.cpp b/gemrb/plugins/SDLVideo/SDLVideo.cpp index a9dd37f..06216e8 100644 --- a/gemrb/plugins/SDLVideo/SDLVideo.cpp +++ b/gemrb/plugins/SDLVideo/SDLVideo.cpp @@ -495,66 +495,6 @@ Sprite2D* SDLVideoDriver::DuplicateSprite(const Sprite2D* sprite) return dest; } -// Note: BlitSpriteRegion's clip region is shifted by Viewport.x/y if -// anchor is false. This is different from the other BlitSprite functions. -void SDLVideoDriver::BlitSpriteRegion(const Sprite2D* spr, const Region& size, int x, - int y, bool anchor, const Region* clip) -{ - if (!spr->vptr) return; - - // Adjust the clipping rect to match the region to blit, and then - // let BlitSprite handle the rest - - - Region c; - - if (clip) { - c = *clip; - if (!anchor) { - c.x -= Viewport.x; - c.y -= Viewport.y; - } - } else { - c.x = 0; - c.y = 0; - c.w = backBuf->w; - c.h = backBuf->h; - } - - - Region dest; - dest.x = x - spr->XPos; - dest.y = y - spr->YPos; - if (!anchor) { - dest.x -= Viewport.x; - dest.y -= Viewport.y; - } - - dest.w = size.w; - dest.h = size.h; - - // c is the clipping rect, dest the unclipped destination rect - // We clip c to dest, and pass the resulting c to BlitSprite - if (dest.x > c.x) { - c.w -= (dest.x - c.x); - c.x = dest.x; - } - if (dest.y > c.y) { - c.h -= (dest.y - c.y); - c.y = dest.y; - } - if (c.x+c.w > dest.x+dest.w) { - c.w = dest.x+dest.w-c.x; - } - if (c.y+c.h > dest.y+dest.h) { - c.h = dest.y+dest.h-c.y; - } - - if (c.w <= 0 || c.h <= 0) return; - - BlitSprite(spr, x - size.x, y - size.y, anchor, &c); -} - void SDLVideoDriver::BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags) { if (spr->BAM) { diff --git a/gemrb/plugins/SDLVideo/SDLVideo.h b/gemrb/plugins/SDLVideo/SDLVideo.h index 6b8da9c..a3a6170 100644 --- a/gemrb/plugins/SDLVideo/SDLVideo.h +++ b/gemrb/plugins/SDLVideo/SDLVideo.h @@ -98,8 +98,6 @@ public: void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags); void BlitSprite(const Sprite2D* spr, int x, int y, bool anchor = false, const Region* clip = NULL, Palette* palette = NULL); - void BlitSpriteRegion(const Sprite2D* spr, const Region& size, int x, int y, - bool anchor = true, const Region* clip = NULL); void BlitGameSprite(const Sprite2D* spr, int x, int y, unsigned int flags, Color tint, SpriteCover* cover, Palette *palette = NULL, http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=82287de6a8afe93546c84e04ff1a8438eab33ecc commit 82287de6a8afe93546c84e04ff1a8438eab33ecc Author: Brad Allred <bra...@me...> Date: Thu Jul 19 15:33:54 2012 -0600 Font: simplify fonts by using the sprite array instead of flattening it into a single sprite map and maintaining size entries for blitting. diff --git a/gemrb/core/Font.cpp b/gemrb/core/Font.cpp index ad982a2..1be60b8 100644 --- a/gemrb/core/Font.cpp +++ b/gemrb/core/Font.cpp @@ -37,6 +37,11 @@ namespace GemRB { #define PARAGRAPH_START_X 5; +#define SET_BLIT_PALETTE( palette )\ +if (palette) ((Palette*)palette)->IncRef();\ +if (blitPalette) blitPalette->Release();\ +blitPalette = palette; + static const Color black = {0, 0, 0, 0}; inline size_t mystrlen(const char* string) @@ -62,15 +67,12 @@ glyphs should be all characters we are interested in printing with the font save Font takes responsibility for glyphs so we must free them once done */ Font::Font(Sprite2D* glyphs[], ieWord firstChar, ieWord lastChar, Palette* pal) - : glyphCount(lastChar - firstChar + 1), glyphInfo(glyphCount), whiteSpace() + : glyphCount(lastChar - firstChar + 1), glyphs(glyphs), FirstChar(firstChar), LastChar(lastChar) { assert(glyphs); assert(pal); assert(firstChar <= lastChar); - FirstChar = firstChar; - LastChar = lastChar; - palette = NULL; resRefs = NULL; numResRefs = 0; @@ -82,73 +84,28 @@ Font::Font(Sprite2D* glyphs[], ieWord firstChar, ieWord lastChar, Palette* pal) SetPalette(pal); - int w = 0; - - unsigned int lastX = 0; - Sprite2D* currGlyph = NULL; - ieWord i; - for (i = 0; i < glyphCount; i++) { // printable characters range perhaps minus whitespace (whitespace handled later) - currGlyph = glyphs[i]; - if (!currGlyph) { // not printble - glyphInfo[i].size.x = 0; - glyphInfo[i].size.y = 0; - glyphInfo[i].size.w = 0; - glyphInfo[i].size.h = 0; - glyphInfo[i].xPos = 0; - glyphInfo[i].yPos = 0; - continue; - } - - w += currGlyph->Width; - if (currGlyph->Height > maxHeight) maxHeight = currGlyph->Height; - - glyphInfo[i].size.x = lastX; - glyphInfo[i].size.y = 0; - glyphInfo[i].size.w = currGlyph->Width; - glyphInfo[i].size.h = currGlyph->Height; - glyphInfo[i].xPos = currGlyph->XPos; - glyphInfo[i].yPos = currGlyph->YPos; - lastX += currGlyph->Width; - } - - // we dont really need a whitespace sprite since its blank we just need its size - if (FirstChar > ' ') whiteSpace[1].size = Region(0, 0, (int)(maxHeight * 0.25), 0);// standard space width is 1/4 ptSize - if (FirstChar > '\t') whiteSpace[2].size = Region(0, 0, (whiteSpace[1].size.w * 4), 0);// standard tab width is 4 spaces??? - - Video* video = core->GetVideoDriver(); - - //cast to uchar because uchar is 1 byte and we can do pointer arithmatic with it. - unsigned char* tmpPixels = (unsigned char*)malloc(w * maxHeight); - - lastX = 0; - for (i = 0; i < glyphCount; i++) { //printable characters range perhapps minus whitespace (whitespace handled later) - currGlyph = glyphs[i]; - if (!currGlyph) continue; - - assert(currGlyph->Bpp == 8); - // copy the pixels into the buffer - // this is assuming the width will be the pitch - unsigned char * dstPtr = (unsigned char*)tmpPixels + lastX; - unsigned char * srcPtr = (unsigned char*)currGlyph->pixels; - for (int glyphY = 0; glyphY < currGlyph->Height; glyphY++) { - memcpy( dstPtr, srcPtr, currGlyph->Width); - srcPtr += currGlyph->Width; - dstPtr += w; - } - lastX += currGlyph->Width; - - video->FreeSprite(currGlyph); + for (int i = 0; i < glyphCount; i++) + { + glyphs[i]->XPos = 0; + glyphs[i]->SetPalette(palette); + if (glyphs[i]->Height > maxHeight) maxHeight = glyphs[i]->Height; } - sprBuffer = core->GetVideoDriver()->CreateSprite8(w, maxHeight, 8, (void*)tmpPixels, pal->col, true, 0); + whiteSpace[BLANK] = core->GetVideoDriver()->CreateSprite8(0, 0, 8, NULL, palette->col); + // standard space width is 1/4 ptSize + whiteSpace[SPACE] = core->GetVideoDriver()->CreateSprite8((int)(maxHeight * 0.25), 0, 8, NULL, palette->col); + // standard tab width is 4 spaces??? + whiteSpace[TAB] = core->GetVideoDriver()->CreateSprite8((whiteSpace[1]->Width * 4), 0, 8, NULL, palette->col); } Font::~Font(void) { - Video *video = core->GetVideoDriver(); - video->FreeSprite( sprBuffer ); - SetPalette(NULL); - + for (int i = 0; i < glyphCount; i++) + { + core->GetVideoDriver()->FreeSprite(glyphs[i]); + } + palette->Release(); + free(glyphs); free(resRefs); } @@ -156,15 +113,11 @@ Font::~Font(void) Return a region specefying the size of character 'chr' if 'chr' is not in the font then return empty region. */ -const Font::GlyphInfo &Font::getInfo(ieWord chr) const +const Sprite2D* Font::GetCharSprite(ieWord chr) const { if (chr >= FirstChar && chr <= LastChar) { - return glyphInfo[chr - FirstChar]; + return glyphs[chr - FirstChar]; } - if (chr == ' ') return whiteSpace[1]; - if (chr == '\t') return whiteSpace[2]; - //otherwise return an empty region - return whiteSpace[0]; if (chr == ' ') return whiteSpace[SPACE]; if (chr == '\t') return whiteSpace[TAB]; //otherwise return an empty sprite @@ -214,9 +167,9 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, currCap = string[0]; if ((startrow > 0 && initials_rows > 0) || (len > 0 && isspace(currCap))) { // we need to look back to get the cap - while(isspace(currCap) && num_empty_rows < (int)len){//we cant cap whitespace so keep looking + while(isspace(currCap) && num_empty_rows < (int)len){//we cant cap whiteSpace so keep looking currCap = string[++num_empty_rows]; - // WARNING: this assumes all preceeding whitespace is an empty line + // WARNING: this assumes all preceeding whiteSpace is an empty line } last_initial_row = (startrow - 1); initials_rows = initials_rows + num_empty_rows - 1; @@ -229,12 +182,13 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, pal = palette; } + Palette* blitPalette = NULL; + SET_BLIT_PALETTE(pal); + if (initials==this) { enablecap=false; } - sprBuffer->SetPalette( pal ); - char* tmp = ( char* ) malloc( len + 1 ); memcpy( tmp, ( char * ) string, len + 1 ); SetupString( tmp, rgn.w, NoColor, initials, enablecap ); @@ -243,7 +197,7 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, int ystep = 0; if (Alignment & IE_FONT_SINGLE_LINE) { for (size_t i = 0; i < len; i++) { - int height = getInfo(tmp[i]).yPos; + int height = GetCharSprite(tmp[i])->Height; if (ystep < height) ystep = height; } @@ -279,6 +233,8 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, } Video* video = core->GetVideoDriver(); + const Sprite2D* currGlyph; + unsigned char currChar = '\0'; int row = 0; for (size_t i = 0; i < len; i++) { if (( ( unsigned char ) tmp[i] ) == '[' && !NoColor) { @@ -308,12 +264,12 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, continue; const Color c = {(unsigned char) r,(unsigned char)g, (unsigned char)b, 0}; Palette* newPal = core->CreatePalette( c, palette->back ); - sprBuffer->SetPalette( newPal ); + SET_BLIT_PALETTE(newPal); gamedata->FreePalette( newPal ); continue; } if (stricmp( tag, "/color" ) == 0) { - sprBuffer->SetPalette( pal ); + SET_BLIT_PALETTE(pal); continue; } if (stricmp( "p", tag ) == 0) { @@ -348,7 +304,7 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, } continue; } - unsigned char currChar = tmp[i]; + currChar = tmp[i]; if (initials && capital && enablecap) { currCap = currChar; x = initials->PrintInitial( x, y, rgn, currChar ); @@ -374,18 +330,17 @@ void Font::PrintFromLine(int startrow, Region rgn, const unsigned char* string, if (num_empty_rows) continue; else x += psx; } - video->BlitSpriteRegion( sprBuffer, getInfo(currChar).size, - x + rgn.x, y + rgn.y - getInfo(currChar).yPos, true, &rgn ); + currGlyph = GetCharSprite(currChar); + video->BlitSprite(currGlyph, x + rgn.x, y + rgn.y, true, &rgn, blitPalette); if (cursor && ( i == curpos )) { - video->BlitSprite( cursor, x + rgn.x, - y + rgn.y, true, &rgn ); + video->BlitSprite( cursor, x + rgn.x, y + rgn.y, true, &rgn ); } - x += getInfo(currChar).size.w; + x += currGlyph->Width; } if (cursor && ( curpos == len )) { - video->BlitSprite( cursor, x + rgn.x, - y + rgn.y, true, &rgn ); + video->BlitSprite( cursor, x + rgn.x, y + rgn.y, true, &rgn ); } + SET_BLIT_PALETTE(NULL); free( tmp ); } @@ -407,7 +362,6 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, capital=1; enablecap=true; } - (void)enablecap; //HACK: shut up unused-but-set warnings, until the var is reused unsigned int psx = PARAGRAPH_START_X; Palette* pal = hicolor; @@ -418,7 +372,9 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, initials = NULL; } - sprBuffer->SetPalette( pal ); + Palette* blitPalette = NULL; + SET_BLIT_PALETTE( pal ); + size_t len = strlen( ( char* ) string ); char* tmp = ( char* ) malloc( len + 1 ); memcpy( tmp, ( char * ) string, len + 1 ); @@ -434,7 +390,7 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, for (size_t i = 0; i < len; i++) { if (tmp[i] == 0) continue; - int height = getInfo(tmp[i]).yPos; + int height =GetCharSprite(i)->YPos; if (ystep < height) ystep = height; } @@ -472,6 +428,9 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, } else if (Alignment & IE_FONT_ALIGN_TOP) { y += 5; } + + unsigned char currChar = '\0'; + const Sprite2D* currGlyph = NULL; for (size_t i = 0; i < len; i++) { if (( ( unsigned char ) tmp[i] ) == '[' && !NoColor) { i++; @@ -499,12 +458,12 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, continue; const Color c = {(unsigned char) r,(unsigned char) g,(unsigned char) b, 0}; Palette* newPal = core->CreatePalette( c, palette->back ); - sprBuffer->SetPalette( newPal ); + SET_BLIT_PALETTE(newPal); gamedata->FreePalette( newPal ); continue; } if (stricmp( tag, "/color" ) == 0) { - sprBuffer->SetPalette( pal ); + SET_BLIT_PALETTE(pal); continue; } if (stricmp( "p", tag ) == 0) { @@ -529,31 +488,33 @@ void Font::Print(Region cliprgn, Region rgn, const unsigned char* string, } continue; } - unsigned char currChar = tmp[i]; + currChar = tmp[i]; + currGlyph = GetCharSprite(currChar); if (initials && capital) { x = initials->PrintInitial( x, y, rgn, currChar ); enablecap=false; continue; } - video->BlitSpriteRegion( sprBuffer, getInfo(currChar).size, - x + rgn.x, y + rgn.y - getInfo(currChar).yPos, - anchor, &cliprgn ); + + video->BlitSprite(currGlyph, x + rgn.x, y + rgn.y, anchor, &cliprgn, blitPalette); + if (cursor && ( curpos == i )) video->BlitSprite( cursor, x + rgn.x, y + rgn.y, anchor, &cliprgn ); - x += getInfo(currChar).size.w; + x += currGlyph->Width; } if (cursor && ( curpos == len )) { video->BlitSprite( cursor, x + rgn.x, y + rgn.y, anchor, &cliprgn ); } + SET_BLIT_PALETTE(NULL); free( tmp ); } int Font::PrintInitial(int x, int y, const Region &rgn, unsigned char currChar) const { - Video *video = core->GetVideoDriver(); - video->BlitSpriteRegion( sprBuffer, getInfo(currChar).size, - x + rgn.x, y + rgn.y - getInfo(currChar).yPos, true, &rgn ); - x += getInfo(currChar).size.w; + const Sprite2D* glyph = GetCharSprite(currChar); + core->GetVideoDriver()->BlitSprite(glyph, x + rgn.x, y + rgn.y, true, &rgn); + + x += glyph->Width; return x; } @@ -566,7 +527,7 @@ int Font::CalcStringWidth(const char* string, bool NoColor) const i++; } } - ret += getInfo((unsigned char)string[i]).size.w; + ret += GetCharSprite(string[i])->Width; } return ( int ) ret; } @@ -648,9 +609,9 @@ void Font::SetupString(char* string, unsigned int width, bool NoColor, Font *ini string[pos] = ( unsigned char ) (string[pos]); } - wx += getInfo(string[pos]).size.w; + wx += GetCharSprite(string[pos])->Width; if (initials && enablecap) { - wx += initials->getInfo(string[pos]).size.w; + wx += GetCharSprite(string[pos])->Width; enablecap=false; initials_x = wx; //how many more lines to be indented (one was already indented) @@ -679,6 +640,5 @@ void Font::SetPalette(Palette* pal) if (palette) palette->Release(); palette = pal; } - - +#undef SET_BLIT_PALETTE } diff --git a/gemrb/core/Font.h b/gemrb/core/Font.h index 48e9de5..6da9d56 100644 --- a/gemrb/core/Font.h +++ b/gemrb/core/Font.h @@ -64,11 +64,6 @@ class Sprite2D; */ class GEM_EXPORT Font { -public: - struct GlyphInfo { - short xPos, yPos; // tracks glyph adjustment - Region size; - }; private: int glyphCount; @@ -76,15 +71,13 @@ private: int numResRefs; Palette* palette; - Sprite2D* sprBuffer;//A sprite with all printable ASCII characters printed horizontally acending. + Sprite2D** glyphs; + Sprite2D* whiteSpace[3]; /** Sets ASCII code of the first character in the font. * (it allows remapping numeric fonts from \000 to '0') */ ieWord FirstChar; ieWord LastChar; - - std::vector<GlyphInfo> glyphInfo; - GlyphInfo whiteSpace[3];//an empty region for non existing chars + space + tab public: char name[20]; FontStyle style; // for informational purposes only @@ -96,7 +89,8 @@ public: ~Font(void); //allow reading but not setting glyphs - const GlyphInfo& getInfo (ieWord chr) const; + const Sprite2D* GetCharSprite(ieWord index) const; + int GetCharacterCount(){ return glyphCount; }; bool AddResRef(const ieResRef resref); diff --git a/gemrb/core/FontManager.h b/gemrb/core/FontManager.h index 872feba..1ea4047 100644 --- a/gemrb/core/FontManager.h +++ b/gemrb/core/FontManager.h @@ -31,7 +31,7 @@ namespace GemRB { class GEM_EXPORT FontManager : public Resource { private: /* - Public data members + private data members */ public: /* diff --git a/gemrb/plugins/BAMImporter/BAMImporter.cpp b/gemrb/plugins/BAMImporter/BAMImporter.cpp index 883702d..0c8538b 100644 --- a/gemrb/plugins/BAMImporter/BAMImporter.cpp +++ b/gemrb/plugins/BAMImporter/BAMImporter.cpp @@ -334,7 +334,6 @@ Font* BAMImporter::GetFont(ieWord FirstChar, ieWord LastChar) } free( FLT ); Font* fnt = new Font(glyphs, FirstChar, LastChar, palette); - free(glyphs); return fnt; } /** Debug Function: Returns the Global Animation Palette as a Sprite2D Object. diff --git a/gemrb/plugins/TTFImporter/TTFFontManager.cpp b/gemrb/plugins/TTFImporter/TTFFontManager.cpp index 1305801..eace40f 100644 --- a/gemrb/plugins/TTFImporter/TTFFontManager.cpp +++ b/gemrb/plugins/TTFImporter/TTFFontManager.cpp @@ -117,7 +117,6 @@ Font* TTFFontManager::GetFont(ieWord FirstChar, pal->Release(); font->ptSize = ptSize; font->style = style; - free(glyphs); return font; } http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=3440f158fc9c53cadbb3783f69530fa369f6d12c commit 3440f158fc9c53cadbb3783f69530fa369f6d12c Author: Brad Allred <bra...@me...> Date: Thu Jul 19 15:30:00 2012 -0600 Video: let BlitSprite take an optional palette that will allow us to override the sprite palette when blitting. diff --git a/gemrb/core/Video.h b/gemrb/core/Video.h index 4d1a526..9e80864 100644 --- a/gemrb/core/Video.h +++ b/gemrb/core/Video.h @@ -147,7 +147,7 @@ public: virtual Sprite2D* DuplicateSprite(const Sprite2D* spr) = 0; virtual void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags) = 0; virtual void BlitSprite(const Sprite2D* spr, int x, int y, bool anchor = false, - const Region* clip = NULL) = 0; + const Region* clip = NULL, Palette* palette = NULL) = 0; // Note: BlitSpriteRegion's clip region is shifted by Viewport.x/y if // anchor is false. This is different from the other BlitSprite functions. diff --git a/gemrb/plugins/SDLVideo/SDLVideo.cpp b/gemrb/plugins/SDLVideo/SDLVideo.cpp index eb7cb08..a9dd37f 100644 --- a/gemrb/plugins/SDLVideo/SDLVideo.cpp +++ b/gemrb/plugins/SDLVideo/SDLVideo.cpp @@ -685,7 +685,7 @@ void SDLVideoDriver::BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, void SDLVideoDriver::BlitSprite(const Sprite2D* spr, int x, int y, bool anchor, - const Region* clip) + const Region* clip, Palette* palette) { if (!spr->vptr) return; @@ -740,7 +740,15 @@ void SDLVideoDriver::BlitSprite(const Sprite2D* spr, int x, int y, bool anchor, srect = &t; } - SDL_BlitSurface( ( SDL_Surface * ) spr->vptr, srect, backBuf, &drect ); + if (palette) { + Palette* tmpPal = spr->GetPalette(); + SetSurfacePalette(( SDL_Surface * )spr->vptr, (SDL_Color*)palette->col, 256); + SDL_BlitSurface( ( SDL_Surface * ) spr->vptr, srect, backBuf, &drect ); + SetSurfacePalette(( SDL_Surface * )spr->vptr, (SDL_Color*)tmpPal->col, 256); + tmpPal->Release(); + } else { + SDL_BlitSurface( ( SDL_Surface * ) spr->vptr, srect, backBuf, &drect ); + } } else { Sprite2D_BAM_Internal* data = (Sprite2D_BAM_Internal*)spr->vptr; @@ -753,20 +761,21 @@ void SDLVideoDriver::BlitSprite(const Sprite2D* spr, int x, int y, bool anchor, SDL_LockSurface(backBuf); + Palette* pal = (palette) ? palette : data->pal; SRShadow_Regular shadow; - if (data->pal->alpha) { + if (pal->alpha) { SRTinter_NoTint<true> tinter; SRBlender_Alpha blender; BlitSpritePAL_dispatch(false, data->flip_hor, - backBuf, srcdata, data->pal->col, tx, ty, spr->Width, spr->Height, data->flip_ver, finalclip, (Uint8)data->transindex, 0, spr, 0, shadow, tinter, blender); + backBuf, srcdata, pal->col, tx, ty, spr->Width, spr->Height, data->flip_ver, finalclip, (Uint8)data->transindex, 0, spr, 0, shadow, tinter, blender); } else { SRTinter_NoTint<false> tinter; SRBlender_NoAlpha blender; BlitSpritePAL_dispatch(false, data->flip_hor, - backBuf, srcdata, data->pal->col, tx, ty, spr->Width, spr->Height, data->flip_ver, finalclip, (Uint8)data->transindex, 0, spr, 0, shadow, tinter, blender); + backBuf, srcdata, pal->col, tx, ty, spr->Width, spr->Height, data->flip_ver, finalclip, (Uint8)data->transindex, 0, spr, 0, shadow, tinter, blender); } SDL_UnlockSurface(backBuf); diff --git a/gemrb/plugins/SDLVideo/SDLVideo.h b/gemrb/plugins/SDLVideo/SDLVideo.h index e11e690..6b8da9c 100644 --- a/gemrb/plugins/SDLVideo/SDLVideo.h +++ b/gemrb/plugins/SDLVideo/SDLVideo.h @@ -97,7 +97,7 @@ public: Sprite2D* DuplicateSprite(const Sprite2D* spr); void BlitTile(const Sprite2D* spr, const Sprite2D* mask, int x, int y, const Region* clip, unsigned int flags); void BlitSprite(const Sprite2D* spr, int x, int y, bool anchor = false, - const Region* clip = NULL); + const Region* clip = NULL, Palette* palette = NULL); void BlitSpriteRegion(const Sprite2D* spr, const Region& size, int x, int y, bool anchor = true, const Region* clip = NULL); void BlitGameSprite(const Sprite2D* spr, int x, int y, http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=eac5ef577139c4d20148ef050ec3111a9ae3ccae commit eac5ef577139c4d20148ef050ec3111a9ae3ccae Author: Brad Allred <bra...@me...> Date: Wed Jul 18 19:18:49 2012 -0600 Font: use named index for whiteSpace diff --git a/gemrb/core/Font.cpp b/gemrb/core/Font.cpp index c941b9f..ad982a2 100644 --- a/gemrb/core/Font.cpp +++ b/gemrb/core/Font.cpp @@ -165,6 +165,10 @@ const Font::GlyphInfo &Font::getInfo(ieWord chr) const if (chr == '\t') return whiteSpace[2]; //otherwise return an empty region return whiteSpace[0]; + if (chr == ' ') return whiteSpace[SPACE]; + if (chr == '\t') return whiteSpace[TAB]; + //otherwise return an empty sprite + return whiteSpace[BLANK]; } bool Font::AddResRef(const ieResRef resref) diff --git a/gemrb/core/Font.h b/gemrb/core/Font.h index d6782f4..48e9de5 100644 --- a/gemrb/core/Font.h +++ b/gemrb/core/Font.h @@ -41,6 +41,12 @@ enum FontStyle { UNDERLINE = 0x04 }; +enum WhiteSpace { + BLANK = 0, + SPACE = 1, + TAB = 2 +}; + class Palette; class Sprite2D; ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |