dct_util.h (2408B)
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 <stddef.h> 10 11 #include <memory> 12 13 #include "lib/jxl/base/common.h" 14 #include "lib/jxl/base/status.h" 15 #include "lib/jxl/image.h" 16 #include "lib/jxl/image_ops.h" 17 18 namespace jxl { 19 20 union ACPtr { 21 int32_t* ptr32; 22 int16_t* ptr16; 23 ACPtr() = default; 24 explicit ACPtr(int16_t* p) : ptr16(p) {} 25 explicit ACPtr(int32_t* p) : ptr32(p) {} 26 }; 27 28 union ConstACPtr { 29 const int32_t* ptr32; 30 const int16_t* ptr16; 31 ConstACPtr() = default; 32 explicit ConstACPtr(const int16_t* p) : ptr16(p) {} 33 explicit ConstACPtr(const int32_t* p) : ptr32(p) {} 34 }; 35 36 enum class ACType { k16 = 0, k32 = 1 }; 37 38 class ACImage { 39 public: 40 virtual ~ACImage() = default; 41 virtual ACType Type() const = 0; 42 virtual ACPtr PlaneRow(size_t c, size_t y, size_t xbase) = 0; 43 virtual ConstACPtr PlaneRow(size_t c, size_t y, size_t xbase) const = 0; 44 virtual size_t PixelsPerRow() const = 0; 45 virtual void ZeroFill() = 0; 46 virtual void ZeroFillPlane(size_t c) = 0; 47 virtual bool IsEmpty() const = 0; 48 }; 49 50 template <typename T> 51 class ACImageT final : public ACImage { 52 public: 53 ACImageT() = default; 54 55 static StatusOr<std::unique_ptr<ACImageT>> Make(size_t xsize, size_t ysize) { 56 static_assert( 57 std::is_same<T, int16_t>::value || std::is_same<T, int32_t>::value, 58 "ACImage must be either 32- or 16- bit"); 59 std::unique_ptr<ACImageT> result = jxl::make_unique<ACImageT>(); 60 JXL_ASSIGN_OR_RETURN(result->img_, Image3<T>::Create(xsize, ysize)); 61 return result; 62 } 63 64 ACType Type() const override { 65 return sizeof(T) == 2 ? ACType::k16 : ACType::k32; 66 } 67 ACPtr PlaneRow(size_t c, size_t y, size_t xbase) override { 68 return ACPtr(img_.PlaneRow(c, y) + xbase); 69 } 70 ConstACPtr PlaneRow(size_t c, size_t y, size_t xbase) const override { 71 return ConstACPtr(img_.PlaneRow(c, y) + xbase); 72 } 73 74 size_t PixelsPerRow() const override { return img_.PixelsPerRow(); } 75 76 void ZeroFill() override { ZeroFillImage(&img_); } 77 78 void ZeroFillPlane(size_t c) override { ZeroFillImage(&img_.Plane(c)); } 79 80 bool IsEmpty() const override { 81 return img_.xsize() == 0 || img_.ysize() == 0; 82 } 83 84 private: 85 Image3<T> img_; 86 }; 87 88 } // namespace jxl 89 90 #endif // LIB_JXL_DCT_UTIL_H_