summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2024-12-06 18:35:14 +0100
committerCarl Hetherington <cth@carlh.net>2024-12-26 17:20:25 +0100
commit5d9c3bcd4b3c84ba0621281728a4b39f1108c63d (patch)
tree408f186ec4683a30ecd9f191531bd03b81cd0b86
parent61a85a446cdc8c9010af2f16ccfe96380d186930 (diff)
Add guess_crop_by_alpha().
-rw-r--r--src/lib/guess_crop.cc26
-rw-r--r--src/lib/guess_crop.h1
2 files changed, 27 insertions, 0 deletions
diff --git a/src/lib/guess_crop.cc b/src/lib/guess_crop.cc
index d82db1824..7089d245d 100644
--- a/src/lib/guess_crop.cc
+++ b/src/lib/guess_crop.cc
@@ -149,3 +149,29 @@ guess_crop_by_brightness(shared_ptr<const Film> film, shared_ptr<const Content>
return crop;
}
+
+Crop
+guess_crop_by_alpha(shared_ptr<const Image> image)
+{
+ std::function<bool (int, int, int, bool)> image_in_line = [image](int start_x, int start_y, int pixels, bool rows) {
+ switch (image->pixel_format()) {
+ case AV_PIX_FMT_RGBA:
+ {
+ int const increment = rows ? 3 : image->stride()[0];
+ uint8_t const* data = image->data()[0] + start_x * std::lround(image->bytes_per_pixel(0)) + start_y * image->stride()[0];
+ for (int p = 0; p < pixels; ++p) {
+ if (data[3]) {
+ return true;
+ }
+ data += increment;
+ }
+ return false;
+ }
+ default:
+ throw PixelFormatError("guess_crop_by_alpha()", image->pixel_format());
+ }
+ };
+
+ return guess_crop(image, image_in_line);
+}
+
diff --git a/src/lib/guess_crop.h b/src/lib/guess_crop.h
index 9585ed92a..7c500faf0 100644
--- a/src/lib/guess_crop.h
+++ b/src/lib/guess_crop.h
@@ -31,4 +31,5 @@ class Image;
Crop guess_crop_by_brightness(std::shared_ptr<const Image> image, double threshold);
Crop guess_crop_by_brightness(std::shared_ptr<const Film> fillm, std::shared_ptr<const Content> content, double threshold, dcpomatic::ContentTime position);
+Crop guess_crop_by_alpha(std::shared_ptr<const Image> image);