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