Simplify StaySequential operation (#4074)

This commit is contained in:
Kleis Auke Wolthuizen 2024-04-19 15:47:49 +02:00 committed by GitHub
parent 36e60bf040
commit aa8bc19362
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 21 deletions

View File

@ -1081,11 +1081,10 @@ namespace sharp {
/* /*
Ensure decoding remains sequential. Ensure decoding remains sequential.
*/ */
VImage StaySequential(VImage image, VipsAccess access, bool condition) { VImage StaySequential(VImage image, bool condition) {
static const char* meta = "sharp-copy-memory"; if (vips_image_is_sequential(image.get_image()) && condition) {
if (access == VIPS_ACCESS_SEQUENTIAL && condition && image.get_typeof(meta) != G_TYPE_INT) { image = image.copy_memory().copy();
image = image.copy_memory(); image.remove(VIPS_META_SEQUENTIAL);
image.set(meta, 1);
} }
return image; return image;
} }

View File

@ -386,7 +386,7 @@ namespace sharp {
/* /*
Ensure decoding remains sequential. Ensure decoding remains sequential.
*/ */
VImage StaySequential(VImage image, VipsAccess access, bool condition = TRUE); VImage StaySequential(VImage image, bool condition = TRUE);
} // namespace sharp } // namespace sharp

View File

@ -155,7 +155,7 @@ namespace sharp {
return image.conv(blur); return image.conv(blur);
} else { } else {
// Slower, accurate Gaussian blur // Slower, accurate Gaussian blur
return StaySequential(image, VIPS_ACCESS_SEQUENTIAL).gaussblur(sigma); return StaySequential(image).gaussblur(sigma);
} }
} }
@ -386,7 +386,7 @@ namespace sharp {
pages.reserve(nPages); pages.reserve(nPages);
// Split the image into cropped frames // Split the image into cropped frames
image = StaySequential(image, VIPS_ACCESS_SEQUENTIAL); image = StaySequential(image);
for (int i = 0; i < nPages; i++) { for (int i = 0; i < nPages; i++) {
pages.push_back( pages.push_back(
image.extract_area(left, *pageHeight * i + top, width, height)); image.extract_area(left, *pageHeight * i + top, width, height));

View File

@ -88,7 +88,7 @@ class PipelineWorker : public Napi::AsyncWorker {
baton->rotationAngle != 0.0); baton->rotationAngle != 0.0);
if (shouldRotateBefore) { if (shouldRotateBefore) {
image = sharp::StaySequential(image, access, image = sharp::StaySequential(image,
rotation != VIPS_ANGLE_D0 || rotation != VIPS_ANGLE_D0 ||
autoRotation != VIPS_ANGLE_D0 || autoRotation != VIPS_ANGLE_D0 ||
autoFlip || autoFlip ||
@ -134,7 +134,7 @@ class PipelineWorker : public Napi::AsyncWorker {
// Trim // Trim
if (baton->trimThreshold >= 0.0) { if (baton->trimThreshold >= 0.0) {
MultiPageUnsupported(nPages, "Trim"); MultiPageUnsupported(nPages, "Trim");
image = sharp::StaySequential(image, access); image = sharp::StaySequential(image);
image = sharp::Trim(image, baton->trimBackground, baton->trimThreshold, baton->trimLineArt); image = sharp::Trim(image, baton->trimBackground, baton->trimThreshold, baton->trimLineArt);
baton->trimOffsetLeft = image.xoffset(); baton->trimOffsetLeft = image.xoffset();
baton->trimOffsetTop = image.yoffset(); baton->trimOffsetTop = image.yoffset();
@ -397,7 +397,7 @@ class PipelineWorker : public Napi::AsyncWorker {
->set("kernel", baton->kernel)); ->set("kernel", baton->kernel));
} }
image = sharp::StaySequential(image, access, image = sharp::StaySequential(image,
autoRotation != VIPS_ANGLE_D0 || autoRotation != VIPS_ANGLE_D0 ||
baton->flip || baton->flip ||
autoFlip || autoFlip ||
@ -500,7 +500,7 @@ class PipelineWorker : public Napi::AsyncWorker {
// Attention-based or Entropy-based crop // Attention-based or Entropy-based crop
MultiPageUnsupported(nPages, "Resize strategy"); MultiPageUnsupported(nPages, "Resize strategy");
image = sharp::StaySequential(image, access); image = sharp::StaySequential(image);
image = image.smartcrop(baton->width, baton->height, VImage::option() image = image.smartcrop(baton->width, baton->height, VImage::option()
->set("interesting", baton->position == 16 ? VIPS_INTERESTING_ENTROPY : VIPS_INTERESTING_ATTENTION) ->set("interesting", baton->position == 16 ? VIPS_INTERESTING_ENTROPY : VIPS_INTERESTING_ATTENTION)
->set("premultiplied", shouldPremultiplyAlpha) ->set("premultiplied", shouldPremultiplyAlpha)
@ -519,7 +519,7 @@ class PipelineWorker : public Napi::AsyncWorker {
// Rotate post-extract non-90 angle // Rotate post-extract non-90 angle
if (!baton->rotateBeforePreExtract && baton->rotationAngle != 0.0) { if (!baton->rotateBeforePreExtract && baton->rotationAngle != 0.0) {
MultiPageUnsupported(nPages, "Rotate"); MultiPageUnsupported(nPages, "Rotate");
image = sharp::StaySequential(image, access); image = sharp::StaySequential(image);
std::vector<double> background; std::vector<double> background;
std::tie(image, background) = sharp::ApplyAlpha(image, baton->rotationBackground, shouldPremultiplyAlpha); std::tie(image, background) = sharp::ApplyAlpha(image, baton->rotationBackground, shouldPremultiplyAlpha);
image = image.rotate(baton->rotationAngle, VImage::option()->set("background", background)); image = image.rotate(baton->rotationAngle, VImage::option()->set("background", background));
@ -543,7 +543,7 @@ class PipelineWorker : public Napi::AsyncWorker {
// Affine transform // Affine transform
if (!baton->affineMatrix.empty()) { if (!baton->affineMatrix.empty()) {
MultiPageUnsupported(nPages, "Affine"); MultiPageUnsupported(nPages, "Affine");
image = sharp::StaySequential(image, access); image = sharp::StaySequential(image);
std::vector<double> background; std::vector<double> background;
std::tie(image, background) = sharp::ApplyAlpha(image, baton->affineBackground, shouldPremultiplyAlpha); std::tie(image, background) = sharp::ApplyAlpha(image, baton->affineBackground, shouldPremultiplyAlpha);
vips::VInterpolate interp = vips::VInterpolate::new_from_name( vips::VInterpolate interp = vips::VInterpolate::new_from_name(
@ -566,7 +566,7 @@ class PipelineWorker : public Napi::AsyncWorker {
std::vector<double> background; std::vector<double> background;
std::tie(image, background) = sharp::ApplyAlpha(image, baton->extendBackground, shouldPremultiplyAlpha); std::tie(image, background) = sharp::ApplyAlpha(image, baton->extendBackground, shouldPremultiplyAlpha);
image = sharp::StaySequential(image, baton->input->access, nPages > 1); image = sharp::StaySequential(image, nPages > 1);
image = nPages > 1 image = nPages > 1
? sharp::EmbedMultiPage(image, ? sharp::EmbedMultiPage(image,
baton->extendLeft, baton->extendTop, baton->width, baton->height, baton->extendLeft, baton->extendTop, baton->width, baton->height,
@ -575,7 +575,7 @@ class PipelineWorker : public Napi::AsyncWorker {
VImage::option()->set("extend", baton->extendWith)->set("background", background)); VImage::option()->set("extend", baton->extendWith)->set("background", background));
} else { } else {
std::vector<double> ignoredBackground(1); std::vector<double> ignoredBackground(1);
image = sharp::StaySequential(image, baton->input->access); image = sharp::StaySequential(image);
image = nPages > 1 image = nPages > 1
? sharp::EmbedMultiPage(image, ? sharp::EmbedMultiPage(image,
baton->extendLeft, baton->extendTop, baton->width, baton->height, baton->extendLeft, baton->extendTop, baton->width, baton->height,
@ -671,7 +671,7 @@ class PipelineWorker : public Napi::AsyncWorker {
if (across != 0 || down != 0) { if (across != 0 || down != 0) {
int left; int left;
int top; int top;
compositeImage = sharp::StaySequential(compositeImage, access).replicate(across, down); compositeImage = sharp::StaySequential(compositeImage).replicate(across, down);
if (composite->hasOffset) { if (composite->hasOffset) {
std::tie(left, top) = sharp::CalculateCrop( std::tie(left, top) = sharp::CalculateCrop(
compositeImage.width(), compositeImage.height(), image.width(), image.height(), compositeImage.width(), compositeImage.height(), image.width(), image.height(),
@ -729,13 +729,13 @@ class PipelineWorker : public Napi::AsyncWorker {
// Apply normalisation - stretch luminance to cover full dynamic range // Apply normalisation - stretch luminance to cover full dynamic range
if (baton->normalise) { if (baton->normalise) {
image = sharp::StaySequential(image, access); image = sharp::StaySequential(image);
image = sharp::Normalise(image, baton->normaliseLower, baton->normaliseUpper); image = sharp::Normalise(image, baton->normaliseLower, baton->normaliseUpper);
} }
// Apply contrast limiting adaptive histogram equalization (CLAHE) // Apply contrast limiting adaptive histogram equalization (CLAHE)
if (baton->claheWidth != 0 && baton->claheHeight != 0) { if (baton->claheWidth != 0 && baton->claheHeight != 0) {
image = sharp::StaySequential(image, access); image = sharp::StaySequential(image);
image = sharp::Clahe(image, baton->claheWidth, baton->claheHeight, baton->claheMaxSlope); image = sharp::Clahe(image, baton->claheWidth, baton->claheHeight, baton->claheMaxSlope);
} }
@ -1005,7 +1005,7 @@ class PipelineWorker : public Napi::AsyncWorker {
if (!sharp::HasAlpha(image)) { if (!sharp::HasAlpha(image)) {
baton->tileBackground.pop_back(); baton->tileBackground.pop_back();
} }
image = sharp::StaySequential(image, access, baton->tileAngle != 0); image = sharp::StaySequential(image, baton->tileAngle != 0);
vips::VOption *options = BuildOptionsDZ(baton); vips::VOption *options = BuildOptionsDZ(baton);
VipsArea *area = reinterpret_cast<VipsArea*>(image.dzsave_buffer(options)); VipsArea *area = reinterpret_cast<VipsArea*>(image.dzsave_buffer(options));
baton->bufferOut = static_cast<char*>(area->data); baton->bufferOut = static_cast<char*>(area->data);
@ -1207,7 +1207,7 @@ class PipelineWorker : public Napi::AsyncWorker {
if (!sharp::HasAlpha(image)) { if (!sharp::HasAlpha(image)) {
baton->tileBackground.pop_back(); baton->tileBackground.pop_back();
} }
image = sharp::StaySequential(image, access, baton->tileAngle != 0); image = sharp::StaySequential(image, baton->tileAngle != 0);
vips::VOption *options = BuildOptionsDZ(baton); vips::VOption *options = BuildOptionsDZ(baton);
image.dzsave(const_cast<char*>(baton->fileOut.data()), options); image.dzsave(const_cast<char*>(baton->fileOut.data()), options);
baton->formatOut = "dz"; baton->formatOut = "dz";