diff --git a/specter/include/Specter/FontCache.hpp b/specter/include/Specter/FontCache.hpp index 58f1826a0..2f6ac8fa6 100644 --- a/specter/include/Specter/FontCache.hpp +++ b/specter/include/Specter/FontCache.hpp @@ -69,6 +69,7 @@ public: struct Glyph { atUint32 m_unicodePoint; + atUint32 m_glyphIdx; atUint32 m_layerIdx; float m_layerFloat; float m_uv[4]; @@ -133,16 +134,8 @@ public: return nullptr; return &m_glyphs[search->second]; } - atInt16 lookupKern(atUint32 left, atUint32 right) const + atInt16 lookupKern(atUint32 leftIdx, atUint32 rightIdx) const { - auto leftSearch = m_glyphLookup.find(left); - if (leftSearch == m_glyphLookup.cend()) - return 0; - size_t leftIdx = leftSearch->second; - auto rightSearch = m_glyphLookup.find(right); - if (rightSearch == m_glyphLookup.cend()) - return 0; - size_t rightIdx = rightSearch->second; auto pairSearch = m_kernAdjs.find(leftIdx); if (pairSearch == m_kernAdjs.cend()) return 0; diff --git a/specter/include/Specter/SplitView.hpp b/specter/include/Specter/SplitView.hpp index 870ed9696..ce795a374 100644 --- a/specter/include/Specter/SplitView.hpp +++ b/specter/include/Specter/SplitView.hpp @@ -45,11 +45,11 @@ private: void setHorizontalVerts(int width) { - m_splitVerts[0].m_pos.assign(0, 1, 0); + m_splitVerts[0].m_pos.assign(0, 2, 0); m_splitVerts[0].m_uv.assign(0, 0); m_splitVerts[1].m_pos.assign(0, -1, 0); m_splitVerts[1].m_uv.assign(1, 0); - m_splitVerts[2].m_pos.assign(width, 1, 0); + m_splitVerts[2].m_pos.assign(width, 2, 0); m_splitVerts[2].m_uv.assign(0, 0); m_splitVerts[3].m_pos.assign(width, -1, 0); m_splitVerts[3].m_uv.assign(1, 0); @@ -61,9 +61,9 @@ private: m_splitVerts[0].m_uv.assign(0, 0); m_splitVerts[1].m_pos.assign(-1, 0, 0); m_splitVerts[1].m_uv.assign(0, 0); - m_splitVerts[2].m_pos.assign(1, height, 0); + m_splitVerts[2].m_pos.assign(2, height, 0); m_splitVerts[2].m_uv.assign(1, 0); - m_splitVerts[3].m_pos.assign(1, 0, 0); + m_splitVerts[3].m_pos.assign(2, 0, 0); m_splitVerts[3].m_uv.assign(1, 0); } diff --git a/specter/lib/FontCache.cpp b/specter/lib/FontCache.cpp index d3e54ee97..f24674adc 100644 --- a/specter/lib/FontCache.cpp +++ b/specter/lib/FontCache.cpp @@ -351,6 +351,7 @@ FontAtlas::FontAtlas(boo::IGraphicsDataFactory* gf, FT_Face face, uint32_t dpi, } g.m_unicodePoint = charcode; + g.m_glyphIdx = gindex; g.m_layerIdx = fullTexmapLayers; g.m_layerFloat = float(g.m_layerIdx); g.m_width = face->glyph->bitmap.width / 3; @@ -430,6 +431,7 @@ FontAtlas::FontAtlas(boo::IGraphicsDataFactory* gf, FT_Face face, uint32_t dpi, } g.m_unicodePoint = charcode; + g.m_glyphIdx = gindex; g.m_layerIdx = fullTexmapLayers; g.m_layerFloat = float(g.m_layerIdx); g.m_width = face->glyph->bitmap.width; @@ -548,6 +550,7 @@ FontAtlas::FontAtlas(boo::IGraphicsDataFactory* gf, FT_Face face, uint32_t dpi, } g.m_unicodePoint = charcode; + g.m_glyphIdx = gindex; g.m_layerIdx = fullTexmapLayers; g.m_layerFloat = float(g.m_layerIdx); g.m_width = width; @@ -627,6 +630,7 @@ FontAtlas::FontAtlas(boo::IGraphicsDataFactory* gf, FT_Face face, uint32_t dpi, } g.m_unicodePoint = charcode; + g.m_glyphIdx = gindex; g.m_layerIdx = fullTexmapLayers; g.m_layerFloat = float(g.m_layerIdx); g.m_width = width; diff --git a/specter/lib/RootView.cpp b/specter/lib/RootView.cpp index 2297b115d..886e245c8 100644 --- a/specter/lib/RootView.cpp +++ b/specter/lib/RootView.cpp @@ -92,6 +92,8 @@ void RootView::charKeyUp(unsigned long charCode, boo::EModifierKey mods) void RootView::specialKeyDown(boo::ESpecialKey key, boo::EModifierKey mods, bool isRepeat) { + if (key == boo::ESpecialKey::Enter && (mods & boo::EModifierKey::Alt) != boo::EModifierKey::None) + m_window->setFullscreen(!m_window->isFullscreen()); } void RootView::specialKeyUp(boo::ESpecialKey key, boo::EModifierKey mods) diff --git a/specter/lib/TextView.cpp b/specter/lib/TextView.cpp index 462658a52..ef2d8b5fd 100644 --- a/specter/lib/TextView.cpp +++ b/specter/lib/TextView.cpp @@ -331,6 +331,7 @@ TextView::RenderGlyph::RenderGlyph(int& adv, const FontAtlas::Glyph& glyph, cons static int DoKern(FT_Pos val, const FontAtlas& atlas) { + if (!val) return 0; val = FT_MulFix(val, atlas.FT_Xscale()); FT_Pos orig_x = val; @@ -348,7 +349,7 @@ void TextView::typesetGlyphs(const std::string& str, const Zeus::CColor& default { size_t rem = str.size(); const utf8proc_uint8_t* it = reinterpret_cast(str.data()); - utf8proc_int32_t lCh = -1; + uint32_t lCh = -1; m_glyphs.clear(); m_glyphs.reserve(str.size()); int adv = 0; @@ -371,10 +372,10 @@ void TextView::typesetGlyphs(const std::string& str, const Zeus::CColor& default } if (lCh != -1) - adv += DoKern(m_fontAtlas.lookupKern(lCh, ch), m_fontAtlas); + adv += DoKern(m_fontAtlas.lookupKern(lCh, glyph->m_glyphIdx), m_fontAtlas); m_glyphs.emplace_back(adv, *glyph, defaultColor); - lCh = ch; + lCh = glyph->m_glyphIdx; rem -= sz; it += sz; @@ -386,7 +387,7 @@ void TextView::typesetGlyphs(const std::string& str, const Zeus::CColor& default } void TextView::typesetGlyphs(const std::wstring& str, const Zeus::CColor& defaultColor) { - wchar_t lCh = -1; + uint32_t lCh = -1; m_glyphs.clear(); m_glyphs.reserve(str.size()); int adv = 0; @@ -401,10 +402,10 @@ void TextView::typesetGlyphs(const std::wstring& str, const Zeus::CColor& defaul continue; if (lCh != -1) - adv += DoKern(m_fontAtlas.lookupKern(lCh, ch), m_fontAtlas); + adv += DoKern(m_fontAtlas.lookupKern(lCh, glyph->m_glyphIdx), m_fontAtlas); m_glyphs.emplace_back(adv, *glyph, defaultColor); - lCh = ch; + lCh = glyph->m_glyphIdx; if (m_glyphs.size() == m_capacity) break;