Fix rendering of italic fonts during tests on Windows.
[dcpomatic.git] / src / lib / util.cc
index 6ed66c40f27d14f3cc0dfd6c556b4a6f3c5b0d60..13a062bc63e5d8c35bf16efbede63abacb7ea648 100644 (file)
 #include "ratio.h"
 #include "rect.h"
 #include "render_text.h"
+#include "scope_guard.h"
 #include "string_text.h"
 #include "text_decoder.h"
 #include "util.h"
 #include "video_content.h"
 #include <dcp/atmos_asset.h>
 #include <dcp/decrypted_kdm.h>
+#include <dcp/file.h>
 #include <dcp/locale_convert.h>
 #include <dcp/picture_asset.h>
 #include <dcp/raw_convert.h>
@@ -73,6 +75,7 @@ LIBDCP_ENABLE_WARNINGS
 #include <unicode/utypes.h>
 #include <unicode/unistr.h>
 #include <unicode/translit.h>
+#include <unicode/brkiter.h>
 #include <boost/algorithm/string.hpp>
 #include <boost/range/algorithm/replace_if.hpp>
 #include <boost/thread.hpp>
@@ -405,7 +408,6 @@ ffmpeg_log_callback(void* ptr, int level, const char* fmt, va_list vl)
 }
 
 
-static
 void
 capture_ffmpeg_logs()
 {
@@ -446,7 +448,13 @@ LIBDCP_ENABLE_WARNINGS
 
 #ifdef DCPOMATIC_WINDOWS
        putenv ("PANGOCAIRO_BACKEND=fontconfig");
-       putenv (String::compose("FONTCONFIG_PATH=%1", resources_path().string()).c_str());
+       if (boost::filesystem::exists(resources_path() / "fonts.conf")) {
+               /* The actual application after installation */
+               putenv(String::compose("FONTCONFIG_PATH=%1", resources_path().string()).c_str());
+       } else {
+               /* The place where fonts.conf is during tests */
+               putenv("FONTCONFIG_PATH=build\\fonts");
+       }
 #endif
 
 #ifdef DCPOMATIC_OSX
@@ -459,12 +467,12 @@ LIBDCP_ENABLE_WARNINGS
 
 #if defined(DCPOMATIC_WINDOWS) || defined(DCPOMATIC_OSX)
        /* Render something to fontconfig to create its cache */
-       list<StringText> subs;
+       vector<StringText> subs;
        dcp::SubtitleString ss(
                optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, 0, dcp::Direction::LTR,
                "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time(), 0
                );
-       subs.push_back(StringText(ss, 0, {}, dcp::SubtitleStandard::SMPTE_2014));
+       subs.push_back(StringText(ss, 0, make_shared<dcpomatic::Font>("foo"), dcp::SubtitleStandard::SMPTE_2014));
        render_text (subs, dcp::Size(640, 480), DCPTime(), 24);
 #endif
 
@@ -1079,3 +1087,38 @@ contains_assetmap(boost::filesystem::path dir)
        return boost::filesystem::is_regular_file(dir / "ASSETMAP") || boost::filesystem::is_regular_file(dir / "ASSETMAP.xml");
 }
 
+
+string
+word_wrap(string input, int columns)
+{
+       icu::Locale locale;
+       UErrorCode status = U_ZERO_ERROR;
+       auto iter = icu::BreakIterator::createLineInstance(locale, status);
+       ScopeGuard sg = [iter]() { delete iter; };
+       if (U_FAILURE(status)) {
+               return input;
+       }
+
+       auto input_icu = icu::UnicodeString::fromUTF8(icu::StringPiece(input));
+       iter->setText(input_icu);
+
+       int position = 0;
+       string output;
+       while (position < input_icu.length()) {
+               int end_of_line = iter->preceding(position + columns + 1);
+               icu::UnicodeString line;
+               if (end_of_line <= position) {
+                       /* There's no good line-break position; just break in the middle of a word */
+                       line = input_icu.tempSubString(position, columns);
+                       position += columns;
+               } else {
+                       line = input_icu.tempSubString(position, end_of_line - position);
+                       position = end_of_line;
+               }
+               line.toUTF8String(output);
+               output += "\n";
+       }
+
+       return output;
+}
+