dct_util.h (2563B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #ifndef LIB_JXL_DCT_UTIL_H_ 7 #define LIB_JXL_DCT_UTIL_H_ 8 9 #include <jxl/memory_manager.h> 10 11 #include <cstddef> 12 #include <cstdint> 13 #include <memory> 14 #include <type_traits> 15 16 #include "lib/jxl/base/common.h" 17 #include "lib/jxl/base/status.h" 18 #include "lib/jxl/image.h" 19 #include "lib/jxl/image_ops.h" 20 21 namespace jxl { 22 23 union ACPtr { 24 int32_t* ptr32; 25 int16_t* ptr16; 26 ACPtr() = default; 27 explicit ACPtr(int16_t* p) : ptr16(p) {} 28 explicit ACPtr(int32_t* p) : ptr32(p) {} 29 }; 30 31 union ConstACPtr { 32 const int32_t* ptr32; 33 const int16_t* ptr16; 34 ConstACPtr() = default; 35 explicit ConstACPtr(const int16_t* p) : ptr16(p) {} 36 explicit ConstACPtr(const int32_t* p) : ptr32(p) {} 37 }; 38 39 enum class ACType { k16 = 0, k32 = 1 }; 40 41 class ACImage { 42 public: 43 virtual ~ACImage() = default; 44 virtual ACType Type() const = 0; 45 virtual ACPtr PlaneRow(size_t c, size_t y, size_t xbase) = 0; 46 virtual ConstACPtr PlaneRow(size_t c, size_t y, size_t xbase) const = 0; 47 virtual size_t PixelsPerRow() const = 0; 48 virtual void ZeroFill() = 0; 49 virtual void ZeroFillPlane(size_t c) = 0; 50 virtual bool IsEmpty() const = 0; 51 }; 52 53 template <typename T> 54 class ACImageT final : public ACImage { 55 public: 56 ACImageT() = default; 57 58 static StatusOr<std::unique_ptr<ACImageT>> Make( 59 JxlMemoryManager* memory_manager, size_t xsize, size_t ysize) { 60 static_assert( 61 std::is_same<T, int16_t>::value || std::is_same<T, int32_t>::value, 62 "ACImage must be either 32- or 16- bit"); 63 std::unique_ptr<ACImageT> result = jxl::make_unique<ACImageT>(); 64 JXL_ASSIGN_OR_RETURN(result->img_, 65 Image3<T>::Create(memory_manager, xsize, ysize)); 66 return result; 67 } 68 69 ACType Type() const override { 70 return sizeof(T) == 2 ? ACType::k16 : ACType::k32; 71 } 72 ACPtr PlaneRow(size_t c, size_t y, size_t xbase) override { 73 return ACPtr(img_.PlaneRow(c, y) + xbase); 74 } 75 ConstACPtr PlaneRow(size_t c, size_t y, size_t xbase) const override { 76 return ConstACPtr(img_.PlaneRow(c, y) + xbase); 77 } 78 79 size_t PixelsPerRow() const override { return img_.PixelsPerRow(); } 80 81 void ZeroFill() override { ZeroFillImage(&img_); } 82 83 void ZeroFillPlane(size_t c) override { ZeroFillImage(&img_.Plane(c)); } 84 85 bool IsEmpty() const override { 86 return img_.xsize() == 0 || img_.ysize() == 0; 87 } 88 89 private: 90 Image3<T> img_; 91 }; 92 93 } // namespace jxl 94 95 #endif // LIB_JXL_DCT_UTIL_H_