| // Copyright 2026 The PDFium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "testing/png_codec/png_codec.h" | |
| #include <stdint.h> | |
| #include <vector> | |
| #include "core/fxcrt/numerics/safe_conversions.h" | |
| #include "core/fxcrt/span.h" | |
| #include "core/fxcrt/span_util.h" | |
| #include "testing/png_codec/png_codec_rust_ffi.rs.h" | |
| namespace png_codec { | |
| std::vector<uint8_t> Decode(pdfium::span<const uint8_t> input, | |
| bool reverse_byte_order, | |
| int* width, | |
| int* height) { | |
| rust::Slice<const uint8_t> src_slice(input); | |
| int32_t w = 0; | |
| int32_t h = 0; | |
| rust::Vec<uint8_t> decoded = | |
| rust_png::decode_png(src_slice, reverse_byte_order, w, h); | |
| if (w <= 0 || h <= 0 || decoded.empty()) { | |
| return {}; | |
| } | |
| *width = w; | |
| *height = h; | |
| return {decoded.begin(), decoded.end()}; | |
| } | |
| std::vector<uint8_t> EncodeBGR(pdfium::span<const uint8_t> input, | |
| int width, | |
| int height, | |
| int row_byte_width) { | |
| rust::Slice<const uint8_t> src_slice(input); | |
| rust::Vec<uint8_t> encoded = rust_png::encode_bgr( | |
| src_slice, width, height, pdfium::checked_cast<size_t>(row_byte_width)); | |
| if (encoded.empty()) { | |
| return {}; | |
| } | |
| return {encoded.begin(), encoded.end()}; | |
| } | |
| std::vector<uint8_t> EncodeRGBA(pdfium::span<const uint8_t> input, | |
| int width, | |
| int height, | |
| int row_byte_width) { | |
| rust::Slice<const uint8_t> src_slice(input); | |
| rust::Vec<uint8_t> encoded = rust_png::encode_rgba( | |
| src_slice, width, height, pdfium::checked_cast<size_t>(row_byte_width)); | |
| if (encoded.empty()) { | |
| return {}; | |
| } | |
| return {encoded.begin(), encoded.end()}; | |
| } | |
| std::vector<uint8_t> EncodeBGRA(pdfium::span<const uint8_t> input, | |
| int width, | |
| int height, | |
| int row_byte_width, | |
| bool discard_transparency) { | |
| rust::Slice<const uint8_t> src_slice(input); | |
| rust::Vec<uint8_t> encoded = rust_png::encode_bgra( | |
| src_slice, width, height, pdfium::checked_cast<size_t>(row_byte_width), | |
| discard_transparency); | |
| if (encoded.empty()) { | |
| return {}; | |
| } | |
| return {encoded.begin(), encoded.end()}; | |
| } | |
| std::vector<uint8_t> EncodeGray(pdfium::span<const uint8_t> input, | |
| int width, | |
| int height, | |
| int row_byte_width) { | |
| rust::Slice<const uint8_t> src_slice(input); | |
| rust::Vec<uint8_t> encoded = rust_png::encode_gray( | |
| src_slice, width, height, pdfium::checked_cast<size_t>(row_byte_width)); | |
| if (encoded.empty()) { | |
| return {}; | |
| } | |
| return {encoded.begin(), encoded.end()}; | |
| } | |
| } // namespace png_codec |