From 85ce3f68efc874d55228071f2a468942f698db57 Mon Sep 17 00:00:00 2001 From: rachytski Date: Sun, 9 Jan 2011 22:43:45 +0200 Subject: [PATCH] ASCII symbols on staticSkinPage --- data/basic.skn | 958 +++++++++++++++++++++++++----- data/basic_highres.skn | 956 ++++++++++++++++++++++++----- data/symbols_24.png | Bin 50268 -> 66020 bytes data/symbols_48.png | Bin 114013 -> 134094 bytes map/drawer_yg.cpp | 6 +- skin_generator/main.cpp | 18 +- skin_generator/skin_generator.cpp | 237 ++++---- skin_generator/skin_generator.hpp | 6 +- yg/geometry_batcher.cpp | 22 +- yg/geometry_batcher.hpp | 11 +- yg/glyph_cache.cpp | 7 + yg/glyph_cache.hpp | 1 + yg/skin.cpp | 7 +- yg/skin.hpp | 2 +- yg/skin_loader.cpp | 10 + yg/skin_page.cpp | 50 +- yg/skin_page.hpp | 7 +- yg/text_renderer.cpp | 34 +- yg/text_renderer.hpp | 8 +- yg/yg_tests/screengl_test.cpp | 55 +- 20 files changed, 1911 insertions(+), 484 deletions(-) diff --git a/data/basic.skn b/data/basic.skn index e373b53816..ab55e4b85d 100644 --- a/data/basic.skn +++ b/data/basic.skn @@ -1,403 +1,1093 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/data/basic_highres.skn b/data/basic_highres.skn index e5d78f3ff5..53eaf8be3c 100644 --- a/data/basic_highres.skn +++ b/data/basic_highres.skn @@ -1,403 +1,1093 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/data/symbols_24.png b/data/symbols_24.png index a7e1d4aab85abd05034399c1bd077c5ebae80c9f..120b66e5a90bd1b39559441a3eef50d029c8ca6c 100644 GIT binary patch delta 29149 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� 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 diff --git a/map/drawer_yg.cpp b/map/drawer_yg.cpp index ad9b60da38..c3da196298 100644 --- a/map/drawer_yg.cpp +++ b/map/drawer_yg.cpp @@ -244,15 +244,15 @@ void DrawerYG::Draw(di::DrawInfo const * pInfo, rule_ptr_t pRule, int depth) void DrawerYG::drawStats(double duration, int scale, double lat, double lng) { -/* ostringstream out; + ostringstream out; out << "SPF: " << duration; if (duration == 0.0) out << " FPS: inf"; else out << " FPS: " << 1.0 / duration; - m_pScreen->drawText(m2::PointD(10, 20), 0, 14, out.str().c_str(), yg::maxDepth); + m_pScreen->drawText(m2::PointD(10, 20), 0, 10, out.str().c_str(), yg::maxDepth, true); out.str(""); out << "(" << lat << ", " << lng << ") Scale: " << scale; - m_pScreen->drawText(m2::PointD(10, 40), 0, 14, out.str().c_str(), yg::maxDepth);*/ + m_pScreen->drawText(m2::PointD(10, 40), 0, 10, out.str().c_str(), yg::maxDepth, true); } diff --git a/skin_generator/main.cpp b/skin_generator/main.cpp index 448a6d487a..add5c9fc55 100644 --- a/skin_generator/main.cpp +++ b/skin_generator/main.cpp @@ -14,8 +14,7 @@ DEFINE_string(symbolsDir, "../../data/styles/symbols", "directory with svg symbo DEFINE_int32(symbolWidth, 24, "width of the rendered symbol"); DEFINE_int32(symbolHeight, 24, "height of the rendered symbol"); DEFINE_double(symbolScale, 1, "scale factor of the symbol"); -DEFINE_int32(smallGlyphSize, 12, "height of the small glyph"); -DEFINE_int32(bigGlyphSize, 16, "height of the big glyph"); +DEFINE_int32(fixedGlyphSize, 16, "height of the fixed font"); DEFINE_string(skinName, "../../data/basic", "prefix for the skin and skinImage file name"); int main(int argc, char *argv[]) @@ -27,17 +26,7 @@ int main(int argc, char *argv[]) std::vector glyphSizes; -// glyphSizes.push_back(6); - glyphSizes.push_back(8); - glyphSizes.push_back(10); - glyphSizes.push_back(12); - glyphSizes.push_back(14); - glyphSizes.push_back(16); - glyphSizes.push_back(20); - glyphSizes.push_back(24); - -// glyphSizes.push_back(FLAGS_smallGlyphSize); -// glyphSizes.push_back(FLAGS_bigGlyphSize); + glyphSizes.push_back(FLAGS_fixedGlyphSize); std::vector symbolSizes; symbolSizes.push_back(QSize(FLAGS_symbolWidth, FLAGS_symbolHeight)); @@ -46,7 +35,8 @@ int main(int argc, char *argv[]) symbolScales.push_back(FLAGS_symbolScale); gen.processSymbols(FLAGS_symbolsDir, FLAGS_skinName, symbolSizes, symbolScales); -// gen.processFont(FLAGS_fontFileName, FLAGS_skinName, FLAGS_symbolsFile, glyphSizes); + gen.processFont(FLAGS_fontFileName, FLAGS_skinName, glyphSizes, FLAGS_symbolScale); + gen.renderPages(); gen.writeToFile(FLAGS_skinName); diff --git a/skin_generator/skin_generator.cpp b/skin_generator/skin_generator.cpp index 89a5d349a3..a84ad71a51 100644 --- a/skin_generator/skin_generator.cpp +++ b/skin_generator/skin_generator.cpp @@ -57,23 +57,9 @@ namespace tools : m_baseLineOffset(0) {} - void SkinGenerator::processFont(string const & fileName, string const & skinName, string const & symFreqFile, vector const & fontSizes) + void SkinGenerator::processFont(string const & fileName, string const & skinName, vector const & fontSizes, int symbolScale) { - FILE * file = fopen(symFreqFile.c_str(), "rb"); - if (!file) - throw std::exception(); - std::vector ucs2Symbols; - - while (true) - { - unsigned short id; - int readBytes = fread(&id, 1, sizeof(unsigned short), file); - if (readBytes < 2) - break; - ucs2Symbols.push_back(id); - } - - fclose(file); + string symbols(" 0123456789abcdefjhigklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ;:'\"/?.,`~!@#$%^&*()-_+="); FT_Library lib; FT_Error error; @@ -84,7 +70,7 @@ namespace tools FT_Stroker stroker; FTCHECK(FT_Stroker_New(lib, &stroker)); - size_t outlineWidth = 3; + size_t outlineWidth = 2; FT_Stroker_Set(stroker, outlineWidth * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); FT_Glyph_Metrics normalGlyphMetrics; @@ -92,7 +78,7 @@ namespace tools for (size_t i = 0; i < fontSizes.size(); ++i) { - m_pages.push_back(SkinPageInfo()); +// m_pages.push_back(SkinPageInfo()); SkinPageInfo & page = m_pages.back(); page.m_fonts.push_back(FontInfo()); @@ -101,10 +87,9 @@ namespace tools fontInfo.m_size = fontSizes[i]; FTCHECK(FT_Set_Pixel_Sizes(face, 0, fontSizes[i])); -// FTCHECK(FT_Set_Pixel_Sizes(face, 0, 100)); - for (size_t j = 0; j < ucs2Symbols.size(); ++j) + for (size_t j = 0; j < symbols.size(); ++j) { - unsigned short symbol = ucs2Symbols[j]; + unsigned short symbol = (unsigned short)symbols[j]; int symbolIdx = FT_Get_Char_Index(face, symbol); @@ -112,7 +97,6 @@ namespace tools continue; FTCHECK(FT_Load_Glyph(face, symbolIdx, FT_LOAD_DEFAULT)); -// FTCHECK(FT_Load_Glyph(face, FT_Get_Char_Index(face, '@'), FT_LOAD_DEFAULT)); normalGlyphMetrics = face->glyph->metrics; @@ -158,10 +142,6 @@ namespace tools gil::copy_pixels(grayview, gil::view(strokedCharInfo.m_image)); -/* gil::lodepng_write_view( - "testchar_outline.png", - gil::view(strokedCharInfo.m_image)); -*/ FT_Done_Glyph(strokedGlyph); FTCHECK(FT_Render_Glyph(glyphSlot, FT_RENDER_MODE_NORMAL)); @@ -181,112 +161,23 @@ namespace tools gil::copy_pixels(grayview, gil::view(normalCharInfo.m_image)); -/* gil::lodepng_write_view( - "testchar.png", - gil::view(normalCharInfo.m_image) - ); - */ FT_Done_Glyph(normalGlyph); } fontInfo.m_chars[symbol] = make_pair(normalCharInfo, strokedCharInfo); } - std::stringstream out; +/* std::stringstream out; out << getBaseFileName(fileName) + "_" << (int)fontSizes[i]; page.m_fileName = out.str().c_str(); - /// repacking symbols as tight as possible - page.m_width = 32; - page.m_height = 32; - - while (true) - { - m_overflowDetected = false; - - page.m_packer = m2::Packer(page.m_width, page.m_height); - page.m_packer.addOverflowFn(bind(&SkinGenerator::markOverflow, this), 10); - - for (TChars::iterator it = fontInfo.m_chars.begin(); it != fontInfo.m_chars.end(); ++it) - { - it->second.first.m_handle = page.m_packer.pack(it->second.first.m_width + 4, it->second.first.m_height + 4); - if (m_overflowDetected) - break; - it->second.second.m_handle = page.m_packer.pack(it->second.second.m_width + 4, it->second.second.m_height + 4); - if (m_overflowDetected) - break; - } - - if (m_overflowDetected) - { - if (page.m_width == page.m_height) - page.m_width *= 2; - else - page.m_height *= 2; - continue; - } - else - break; - } - gil::bgra8_image_t skinImage(page.m_width, page.m_height); gil::fill_pixels(gil::view(skinImage), gil::rgba8_pixel_t(0, 0, 0, 0)); - for (TChars::const_iterator it = fontInfo.m_chars.begin(); it != fontInfo.m_chars.end(); ++it) - { - /// Packing normal char - m2::RectU dstRect(page.m_packer.find(it->second.first.m_handle).second); - - gil::rgba8_pixel_t color(0, 0, 0, 0); - - gil::bgra8_view_t dstView = gil::subimage_view(gil::view(skinImage), dstRect.minX(), dstRect.minY(), dstRect.SizeX(), dstRect.SizeY()); - gil::fill_pixels(dstView, color); - - dstView = gil::subimage_view(gil::view(skinImage), - dstRect.minX() + 2, - dstRect.minY() + 2, - dstRect.SizeX() - 4, - dstRect.SizeY() - 4); - - gil::gray8c_view_t srcView = gil::const_view(it->second.first.m_image); - - for (size_t x = 0; x < dstRect.SizeX() - 4; ++x) - for (size_t y = 0; y < dstRect.SizeY() - 4; ++y) - { - color[3] = srcView(x, y); - dstView(x, y) = color; - } - - /// packing stroked version - - dstRect = m2::RectU(page.m_packer.find(it->second.second.m_handle).second); - - color = gil::rgba8_pixel_t(255, 255, 255, 0); - - dstView = gil::subimage_view(gil::view(skinImage), dstRect.minX(), dstRect.minY(), dstRect.SizeX(), dstRect.SizeY()); - gil::fill_pixels(dstView, color); - - dstView = gil::subimage_view(gil::view(skinImage), - dstRect.minX() + 2, - dstRect.minY() + 2, - dstRect.SizeX() - 4, - dstRect.SizeY() - 4); - - srcView = gil::const_view(it->second.second.m_image); - - for (size_t x = 0; x < dstRect.SizeX() - 4; ++x) - for (size_t y = 0; y < dstRect.SizeY() - 4; ++y) - { - color[3] = srcView(x, y); - dstView(x, y) = color; - } - - } - gil::lodepng_write_view( skinName.substr(0, skinName.find_last_of("/") + 1) + page.m_fileName + ".png", - gil::const_view(skinImage)); + gil::const_view(skinImage));*/ } FT_Done_Face(face); @@ -328,6 +219,8 @@ namespace tools double symbolScale = symbolScales[i]; QSize symbolSize = symbolSizes[i]; + page.m_fileName = skinName.substr(0, skinName.find_last_of("/") + 1) + "symbols_" + QString("%1").arg(symbolSize.width()).toLocal8Bit().constData(); + for (int i = 0; i < fileNames.size(); ++i) { if (fileNames.at(i).endsWith(".svg")) @@ -357,8 +250,14 @@ namespace tools } } } - - /// Trying to repack symbols as tight as possible + } + } + void SkinGenerator::renderPages() + { + for (TSkinPages::iterator pageIt = m_pages.begin(); pageIt != m_pages.end(); ++pageIt) + { + SkinPageInfo & page = *pageIt; + /// Trying to repack all elements as tight as possible page.m_width = 64; page.m_height = 64; @@ -374,24 +273,52 @@ namespace tools { it->m_handle = page.m_packer.pack(it->m_size.width(), it->m_size.height()); if (m_overflowDetected) - { - /// enlarge packing area and try again - if (page.m_width == page.m_height) - page.m_width *= 2; - else - page.m_height *= 2; break; - } } if (m_overflowDetected) + { + /// enlarge packing area and try again + if (page.m_width == page.m_height) + page.m_width *= 2; + else + page.m_height *= 2; continue; + } + + for (TFonts::iterator fontIt = page.m_fonts.begin(); fontIt != page.m_fonts.end(); ++fontIt) + { + for (TChars::iterator charIt = fontIt->m_chars.begin(); charIt != fontIt->m_chars.end(); ++charIt) + { + charIt->second.first.m_handle = page.m_packer.pack( + charIt->second.first.m_width + 4, + charIt->second.first.m_height + 4); + if (m_overflowDetected) + break; + + charIt->second.second.m_handle = page.m_packer.pack( + charIt->second.second.m_width + 4, + charIt->second.second.m_height + 4); + + if (m_overflowDetected) + break; + } + if (m_overflowDetected) + break; + } + + if (m_overflowDetected) + { + if (page.m_width == page.m_height) + page.m_width *= 2; + else + page.m_height *= 2; + continue; + } break; } - /// rendering packed symbols - gil::bgra8_image_t gilImage(page.m_width, page.m_height); gil::fill_pixels(gil::view(gilImage), gil::rgba8_pixel_t(0, 0, 0, 0)); QImage img((uchar*)&gil::view(gilImage)(0, 0), page.m_width, page.m_height, QImage::Format_ARGB32); @@ -411,8 +338,60 @@ namespace tools m_svgRenderer.render(&painter, QRect(dstRect.minX() + 2, dstRect.minY() + 2, dstRect.SizeX() - 4, dstRect.SizeY() - 4)); } - page.m_fileName = skinName.substr(0, skinName.find_last_of("/") + 1) + "symbols_" + QString("%1").arg(symbolSize.width()).toLocal8Bit().constData(); + /// Rendering packed fonts + for (TFonts::const_iterator fontIt = page.m_fonts.begin(); fontIt != page.m_fonts.end(); ++fontIt) + { + for (TChars::const_iterator charIt = fontIt->m_chars.begin(); charIt != fontIt->m_chars.end(); ++charIt) + { + /// Packing normal char + m2::RectU dstRect(page.m_packer.find(charIt->second.first.m_handle).second); + gil::rgba8_pixel_t color(0, 0, 0, 0); + + gil::bgra8_view_t dstView = gil::subimage_view(gil::view(gilImage), dstRect.minX(), dstRect.minY(), dstRect.SizeX(), dstRect.SizeY()); + gil::fill_pixels(dstView, color); + + dstView = gil::subimage_view(gil::view(gilImage), + dstRect.minX() + 2, + dstRect.minY() + 2, + dstRect.SizeX() - 4, + dstRect.SizeY() - 4); + + gil::gray8c_view_t srcView = gil::const_view(charIt->second.first.m_image); + + for (size_t x = 0; x < dstRect.SizeX() - 4; ++x) + for (size_t y = 0; y < dstRect.SizeY() - 4; ++y) + { + color[3] = srcView(x, y); + dstView(x, y) = color; + } + + /// packing stroked version + + dstRect = m2::RectU(page.m_packer.find(charIt->second.second.m_handle).second); + + color = gil::rgba8_pixel_t(255, 255, 255, 0); + + dstView = gil::subimage_view(gil::view(gilImage), dstRect.minX(), dstRect.minY(), dstRect.SizeX(), dstRect.SizeY()); + gil::fill_pixels(dstView, color); + + dstView = gil::subimage_view(gil::view(gilImage), + dstRect.minX() + 2, + dstRect.minY() + 2, + dstRect.SizeX() - 4, + dstRect.SizeY() - 4); + + srcView = gil::const_view(charIt->second.second.m_image); + + for (size_t x = 0; x < dstRect.SizeX() - 4; ++x) + for (size_t y = 0; y < dstRect.SizeY() - 4; ++y) + { + color[3] = srcView(x, y); + dstView(x, y) = color; + } + + } + } img.save((page.m_fileName + ".png").c_str()); } } diff --git a/skin_generator/skin_generator.hpp b/skin_generator/skin_generator.hpp index a82c22a860..54e953bb2d 100644 --- a/skin_generator/skin_generator.hpp +++ b/skin_generator/skin_generator.hpp @@ -84,7 +84,8 @@ namespace tools int m_baseLineOffset; QString m_fontFileName; - vector m_pages; + typedef vector TSkinPages; + TSkinPages m_pages; bool m_overflowDetected; void markOverflow(); @@ -92,8 +93,9 @@ namespace tools public: SkinGenerator(); - void processFont(string const & fileName, string const & skinName, string const & symFreqFile, vector const & fontSizes); + void processFont(string const & fileName, string const & skinName, vector const & fontSizes, int symbolScale); void processSymbols(string const & symbolsDir, string const & skinName, std::vector const & symbolSizes, std::vector const & symbolScales); + void renderPages(); bool writeToFile(string const & skinName); }; } // namespace tools diff --git a/yg/geometry_batcher.cpp b/yg/geometry_batcher.cpp index 21e1b5f0d6..38b3c86f9f 100644 --- a/yg/geometry_batcher.cpp +++ b/yg/geometry_batcher.cpp @@ -544,12 +544,12 @@ namespace yg } template - void GeometryBatcher::ForEachGlyph(uint8_t fontSize, wstring const & text, bool isMask, ToDo toDo) + void GeometryBatcher::ForEachGlyph(uint8_t fontSize, wstring const & text, bool isMask, bool isFixedFont, ToDo toDo) { m2::PointD currPt(0, 0); for (size_t i = 0; i < text.size(); ++i) { - uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, isMask)); + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, isMask), isFixedFont); CharStyle const * p = static_cast(m_skin->fromID(glyphID)); if (p) { @@ -559,12 +559,12 @@ namespace yg } } - void GeometryBatcher::drawText(m2::PointD const & pt, float angle, uint8_t fontSize, string const & utf8Text, double depth) + void GeometryBatcher::drawText(m2::PointD const & pt, float angle, uint8_t fontSize, string const & utf8Text, double depth, bool isFixedFont) { wstring text = FromUtf8(utf8Text); - ForEachGlyph(fontSize, text, true, bind(&GeometryBatcher::drawGlyph, this, cref(pt), _1, angle, 0, _2, depth)); - ForEachGlyph(fontSize, text, false, bind(&GeometryBatcher::drawGlyph, this, cref(pt), _1, angle, 0, _2, depth)); + ForEachGlyph(fontSize, text, true, isFixedFont, bind(&GeometryBatcher::drawGlyph, this, cref(pt), _1, angle, 0, _2, depth)); + ForEachGlyph(fontSize, text, false, isFixedFont, bind(&GeometryBatcher::drawGlyph, this, cref(pt), _1, angle, 0, _2, depth)); } m2::RectD const GeometryBatcher::textRect(string const & utf8Text, uint8_t fontSize) @@ -646,15 +646,15 @@ namespace yg } void GeometryBatcher::drawPathText(m2::PointD const * path, size_t s, uint8_t fontSize, string const & utf8Text, - double pathLength, TextPos pos, bool isMasked, double depth) + double pathLength, TextPos pos, bool isMasked, double depth, bool isFixedFont) { if (isMasked) - drawPathTextImpl(path, s, fontSize, utf8Text, pathLength, pos, true, depth); - drawPathTextImpl(path, s, fontSize, utf8Text, pathLength, pos, false, depth); + drawPathTextImpl(path, s, fontSize, utf8Text, pathLength, pos, true, depth, isFixedFont); + drawPathTextImpl(path, s, fontSize, utf8Text, pathLength, pos, false, depth, isFixedFont); } void GeometryBatcher::drawPathTextImpl(m2::PointD const * path, size_t s, uint8_t fontSize, string const & utf8Text, - double pathLength, TextPos pos, bool fromMask, double depth) + double pathLength, TextPos pos, bool fromMask, double depth, bool isFixedFont) { pts_array arrPath(path, s); @@ -678,7 +678,7 @@ namespace yg double strLength = 0.0; for (size_t i = 0; i < text.size(); ++i) { - uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, fromMask)); + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, fromMask), isFixedFont); CharStyle const * p = static_cast(m_skin->fromID(glyphID)); strLength += p->m_xAdvance; } @@ -696,7 +696,7 @@ namespace yg if (!CalcPointAndAngle(arrPath, offset, ind, ptOrg, angle)) break; - uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, fromMask)); + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, fromMask), isFixedFont); CharStyle const * p = static_cast(m_skin->fromID(glyphID)); drawGlyph(ptOrg, m2::PointD(0.0, 0.0), angle, blOffset, p, depth); diff --git a/yg/geometry_batcher.hpp b/yg/geometry_batcher.hpp index cb1bdd308e..5364ee9e97 100644 --- a/yg/geometry_batcher.hpp +++ b/yg/geometry_batcher.hpp @@ -86,7 +86,8 @@ namespace yg double pathLength, TextPos pos, bool fromMask, - double depth); + double depth, + bool isFixedFont); public: @@ -120,7 +121,7 @@ namespace yg private: template - void ForEachGlyph(uint8_t fontSize, wstring const & text, bool isMask, ToDo toDo); + void ForEachGlyph(uint8_t fontSize, wstring const & text, bool isMask, bool isFixedFont, ToDo toDo); public: /// Drawing text from point rotated by the angle. @@ -128,7 +129,8 @@ namespace yg float angle, uint8_t fontSize, string const & utf8Text, - double depth); + double depth, + bool fixedFont = false); m2::RectD const textRect(string const & utf8Text, uint8_t fontSize); @@ -141,7 +143,8 @@ namespace yg double pathLength, TextPos pos, bool isMasked, - double depth); + double depth, + bool isFixedFont = false); /// This functions hide the base_t functions with the same name and signature /// to flush(-1) upon calling them diff --git a/yg/glyph_cache.cpp b/yg/glyph_cache.cpp index 8da91028cd..a73b6c4a7f 100644 --- a/yg/glyph_cache.cpp +++ b/yg/glyph_cache.cpp @@ -19,6 +19,13 @@ namespace yg : m_id(id), m_fontSize(fontSize), m_isMask(isMask) {} + uint32_t GlyphKey::toUInt32() const + { + return static_cast(m_id) << 16 + | static_cast(m_fontSize) << 8 + | static_cast(m_isMask); + } + bool operator<(GlyphKey const & l, GlyphKey const & r) { if (l.m_id != r.m_id) diff --git a/yg/glyph_cache.hpp b/yg/glyph_cache.hpp index 2f92581372..120d38f2db 100644 --- a/yg/glyph_cache.hpp +++ b/yg/glyph_cache.hpp @@ -29,6 +29,7 @@ namespace yg int m_id; int m_fontSize; bool m_isMask; + uint32_t toUInt32() const; GlyphKey(int id, int fontSize, bool isMask); }; diff --git a/yg/skin.cpp b/yg/skin.cpp index 6bafcdff27..e0488e1312 100644 --- a/yg/skin.cpp +++ b/yg/skin.cpp @@ -115,17 +115,20 @@ namespace yg return packID(m_currentDynamicPage, m_pages[m_currentDynamicPage]->mapPenInfo(penInfo)); } - uint32_t Skin::mapGlyph(GlyphKey const & gk) + uint32_t Skin::mapGlyph(GlyphKey const & gk, bool isFixedFont) { uint32_t res = invalidPageHandle(); for (uint8_t i = 0; i < m_pages.size(); ++i) { - res = m_pages[i]->findGlyph(gk); + res = m_pages[i]->findGlyph(gk, isFixedFont); if (res != invalidPageHandle()) return packID(i, res); } + if (isFixedFont) + return res; + if (!m_pages[m_currentTextPage]->hasRoom(gk)) changeCurrentTextPage(); diff --git a/yg/skin.hpp b/yg/skin.hpp index d6f0f7ee74..3c7e32e328 100644 --- a/yg/skin.hpp +++ b/yg/skin.hpp @@ -117,7 +117,7 @@ namespace yg /// find glyph identified by GlyphKey on texture /// if found - return id /// if not - pack and return id - uint32_t mapGlyph(GlyphKey const & gk); + uint32_t mapGlyph(GlyphKey const & gk, bool isFixedFont); void addClearPageFn(clearPageFn fn, int priority); void addOverflowFn(overflowFn, int priority); diff --git a/yg/skin_loader.cpp b/yg/skin_loader.cpp index d5b3bd5381..9f3a947652 100644 --- a/yg/skin_loader.cpp +++ b/yg/skin_loader.cpp @@ -89,6 +89,16 @@ namespace yg m_stylesList.erase(prevIt); prevIt = it; } + + for (TFonts::const_iterator it = m_fonts.begin(); it != m_fonts.end(); ++it) + { + FontInfo fontInfo; + fontInfo.m_fontSize = it->first; + fontInfo.m_chars = it->second; + m_pages.back()->m_fonts.push_back(fontInfo); + } + + m_fonts.clear(); } void SkinLoader::popSkin() diff --git a/yg/skin_page.cpp b/yg/skin_page.cpp index d66ed9995f..6b7270e6ec 100644 --- a/yg/skin_page.cpp +++ b/yg/skin_page.cpp @@ -34,7 +34,7 @@ namespace yg : m_penInfo(penInfo), m_rect(rect){} - ResourceStyle * FontInfo::fromID(uint32_t id, bool primaryGlyph) const + ResourceStyle * FontInfo::fromID(uint32_t id, bool isMask) const { TChars::const_iterator it = m_chars.find(id); if (it == m_chars.end()) @@ -51,16 +51,16 @@ namespace yg m_invalidChar = pair(it->second.first.get(), it->second.second.get()); } - if (primaryGlyph) - return m_invalidChar.first; - else + if (isMask) return m_invalidChar.second; + else + return m_invalidChar.first; } else - if (primaryGlyph) - return it->second.first.get(); - else + if (isMask) return it->second.second.get(); + else + return it->second.first.get(); } SkinPage::SkinPage(shared_ptr const & resourceManager, @@ -161,8 +161,40 @@ namespace yg return it->second; } - uint32_t SkinPage::findGlyph(GlyphKey const & g) const + uint32_t SkinPage::findGlyph(GlyphKey const & g, bool isFixedFont) const { + if (isFixedFont) + { + TStyles::const_iterator styleIt = m_styles.find(g.toUInt32()); + if (styleIt != m_styles.end()) + return g.toUInt32(); + TFonts::const_iterator fontIt = m_fonts.begin(); + int lastFontSize = 0; + if (!m_fonts.empty()) + lastFontSize = m_fonts[0].m_fontSize; + + for (TFonts::const_iterator it = m_fonts.begin(); it != m_fonts.end(); ++it) + if ((lastFontSize < g.m_fontSize) && (g.m_fontSize >= it->m_fontSize)) + fontIt = it; + else + lastFontSize = it->m_fontSize; + + if (fontIt != m_fonts.end()) + { + FontInfo::TChars::const_iterator charIt = fontIt->m_chars.find(g.m_id); + if (charIt != fontIt->m_chars.end()) + { + if (g.m_isMask) + const_cast(m_styles)[g.toUInt32()] = charIt->second.second; + else + const_cast(m_styles)[g.toUInt32()]= charIt->second.first; + return g.toUInt32(); + } + } + + return m_packer.invalidHandle(); + } + TGlyphMap::const_iterator it = m_glyphMap.find(g); if (it == m_glyphMap.end()) return m_packer.invalidHandle(); @@ -172,7 +204,7 @@ namespace yg uint32_t SkinPage::mapGlyph(yg::GlyphKey const & g) { - uint32_t foundHandle = findGlyph(g); + uint32_t foundHandle = findGlyph(g, false); if (foundHandle != m_packer.invalidHandle()) return foundHandle; diff --git a/yg/skin_page.hpp b/yg/skin_page.hpp index 7df7371a55..760a4d0886 100644 --- a/yg/skin_page.hpp +++ b/yg/skin_page.hpp @@ -56,7 +56,7 @@ namespace yg mutable pair m_invalidChar; FontInfo() : m_invalidChar(0, 0){} - ResourceStyle * fromID(uint32_t id, bool primaryGlyph = true) const; + ResourceStyle * fromID(uint32_t id, bool isMask = false) const; }; class SkinPage @@ -96,6 +96,9 @@ namespace yg void uploadColors(); void uploadGlyphs(); + typedef vector TFonts; + TFonts m_fonts; + bool m_isDynamic; uint32_t m_pageID; @@ -137,7 +140,7 @@ namespace yg uint32_t mapPenInfo(PenInfo const & penInfo); bool hasRoom(PenInfo const & penInfo) const; - uint32_t findGlyph(GlyphKey const & g) const; + uint32_t findGlyph(GlyphKey const & g, bool isFixedFont) const; uint32_t mapGlyph(GlyphKey const & g); bool hasRoom(GlyphKey const & g) const; diff --git a/yg/text_renderer.cpp b/yg/text_renderer.cpp index 7b2162776e..2274f1a3f7 100644 --- a/yg/text_renderer.cpp +++ b/yg/text_renderer.cpp @@ -28,7 +28,7 @@ namespace yg void TextRenderer::TextObj::Draw(GeometryBatcher * pBatcher) const { - pBatcher->drawText(m_pt, 0.0, m_size, m_utf8Text, yg::maxDepth); + pBatcher->drawText(m_pt, 0.0, m_size, m_utf8Text, yg::maxDepth, m_isFixedFont); } m2::RectD const TextRenderer::TextObj::GetLimitRect(GeometryBatcher * pBatcher) const @@ -40,24 +40,30 @@ namespace yg float angle, uint8_t fontSize, string const & utf8Text, - double depth) + double depth, + bool isFixedFont) { - TextObj obj(pt, utf8Text, fontSize, depth); - m2::RectD r = obj.GetLimitRect(this); - /* - m2::PointD pts[5] = + if (isFixedFont) + base_t::drawText(pt, angle, fontSize, utf8Text, depth, isFixedFont); + else { - m2::PointD(r.minX(), r.minY()), - m2::PointD(r.minX(), r.maxY()), - m2::PointD(r.maxX(), r.maxY()), - m2::PointD(r.maxX(), r.minY()), - m2::PointD(r.minX(), r.minY()) - }; + TextObj obj(pt, utf8Text, fontSize, depth, isFixedFont); + m2::RectD r = obj.GetLimitRect(this); + /* + m2::PointD pts[5] = + { + m2::PointD(r.minX(), r.minY()), + m2::PointD(r.minX(), r.maxY()), + m2::PointD(r.maxX(), r.maxY()), + m2::PointD(r.maxX(), r.minY()), + m2::PointD(r.minX(), r.minY()) + }; - drawPath(pts, 5, skin()->mapPenInfo(yg::PenInfo(yg::Color(0, 0, 0, 255), 2, 0, 0, 0)), depth); + drawPath(pts, 5, skin()->mapPenInfo(yg::PenInfo(yg::Color(0, 0, 0, 255), 2, 0, 0, 0)), depth); */ - m_tree.ReplaceIf(obj, r, TextObj::better_depth()); + m_tree.ReplaceIf(obj, r, TextObj::better_depth()); + } } void TextRenderer::endFrame() diff --git a/yg/text_renderer.hpp b/yg/text_renderer.hpp index 721aa4ecd9..cd26436058 100644 --- a/yg/text_renderer.hpp +++ b/yg/text_renderer.hpp @@ -21,10 +21,11 @@ namespace yg uint8_t m_size; string m_utf8Text; double m_depth; + bool m_isFixedFont; public: - TextObj(m2::PointD const & pt, string const & txt, uint8_t sz, double d) - : m_pt(pt), m_size(sz), m_utf8Text(txt), m_depth(d) + TextObj(m2::PointD const & pt, string const & txt, uint8_t sz, double d, bool isFixedFont) + : m_pt(pt), m_size(sz), m_utf8Text(txt), m_depth(d), m_isFixedFont(isFixedFont) { } @@ -59,7 +60,8 @@ namespace yg float angle, uint8_t fontSize, string const & utf8Text, - double depth); + double depth, + bool isFixedFont = false); void endFrame(); }; diff --git a/yg/yg_tests/screengl_test.cpp b/yg/yg_tests/screengl_test.cpp index 5287bb5414..314b6a5d1e 100644 --- a/yg/yg_tests/screengl_test.cpp +++ b/yg/yg_tests/screengl_test.cpp @@ -484,6 +484,14 @@ namespace } }; + struct TestDrawStringWithFixedFont + { + void DoDraw(shared_ptr p) + { + p->drawText(m2::PointD(40, 50), 0/*, math::pi / 18*/, 12, "Simplicity is the ultimate sophistication", 0, true); + } + }; + double calc_length(vector const & v) { double ret = 0.0; @@ -751,27 +759,28 @@ namespace } }; - UNIT_TEST_GL(TestDrawPolyOverflow); - UNIT_TEST_GL(TestDrawText); - UNIT_TEST_GL(TestDrawSingleSymbol); - UNIT_TEST_GL(TestDrawEmptySymbol); - UNIT_TEST_GL(TestDrawSingleSymbolAndSolidPath); - UNIT_TEST_GL(TestDrawString); - UNIT_TEST_GL(TestDrawStringOnString); - UNIT_TEST_GL(TestDrawTextOnPath); - UNIT_TEST_GL(TestDrawTextOnPathWithOffset); - UNIT_TEST_GL(TestDrawTextOverflow); - UNIT_TEST_GL(TestDrawTextFiltering); - UNIT_TEST_GL(TestDrawRandomTextFiltering); - UNIT_TEST_GL(TestDrawSGIConvex); - UNIT_TEST_GL(TestDrawPoly); - UNIT_TEST_GL(TestDrawSolidRect); - UNIT_TEST_GL(TestDrawPathWithSkinPageMiss); - UNIT_TEST_GL(TestDrawPathWithOffset); - UNIT_TEST_GL(TestDrawPathJoin); - UNIT_TEST_GL(TestDrawPathSolid); - UNIT_TEST_GL(TestDrawPathSolidWithZ); - UNIT_TEST_GL(TestDrawPathSolidWithClipRect); - UNIT_TEST_GL(TestDrawUtilsRect); - UNIT_TEST_GL(TestDrawUtilsRectFilledTexture); +// UNIT_TEST_GL(TestDrawPolyOverflow); +// UNIT_TEST_GL(TestDrawText); +// UNIT_TEST_GL(TestDrawSingleSymbol); +// UNIT_TEST_GL(TestDrawEmptySymbol); +// UNIT_TEST_GL(TestDrawSingleSymbolAndSolidPath); +// UNIT_TEST_GL(TestDrawString); + UNIT_TEST_GL(TestDrawStringWithFixedFont); +// UNIT_TEST_GL(TestDrawStringOnString); +// UNIT_TEST_GL(TestDrawTextOnPath); +// UNIT_TEST_GL(TestDrawTextOnPathWithOffset); +// UNIT_TEST_GL(TestDrawTextOverflow); +// UNIT_TEST_GL(TestDrawTextFiltering); +// UNIT_TEST_GL(TestDrawRandomTextFiltering); +// UNIT_TEST_GL(TestDrawSGIConvex); +// UNIT_TEST_GL(TestDrawPoly); +// UNIT_TEST_GL(TestDrawSolidRect); +// UNIT_TEST_GL(TestDrawPathWithSkinPageMiss); +// UNIT_TEST_GL(TestDrawPathWithOffset); +// UNIT_TEST_GL(TestDrawPathJoin); +// UNIT_TEST_GL(TestDrawPathSolid); +// UNIT_TEST_GL(TestDrawPathSolidWithZ); +// UNIT_TEST_GL(TestDrawPathSolidWithClipRect); +// UNIT_TEST_GL(TestDrawUtilsRect); +// UNIT_TEST_GL(TestDrawUtilsRectFilledTexture); }