libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

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_