Add bounding_box().
authorCarl Hetherington <cth@carlh.net>
Fri, 20 Jan 2023 22:53:45 +0000 (23:53 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 27 Feb 2023 13:47:25 +0000 (14:47 +0100)
src/lib/render_text.cc
src/lib/render_text.h

index 0b6a30e8008013b0d9b4f96365cc85e51a27202e..0e2b024d60732073a0511f6364739df2eefbf5c0 100644 (file)
@@ -427,6 +427,36 @@ render_text (list<StringText> subtitles, dcp::Size target, DCPTime time, int fra
 }
 
 
+list<dcpomatic::Rect<int>>
+bounding_box(list<StringText> subtitles, dcp::Size target)
+{
+       list<StringText> pending;
+       list<dcpomatic::Rect<int>> rects;
+
+       auto use_pending = [&pending, &rects, target]() {
+               /* We can provide dummy values for time and frame rate here as they are only used to calculate fades */
+               auto layout = setup_layout(pending, target, DCPTime(), 24);
+               int const x = x_position(pending.front(), target.width, layout.size.width);
+               int const y = y_position(pending.front(), target.height, layout.position.y, layout.size.height);
+               rects.push_back({Position<int>(x, y), layout.size.width, layout.size.height});
+       };
+
+       for (auto const& i: subtitles) {
+               if (!pending.empty() && (i.v_align() != pending.back().v_align() || fabs(i.v_position() - pending.back().v_position()) > 1e-4)) {
+                       use_pending();
+                       pending.clear();
+               }
+               pending.push_back(i);
+       }
+
+       if (!pending.empty()) {
+               use_pending();
+       }
+
+       return rects;
+}
+
+
 float
 FontMetrics::height(StringText const& subtitle)
 {
index 762d794466e9747984dbf3be5d6e11ea153c9b15..bceee964e53985dd0f21b6cfea8fb670b72a7dbd 100644 (file)
@@ -19,8 +19,9 @@
 */
 
 
-#include "position_image.h"
 #include "dcpomatic_time.h"
+#include "position_image.h"
+#include "rect.h"
 #include "string_text.h"
 #include <dcp/util.h>
 #include <memory>
@@ -33,6 +34,7 @@ namespace dcpomatic {
 
 std::string marked_up (std::list<StringText> subtitles, int target_height, float fade_factor, std::string font_name);
 std::list<PositionImage> render_text (std::list<StringText>, dcp::Size, dcpomatic::DCPTime, int);
+std::list<dcpomatic::Rect<int>> bounding_box(std::list<StringText> subtitles, dcp::Size target);
 
 
 class FontMetrics