Files
@ r28035:f86971abe639
Branch filter:
Location: cpp/openttd-patchpack/source/src/fontcache/spritefontcache.cpp - annotation
r28035:f86971abe639
4.5 KiB
text/x-c
Update: Translations from eints
english (au): 3 changes by krysclarke
russian: 3 changes by Ln-Wolf
finnish: 3 changes by hpiirai
turkish: 4 changes by BeratSJ
french: 3 changes by ottdfevr
portuguese: 3 changes by azulcosta
portuguese (brazilian): 3 changes by pasantoro
english (au): 3 changes by krysclarke
russian: 3 changes by Ln-Wolf
finnish: 3 changes by hpiirai
turkish: 4 changes by BeratSJ
french: 3 changes by ottdfevr
portuguese: 3 changes by azulcosta
portuguese (brazilian): 3 changes by pasantoro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r27112:f42d2af96b0b r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26657:8c37c30c8ee3 r27112:f42d2af96b0b r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r27737:728d55b97775 r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r27737:728d55b97775 r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26657:8c37c30c8ee3 r27112:f42d2af96b0b r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r27106:2d95beb51290 r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r27112:f42d2af96b0b r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d r26400:bc4531010a6d | /*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file spritefontcache.cpp Sprite fontcache implementation. */
#include "../stdafx.h"
#include "../fontcache.h"
#include "../gfx_layout.h"
#include "../zoom_func.h"
#include "spritefontcache.h"
#include "../table/sprites.h"
#include "../table/control_codes.h"
#include "../table/unicode.h"
#include "../safeguards.h"
static const int ASCII_LETTERSTART = 32; ///< First printable ASCII letter.
/**
* Scale traditional pixel dimensions to font zoom level, for drawing sprite fonts.
* @param value Pixel amount at #ZOOM_LVL_BASE (traditional "normal" interface size).
* @return Pixel amount at _font_zoom (current interface size).
*/
static int ScaleFontTrad(int value)
{
return UnScaleByZoom(value * ZOOM_LVL_BASE, _font_zoom);
}
/**
* Create a new sprite font cache.
* @param fs The font size to create the cache for.
*/
SpriteFontCache::SpriteFontCache(FontSize fs) : FontCache(fs), glyph_to_spriteid_map(nullptr)
{
this->InitializeUnicodeGlyphMap();
this->height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs));
this->ascender = (this->height - ScaleFontTrad(FontCache::GetDefaultFontHeight(this->fs))) / 2;
}
/**
* Free everything we allocated.
*/
SpriteFontCache::~SpriteFontCache()
{
this->ClearGlyphToSpriteMap();
}
SpriteID SpriteFontCache::GetUnicodeGlyph(char32_t key)
{
if (this->glyph_to_spriteid_map[GB(key, 8, 8)] == nullptr) return 0;
return this->glyph_to_spriteid_map[GB(key, 8, 8)][GB(key, 0, 8)];
}
void SpriteFontCache::SetUnicodeGlyph(char32_t key, SpriteID sprite)
{
if (this->glyph_to_spriteid_map == nullptr) this->glyph_to_spriteid_map = CallocT<SpriteID*>(256);
if (this->glyph_to_spriteid_map[GB(key, 8, 8)] == nullptr) this->glyph_to_spriteid_map[GB(key, 8, 8)] = CallocT<SpriteID>(256);
this->glyph_to_spriteid_map[GB(key, 8, 8)][GB(key, 0, 8)] = sprite;
}
void SpriteFontCache::InitializeUnicodeGlyphMap()
{
/* Clear out existing glyph map if it exists */
this->ClearGlyphToSpriteMap();
SpriteID base;
switch (this->fs) {
default: NOT_REACHED();
case FS_MONO: // Use normal as default for mono spaced font
case FS_NORMAL: base = SPR_ASCII_SPACE; break;
case FS_SMALL: base = SPR_ASCII_SPACE_SMALL; break;
case FS_LARGE: base = SPR_ASCII_SPACE_BIG; break;
}
for (uint i = ASCII_LETTERSTART; i < 256; i++) {
SpriteID sprite = base + i - ASCII_LETTERSTART;
if (!SpriteExists(sprite)) continue;
this->SetUnicodeGlyph(i, sprite);
this->SetUnicodeGlyph(i + SCC_SPRITE_START, sprite);
}
for (uint i = 0; i < lengthof(_default_unicode_map); i++) {
byte key = _default_unicode_map[i].key;
if (key == CLRA) {
/* Clear the glyph. This happens if the glyph at this code point
* is non-standard and should be accessed by an SCC_xxx enum
* entry only. */
this->SetUnicodeGlyph(_default_unicode_map[i].code, 0);
} else {
SpriteID sprite = base + key - ASCII_LETTERSTART;
this->SetUnicodeGlyph(_default_unicode_map[i].code, sprite);
}
}
}
/**
* Clear the glyph to sprite mapping.
*/
void SpriteFontCache::ClearGlyphToSpriteMap()
{
if (this->glyph_to_spriteid_map == nullptr) return;
for (uint i = 0; i < 256; i++) {
free(this->glyph_to_spriteid_map[i]);
}
free(this->glyph_to_spriteid_map);
this->glyph_to_spriteid_map = nullptr;
}
void SpriteFontCache::ClearFontCache()
{
Layouter::ResetFontCache(this->fs);
this->height = ScaleGUITrad(FontCache::GetDefaultFontHeight(this->fs));
this->ascender = (this->height - ScaleFontTrad(FontCache::GetDefaultFontHeight(this->fs))) / 2;
}
const Sprite *SpriteFontCache::GetGlyph(GlyphID key)
{
SpriteID sprite = this->GetUnicodeGlyph(key);
if (sprite == 0) sprite = this->GetUnicodeGlyph('?');
return GetSprite(sprite, SpriteType::Font);
}
uint SpriteFontCache::GetGlyphWidth(GlyphID key)
{
SpriteID sprite = this->GetUnicodeGlyph(key);
if (sprite == 0) sprite = this->GetUnicodeGlyph('?');
return SpriteExists(sprite) ? GetSprite(sprite, SpriteType::Font)->width + ScaleFontTrad(this->fs != FS_NORMAL ? 1 : 0) : 0;
}
bool SpriteFontCache::GetDrawGlyphShadow()
{
return false;
}
|