Browse Source

Text: port to new Utility::Path, including plugins.

Like in Trade, the unatomic exists() + read() pair (and silent failures
if the file exists but can't be read) was replaced with just
Path::read() that now returns an Optional. Besides that, not much worth
mentioning.
pull/556/head
Vladimír Vondruš 4 years ago
parent
commit
05c0a01b94
  1. 16
      doc/snippets/MagnumText.cpp
  2. 12
      src/Magnum/Text/AbstractFont.cpp
  3. 17
      src/Magnum/Text/AbstractFontConverter.cpp
  4. 107
      src/Magnum/Text/Test/AbstractFontConverterTest.cpp
  5. 11
      src/Magnum/Text/Test/AbstractFontTest.cpp
  6. 10
      src/MagnumPlugins/MagnumFont/MagnumFont.cpp
  7. 6
      src/MagnumPlugins/MagnumFont/Test/MagnumFontGLTest.cpp
  8. 26
      src/MagnumPlugins/MagnumFont/Test/MagnumFontTest.cpp
  9. 5
      src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp
  10. 25
      src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterTest.cpp

16
doc/snippets/MagnumText.cpp

@ -25,8 +25,10 @@
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringView.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once file callbacks are <string>-free */
#include <Corrade/PluginManager/Manager.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include <Corrade/Utility/Resource.h>
#include "Magnum/FileCallback.h"
@ -62,8 +64,8 @@ font->fillGlyphCache(cache, "abcdefghijklmnopqrstuvwxyz"
Containers::Pointer<Text::AbstractFont> font;
/* [AbstractFont-usage-callbacks] */
struct Data {
std::unordered_map<std::string,
Containers::Array<const char, Utility::Directory::MapDeleter>> files;
std::unordered_map<std::string, Containers::Optional<
Containers::Array<const char, Utility::Path::MapDeleter>>> files;
} data;
font->setFileCallback([](const std::string& filename,
@ -78,11 +80,13 @@ font->setFileCallback([](const std::string& filename,
return {};
}
/* Load if not there yet */
/* Load if not there yet. If the mapping fails, remember that to not
attempt to load the same file again next time. */
if(found == data.files.end()) found = data.files.emplace(
filename, Utility::Directory::mapRead(filename)).first;
filename, Utility::Path::mapRead(filename)).first;
return Containers::arrayView(found->second);
if(!found->second) return {};
return Containers::arrayView(*found->second);
}, data);
font->openFile("magnum-font.conf", 13.0f);

12
src/Magnum/Text/AbstractFont.cpp

@ -28,8 +28,10 @@
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/EnumSet.hpp>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/String.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once PluginManager is <string>-free */
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include <Corrade/Utility/Unicode.h>
#include "Magnum/FileCallback.h"
@ -52,9 +54,10 @@ std::string AbstractFont::pluginInterface() {
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
std::vector<std::string> AbstractFont::pluginSearchPaths() {
const Containers::Optional<Containers::String> libraryLocation = Utility::Path::libraryLocation(&pluginInterface);
return PluginManager::implicitPluginSearchPaths(
#ifndef MAGNUM_BUILD_STATIC
Utility::Directory::libraryLocation(&pluginInterface),
libraryLocation ? *libraryLocation : Containers::String{},
#else
{},
#endif
@ -185,12 +188,13 @@ auto AbstractFont::doOpenFile(const std::string& filename, const Float size) ->
/* Otherwise open the file directly */
} else {
if(!Utility::Directory::exists(filename)) {
const Containers::Optional<Containers::Array<char>> data = Utility::Path::read(filename);
if(!data) {
Error() << "Text::AbstractFont::openFile(): cannot open file" << filename;
return {};
}
metrics = doOpenData(Utility::Directory::read(filename), size);
metrics = doOpenData(*data, size);
}
return metrics;

17
src/Magnum/Text/AbstractFontConverter.cpp

@ -28,9 +28,12 @@
#include <algorithm> /* std::sort(), std::unique() */
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/EnumSet.hpp>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/String.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once PluginManager and AbstractFontConverter is <string>-free */
#include <Corrade/Utility/Assert.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include <Corrade/Utility/Unicode.h>
#include "Magnum/Text/AbstractGlyphCache.h"
@ -67,9 +70,10 @@ std::string AbstractFontConverter::pluginInterface() {
#ifndef CORRADE_PLUGINMANAGER_NO_DYNAMIC_PLUGIN_SUPPORT
std::vector<std::string> AbstractFontConverter::pluginSearchPaths() {
const Containers::Optional<Containers::String> libraryLocation = Utility::Path::libraryLocation(&pluginInterface);
return PluginManager::implicitPluginSearchPaths(
#ifndef MAGNUM_BUILD_STATIC
Utility::Directory::libraryLocation(&pluginInterface),
libraryLocation ? *libraryLocation : Containers::String{},
#else
{},
#endif
@ -136,7 +140,7 @@ bool AbstractFontConverter::doExportFontToFile(AbstractFont& font, AbstractGlyph
const auto data = doExportFontToData(font, cache, filename, characters);
if(data.empty()) return false;
for(const auto& d: data) if(!Utility::Directory::write(d.first, d.second)) {
for(const auto& d: data) if(!Utility::Path::write(d.first, d.second)) {
Error() << "Text::AbstractFontConverter::exportFontToFile(): cannot write to file" << d.first;
return false;
}
@ -189,7 +193,7 @@ bool AbstractFontConverter::doExportGlyphCacheToFile(AbstractGlyphCache& cache,
const auto data = doExportGlyphCacheToData(cache, filename);
if(data.empty()) return false;
for(const auto& d: data) if(!Utility::Directory::write(d.first, d.second)) {
for(const auto& d: data) if(!Utility::Path::write(d.first, d.second)) {
Error() << "Text::AbstractFontConverter::exportGlyphCacheToFile(): cannot write to file" << d.first;
return false;
}
@ -240,12 +244,13 @@ Containers::Pointer<AbstractGlyphCache> AbstractFontConverter::doImportGlyphCach
"Text::AbstractFontConverter::importGlyphCacheFromFile(): feature advertised but not implemented", {});
/* Open file */
if(!Utility::Directory::exists(filename)) {
const Containers::Optional<Containers::Array<char>> data = Utility::Path::read(filename);
if(!data) {
Error() << "Text::AbstractFontConverter::importGlyphCacheFromFile(): cannot open file" << filename;
return nullptr;
}
return doImportGlyphCacheFromSingleData(Utility::Directory::read(filename));
return doImportGlyphCacheFromSingleData(*data);
}
Debug& operator<<(Debug& debug, const FontConverterFeature value) {

107
src/Magnum/Text/Test/AbstractFontConverterTest.cpp

@ -25,13 +25,14 @@
#include <sstream>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/StringStl.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove when AbstractFontConverter is <string>-free */
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/FileToString.h>
#include <Corrade/TestSuite/Compare/Container.h>
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/Text/AbstractFont.h"
#include "Magnum/Text/AbstractFontConverter.h"
@ -151,7 +152,7 @@ AbstractFontConverterTest::AbstractFontConverterTest() {
&AbstractFontConverterTest::debugFeatures});
/* Create testing dir */
Utility::Directory::mkpath(TEXT_TEST_OUTPUT_DIR);
Utility::Path::make(TEXT_TEST_OUTPUT_DIR);
}
struct DummyFont: AbstractFont {
@ -366,20 +367,22 @@ void AbstractFontConverterTest::exportFontToFile() {
}
bool doExportFontToFile(AbstractFont&, AbstractGlyphCache&, const std::string& filename, const std::u32string& characters) const override {
return
Utility::Directory::write(filename, Containers::arrayView({'\xf0'})) &&
Utility::Directory::write(filename + ".dat", Containers::arrayView({'\xfe', char(characters.size())}));
CORRADE_VERIFY(Utility::Path::write(filename, Containers::arrayView({'\xf0'})));
CORRADE_VERIFY(Utility::Path::write(filename + ".dat", Containers::arrayView({'\xfe', char(characters.size())})));
return true;
}
} converter;
const std::string filename = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "font.out");
const std::string filename2 = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "font.out.dat");
Containers::String filename = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "font.out");
Containers::String filename2 = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "font.out.dat");
/* Remove previous files, if any */
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
if(Utility::Directory::exists(filename2))
CORRADE_VERIFY(Utility::Directory::rm(filename2));
if(Utility::Path::exists(filename))
CORRADE_VERIFY(Utility::Path::remove(filename));
if(Utility::Path::exists(filename2))
CORRADE_VERIFY(Utility::Path::remove(filename2));
CORRADE_VERIFY(true); /* Capture correct function name first */
CORRADE_VERIFY(converter.exportFontToFile(dummyFont, dummyGlyphCache, filename, "eh"));
CORRADE_COMPARE_AS(filename, "\xf0",
@ -436,14 +439,14 @@ void AbstractFontConverterTest::exportFontToFileThroughData() {
}
} converter;
const std::string filename = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "font.out");
const std::string filename2 = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "font.out.dat");
Containers::String filename = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "font.out");
Containers::String filename2 = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "font.out.dat");
/* Remove previous files, if any */
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
if(Utility::Directory::exists(filename2))
CORRADE_VERIFY(Utility::Directory::rm(filename2));
if(Utility::Path::exists(filename))
CORRADE_VERIFY(Utility::Path::remove(filename));
if(Utility::Path::exists(filename2))
CORRADE_VERIFY(Utility::Path::remove(filename2));
/* doExportToFile() should call doExportToData() */
CORRADE_VERIFY(converter.exportFontToFile(dummyFont, dummyGlyphCache, filename, "awoo"));
@ -462,18 +465,18 @@ void AbstractFontConverterTest::exportFontToFileThroughDataFailed() {
std::vector<std::pair<std::string, Containers::Array<char>>> doExportFontToData(AbstractFont&, AbstractGlyphCache&, const std::string&, const std::u32string&) const override { return {}; }
} converter;
const std::string filename = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "font.out");
Containers::String filename = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "font.out");
/* Remove previous file, if any */
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
if(Utility::Path::exists(filename))
CORRADE_VERIFY(Utility::Path::remove(filename));
/* Function should fail, no file should get written and no error output
should be printed (the base implementation assumes the plugin does it) */
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter.exportFontToFile(dummyFont, dummyGlyphCache, filename, {}));
CORRADE_VERIFY(!Utility::Directory::exists(filename));
CORRADE_VERIFY(!Utility::Path::exists(filename));
CORRADE_COMPARE(out.str(), "");
}
@ -668,20 +671,22 @@ void AbstractFontConverterTest::exportGlyphCacheToFile() {
}
bool doExportGlyphCacheToFile(AbstractGlyphCache&, const std::string& filename) const override {
return
Utility::Directory::write(filename, Containers::arrayView({'\xf0'})) &&
Utility::Directory::write(filename + ".dat", Containers::arrayView({'\xfe', '\xed'}));
CORRADE_VERIFY(Utility::Path::write(filename, Containers::arrayView({'\xf0'})));
CORRADE_VERIFY(Utility::Path::write(filename + ".dat", Containers::arrayView({'\xfe', '\xed'})));
return true;
}
} converter;
const std::string filename = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "cache.out");
const std::string filename2 = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "cache.out.dat");
Containers::String filename = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "cache.out");
Containers::String filename2 = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "cache.out.dat");
/* Remove previous files, if any */
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
if(Utility::Directory::exists(filename2))
CORRADE_VERIFY(Utility::Directory::rm(filename2));
if(Utility::Path::exists(filename))
CORRADE_VERIFY(Utility::Path::remove(filename));
if(Utility::Path::exists(filename2))
CORRADE_VERIFY(Utility::Path::remove(filename2));
CORRADE_VERIFY(true); /* Capture correct function name first */
CORRADE_VERIFY(converter.exportGlyphCacheToFile(dummyGlyphCache, filename));
CORRADE_COMPARE_AS(filename, "\xf0",
@ -738,14 +743,14 @@ void AbstractFontConverterTest::exportGlyphCacheToFileThroughData() {
}
} converter;
const std::string filename = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "cache.out");
const std::string filename2 = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "cache.out.dat");
Containers::String filename = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "cache.out");
Containers::String filename2 = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "cache.out.dat");
/* Remove previous files, if any */
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
if(Utility::Directory::exists(filename2))
CORRADE_VERIFY(Utility::Directory::rm(filename2));
if(Utility::Path::exists(filename))
CORRADE_VERIFY(Utility::Path::remove(filename));
if(Utility::Path::exists(filename2))
CORRADE_VERIFY(Utility::Path::remove(filename2));
/* doExportGlyphCacheToFile() should call doExportGlyphCacheToData() */
CORRADE_VERIFY(converter.exportGlyphCacheToFile(dummyGlyphCache, filename));
@ -762,18 +767,17 @@ void AbstractFontConverterTest::exportGlyphCacheToFileThroughDataFailed() {
std::vector<std::pair<std::string, Containers::Array<char>>> doExportGlyphCacheToData(AbstractGlyphCache&, const std::string&) const override { return {}; }
} converter;
const std::string filename = Utility::Directory::join(TEXT_TEST_OUTPUT_DIR, "cache.out");
/* Remove previous file, if any */
if(Utility::Directory::exists(filename))
CORRADE_VERIFY(Utility::Directory::rm(filename));
Containers::String filename = Utility::Path::join(TEXT_TEST_OUTPUT_DIR, "cache.out");
if(Utility::Path::exists(filename))
CORRADE_VERIFY(Utility::Path::remove(filename));
/* Function should fail, no file should get written and no error output
should be printed (the base implementation assumes the plugin does it) */
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter.exportGlyphCacheToFile(dummyGlyphCache, filename));
CORRADE_VERIFY(!Utility::Directory::exists(filename));
CORRADE_VERIFY(!Utility::Path::exists(filename));
CORRADE_COMPARE(out.str(), "");
}
@ -964,14 +968,16 @@ void AbstractFontConverterTest::importGlyphCacheFromFile() {
}
Containers::Pointer<AbstractGlyphCache> doImportGlyphCacheFromFile(const std::string& filename) const override {
Containers::Array<char> data = Utility::Directory::read(filename);
if(data.size() == 1 && data[0] == '\xa5')
return Containers::pointer(new DummyGlyphCache{{123, 345}});
return nullptr;
Containers::Optional<Containers::Array<char>> data = Utility::Path::read(filename);
CORRADE_VERIFY(data);
CORRADE_COMPARE_AS(*data,
Containers::arrayView({'\xa5'}),
TestSuite::Compare::Container);
return Containers::pointer(new DummyGlyphCache{{123, 345}});
}
} converter;
Containers::Pointer<AbstractGlyphCache> cache = converter.importGlyphCacheFromFile(Utility::Directory::join(TEXT_TEST_DIR, "data.bin"));
Containers::Pointer<AbstractGlyphCache> cache = converter.importGlyphCacheFromFile(Utility::Path::join(TEXT_TEST_DIR, "data.bin"));
CORRADE_VERIFY(cache);
CORRADE_COMPARE(cache->textureSize(), (Vector2i{123, 345}));
}
@ -1024,7 +1030,7 @@ void AbstractFontConverterTest::importGlyphCacheFromFileAsSingleData() {
} converter;
/* doImportFromFile() should call doImportFromSingleData() */
Containers::Pointer<AbstractGlyphCache> cache = converter.importGlyphCacheFromFile(Utility::Directory::join(TEXT_TEST_DIR, "data.bin"));
Containers::Pointer<AbstractGlyphCache> cache = converter.importGlyphCacheFromFile(Utility::Path::join(TEXT_TEST_DIR, "data.bin"));
CORRADE_VERIFY(cache);
CORRADE_COMPARE(cache->textureSize(), (Vector2i{123, 345}));
}
@ -1044,7 +1050,10 @@ void AbstractFontConverterTest::importGlyphCacheFromFileAsSingleDataNotFound() {
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter.importGlyphCacheFromFile("nonexistent.bin"));
CORRADE_COMPARE(out.str(), "Text::AbstractFontConverter::importGlyphCacheFromFile(): cannot open file nonexistent.bin\n");
/* There's an error message from Path::read() before */
CORRADE_COMPARE_AS(out.str(),
"\nText::AbstractFontConverter::importGlyphCacheFromFile(): cannot open file nonexistent.bin\n",
TestSuite::Compare::StringHasSuffix);
}
void AbstractFontConverterTest::debugFeature() {

11
src/Magnum/Text/Test/AbstractFontTest.cpp

@ -26,9 +26,11 @@
#include <sstream>
#include <Corrade/Containers/ArrayView.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once AbstractFont is <string>-free */
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/FileCallback.h"
#include "Magnum/Math/Vector2.h"
@ -223,7 +225,7 @@ void AbstractFontTest::openFileAsData() {
/* doOpenFile() should call doOpenData() */
CORRADE_VERIFY(!font.isOpened());
font.openFile(Utility::Directory::join(TEXT_TEST_DIR, "data.bin"), 13.0f);
font.openFile(Utility::Path::join(TEXT_TEST_DIR, "data.bin"), 13.0f);
CORRADE_VERIFY(font.isOpened());
CORRADE_COMPARE(font.size(), 13.0f);
CORRADE_COMPARE(font.ascent(), 1.0f);
@ -247,7 +249,10 @@ void AbstractFontTest::openFileAsDataNotFound() {
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!font.openFile("nonexistent.foo", 12.0f));
CORRADE_COMPARE(out.str(), "Text::AbstractFont::openFile(): cannot open file nonexistent.foo\n");
/* There's an error message from Path::read() before */
CORRADE_COMPARE_AS(out.str(),
"\nText::AbstractFont::openFile(): cannot open file nonexistent.foo\n",
TestSuite::Compare::StringHasSuffix);
}
void AbstractFontTest::openFileNotImplemented() {

10
src/MagnumPlugins/MagnumFont/MagnumFont.cpp

@ -28,8 +28,10 @@
#include <sstream>
#include <Corrade/Containers/ArrayView.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/Pair.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once AbstractFont is <string>-free */
#include <Corrade/Utility/Configuration.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include <Corrade/Utility/Unicode.h>
#include "Magnum/ImageView.h"
@ -48,7 +50,7 @@ struct MagnumFont::Data {
Utility::Configuration conf;
Containers::Optional<Trade::ImageData2D> image;
Containers::Optional<std::string> filePath;
Containers::Optional<Containers::String> filePath;
std::unordered_map<char32_t, UnsignedInt> glyphId;
std::vector<Vector2> glyphAdvance;
};
@ -108,7 +110,7 @@ auto MagnumFont::doOpenData(const Containers::ArrayView<const char> data, const
TgaImporter already, no need to repeat them again. */
Trade::TgaImporter importer;
importer.setFileCallback(fileCallback(), fileCallbackUserData());
if(!importer.openFile(Utility::Directory::join(_opened->filePath ? *_opened->filePath : "", conf.value("image")))) return {};
if(!importer.openFile(Utility::Path::join(_opened->filePath ? *_opened->filePath : "", conf.value("image")))) return {};
_opened->image = importer.image2D(0);
if(!_opened->image) return {};
@ -137,7 +139,7 @@ auto MagnumFont::doOpenData(const Containers::ArrayView<const char> data, const
auto MagnumFont::doOpenFile(const std::string& filename, Float size) -> Metrics {
_opened.emplace();
_opened->filePath = Utility::Directory::path(filename);
_opened->filePath.emplace(Utility::Path::split(filename).first());
return AbstractFont::doOpenFile(filename, size);
}

6
src/MagnumPlugins/MagnumFont/Test/MagnumFontGLTest.cpp

@ -24,7 +24,9 @@
*/
#include <sstream>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Containers/String.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once AbstractFont is <string>-free */
#include <Corrade/Utility/Path.h>
#include "Magnum/GL/OpenGLTester.h"
#include "Magnum/Text/AbstractFont.h"
@ -60,7 +62,7 @@ MagnumFontGLTest::MagnumFontGLTest() {
void MagnumFontGLTest::createGlyphCache() {
Containers::Pointer<AbstractFont> font = _fontManager.instantiate("MagnumFont");
CORRADE_VERIFY(font->openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f));
CORRADE_VERIFY(font->openFile(Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f));
/* Just testing that nothing crashes, asserts or errors */
Containers::Pointer<AbstractGlyphCache> cache = font->createGlyphCache();

26
src/MagnumPlugins/MagnumFont/Test/MagnumFontTest.cpp

@ -26,9 +26,11 @@
#include <sstream>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once AbstractFont is <string>-free */
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/String.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/FileCallback.h"
#include "Magnum/Text/AbstractFont.h"
@ -77,13 +79,16 @@ void MagnumFontTest::nonexistent() {
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!font->openFile("nonexistent.conf", 0.0f));
CORRADE_COMPARE(out.str(), "Text::AbstractFont::openFile(): cannot open file nonexistent.conf\n");
/* There's an error message from Path::read() before */
CORRADE_COMPARE_AS(out.str(),
"\nText::AbstractFont::openFile(): cannot open file nonexistent.conf\n",
TestSuite::Compare::StringHasSuffix);
}
void MagnumFontTest::properties() {
Containers::Pointer<AbstractFont> font = _fontManager.instantiate("MagnumFont");
CORRADE_VERIFY(font->openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f));
CORRADE_VERIFY(font->openFile(Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f));
CORRADE_COMPARE(font->size(), 16.0f);
CORRADE_COMPARE(font->ascent(), 25.0f);
CORRADE_COMPARE(font->descent(), -10.0f);
@ -94,7 +99,7 @@ void MagnumFontTest::properties() {
void MagnumFontTest::layout() {
Containers::Pointer<AbstractFont> font = _fontManager.instantiate("MagnumFont");
CORRADE_VERIFY(font->openFile(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f));
CORRADE_VERIFY(font->openFile(Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.conf"), 0.0f));
/* Fill the cache with some fake glyphs */
struct DummyGlyphCache: AbstractGlyphCache {
@ -145,8 +150,13 @@ void MagnumFontTest::fileCallbackImage() {
CORRADE_VERIFY(font->features() & FontFeature::FileCallback);
std::unordered_map<std::string, Containers::Array<char>> files;
files["not/a/path/font.conf"] = Utility::Directory::read(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"));
files["not/a/path/font.tga"] = Utility::Directory::read(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.tga"));
Containers::Optional<Containers::Array<char>> conf = Utility::Path::read(Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.conf"));
Containers::Optional<Containers::Array<char>> tga =
Utility::Path::read(Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.tga"));
CORRADE_VERIFY(conf);
CORRADE_VERIFY(tga);
files["not/a/path/font.conf"] = *std::move(conf);
files["not/a/path/font.tga"] = *std::move(tga);
font->setFileCallback([](const std::string& filename, InputFileCallbackPolicy policy,
std::unordered_map<std::string, Containers::Array<char>>& files) {
Debug{} << "Loading" << filename << "with" << policy;
@ -171,7 +181,9 @@ void MagnumFontTest::fileCallbackImageNotFound() {
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!font->openData(Utility::Directory::read(Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf")), 13.0f));
Containers::Optional<Containers::Array<char>> conf = Utility::Path::read(Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.conf"));
CORRADE_VERIFY(conf);
CORRADE_VERIFY(!font->openData(*conf, 13.0f));
CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::openFile(): cannot open file font.tga\n");
}

5
src/MagnumPlugins/MagnumFontConverter/MagnumFontConverter.cpp

@ -28,8 +28,9 @@
#include <algorithm> /* std::sort() */
#include <sstream>
#include <Corrade/Containers/Array.h>
#include <Corrade/Containers/Pair.h>
#include <Corrade/Utility/Configuration.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/Image.h"
#include "Magnum/ImageView.h"
@ -58,7 +59,7 @@ std::vector<std::pair<std::string, Containers::Array<char>>> MagnumFontConverter
Utility::Configuration configuration;
configuration.setValue("version", 1);
configuration.setValue("image", Utility::Directory::filename(filename) + ".tga");
configuration.setValue("image", Utility::Path::split(filename).second() + ".tga");
configuration.setValue("originalImageSize", cache.textureSize());
configuration.setValue("padding", cache.padding());
configuration.setValue("fontSize", font.size());

25
src/MagnumPlugins/MagnumFontConverter/Test/MagnumFontConverterTest.cpp

@ -25,10 +25,11 @@
#include <sstream>
#include <Corrade/Containers/Optional.h>
#include <Corrade/Containers/StringStl.h> /** @todo remove once AbstractFont is <string>-free */
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/TestSuite/Compare/File.h>
#include <Corrade/Utility/DebugStl.h>
#include <Corrade/Utility/Directory.h>
#include <Corrade/Utility/Path.h>
#include "Magnum/Image.h"
#include "Magnum/PixelFormat.h"
@ -72,17 +73,17 @@ MagnumFontConverterTest::MagnumFontConverterTest() {
#endif
/* Create the output directory if it doesn't exist yet */
CORRADE_INTERNAL_ASSERT_OUTPUT(Utility::Directory::mkpath(MAGNUMFONTCONVERTER_TEST_WRITE_DIR));
CORRADE_INTERNAL_ASSERT_OUTPUT(Utility::Path::make(MAGNUMFONTCONVERTER_TEST_WRITE_DIR));
}
void MagnumFontConverterTest::exportFont() {
std::string confFilename = Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font.conf");
std::string tgaFilename = Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font.tga");
Containers::String confFilename = Utility::Path::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font.conf");
Containers::String tgaFilename = Utility::Path::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font.tga");
/* Remove previously created files */
if(Utility::Directory::exists(confFilename))
CORRADE_VERIFY(Utility::Directory::rm(confFilename));
if(Utility::Directory::exists(tgaFilename))
CORRADE_VERIFY(Utility::Directory::rm(tgaFilename));
if(Utility::Path::exists(confFilename))
CORRADE_VERIFY(Utility::Path::remove(confFilename));
if(Utility::Path::exists(tgaFilename))
CORRADE_VERIFY(Utility::Path::remove(tgaFilename));
/* Fake font with fake cache */
class FakeFont: public Text::AbstractFont {
@ -137,12 +138,12 @@ void MagnumFontConverterTest::exportFont() {
/* Convert the file */
Containers::Pointer<AbstractFontConverter> converter = _fontConverterManager.instantiate("MagnumFontConverter");
CORRADE_VERIFY(converter->exportFontToFile(font, cache, Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font"), "Wave"));
CORRADE_VERIFY(converter->exportFontToFile(font, cache, Utility::Path::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font"), "Wave"));
/* Verify font parameters */
CORRADE_COMPARE_AS(confFilename,
Utility::Directory::join(MAGNUMFONT_TEST_DIR, "font.conf"),
TestSuite::Compare::File);
Utility::Path::join(MAGNUMFONT_TEST_DIR, "font.conf"),
TestSuite::Compare::File);
if(!(_importerManager.loadState("TgaImporter") & PluginManager::LoadState::Loaded))
CORRADE_SKIP("TgaImporter plugin not enabled, not testing glyph cache contents");
@ -182,7 +183,7 @@ void MagnumFontConverterTest::exportFontNoGlyphCacheImageDownload() {
std::ostringstream out;
Error redirectError{&out};
CORRADE_VERIFY(!converter->exportFontToFile(font, cache, Utility::Directory::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font"), "Wave"));
CORRADE_VERIFY(!converter->exportFontToFile(font, cache, Utility::Path::join(MAGNUMFONTCONVERTER_TEST_WRITE_DIR, "font"), "Wave"));
CORRADE_COMPARE(out.str(), "Text::MagnumFontConverter::exportFontToData(): passed glyph cache doesn't support image download\n");
}

Loading…
Cancel
Save