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 "lib/jxl/base/compiler_specific.h" 12 #include "lib/jxl/base/data_parallel.h" 13 #include "lib/jxl/base/status.h" 14 #include "lib/jxl/common.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; ACPtr(int16_t * p)24 explicit ACPtr(int16_t* p) : ptr16(p) {} ACPtr(int32_t * 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; ConstACPtr(const int16_t * p)32 explicit ConstACPtr(const int16_t* p) : ptr16(p) {} ConstACPtr(const int32_t * 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; ACImageT(size_t xsize,size_t ysize)54 ACImageT(size_t xsize, size_t ysize) { 55 static_assert( 56 std::is_same<T, int16_t>::value || std::is_same<T, int32_t>::value, 57 "ACImage must be either 32- or 16- bit"); 58 img_ = Image3<T>(xsize, ysize); 59 } Type()60 ACType Type() const override { 61 return sizeof(T) == 2 ? ACType::k16 : ACType::k32; 62 } PlaneRow(size_t c,size_t y,size_t xbase)63 ACPtr PlaneRow(size_t c, size_t y, size_t xbase) override { 64 return ACPtr(img_.PlaneRow(c, y) + xbase); 65 } PlaneRow(size_t c,size_t y,size_t xbase)66 ConstACPtr PlaneRow(size_t c, size_t y, size_t xbase) const override { 67 return ConstACPtr(img_.PlaneRow(c, y) + xbase); 68 } 69 PixelsPerRow()70 size_t PixelsPerRow() const override { return img_.PixelsPerRow(); } 71 ZeroFill()72 void ZeroFill() override { ZeroFillImage(&img_); } 73 ZeroFillPlane(size_t c)74 void ZeroFillPlane(size_t c) override { ZeroFillImage(&img_.Plane(c)); } 75 IsEmpty()76 bool IsEmpty() const override { 77 return img_.xsize() == 0 || img_.ysize() == 0; 78 } 79 80 private: 81 Image3<T> img_; 82 }; 83 84 } // namespace jxl 85 86 #endif // LIB_JXL_DCT_UTIL_H_ 87