in cpp/spectrum/core/proc/RotationScanlineProcessingBlock.cpp [29:109]
std::unique_ptr<image::Scanline> RotationScanlineProcessingBlock::produce() {
if ((orientation == image::Orientation::UpMirrored &&
static_cast<std::size_t>(outputScanline) >= input.size()) ||
static_cast<std::size_t>(inputSize.height) > input.size()) {
return nullptr;
}
SPECTRUM_ENFORCE_IF_NOT(outputScanline < outputSize.height);
auto result =
std::make_unique<image::Scanline>(_pixelSpecification, outputSize.width);
switch (orientation) {
case image::Orientation::Up:
SPECTRUM_ENFORCE_IF_NOT(false);
break;
case image::Orientation::UpMirrored:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(
input[outputScanline], inputSize.width - idx - 1, result, idx);
}
break;
case image::Orientation::Right:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(
input[inputSize.height - idx - 1], outputScanline, result, idx);
}
break;
case image::Orientation::RightMirrored:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(
input[inputSize.height - idx - 1],
inputSize.width - outputScanline - 1,
result,
idx);
}
break;
case image::Orientation::Bottom:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(
input[inputSize.height - outputScanline - 1],
inputSize.width - idx - 1,
result,
idx);
}
break;
case image::Orientation::BottomMirrored:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(
input[inputSize.height - outputScanline - 1], idx, result, idx);
}
break;
case image::Orientation::Left:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(
input[idx], inputSize.width - outputScanline - 1, result, idx);
}
break;
case image::Orientation::LeftMirrored:
for (int idx = 0; idx < outputSize.width; idx++) {
copyPixelFromTo(input[idx], outputScanline, result, idx);
}
break;
}
outputScanline++;
if (outputScanline == outputSize.height) {
// optimization: if the last output line has been read, it is safe to
// forget the input scanlines
input.clear();
}
return result;
}