Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
#ifndef ino_common_h
Toshihiro Shimizu 890ddd
#define ino_common_h
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "trasterfx.h"
Toshihiro Shimizu 890ddd
#include "stdfx.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace ino {
Toshihiro Shimizu 890ddd
/* 一時バッファとの変換機能 */
Shinya Kitaoka 120a6e
void ras_to_arr(const TRasterP in_ras, const int channels,
shun-iwasawa e00258
                unsigned char* out_arr);
shun-iwasawa 0e1837
void ras_to_float_arr(const TRasterP in_ras, const int channels,
shun-iwasawa 0e1837
                      float* out_arr);
shun-iwasawa e00258
void arr_to_ras(const unsigned char* in_arr, const int channels,
Shinya Kitaoka 120a6e
                TRasterP out_ras, const int margin);
shun-iwasawa 0e1837
void float_arr_to_ras(const unsigned char* in_arr, const int channels,
shun-iwasawa 0e1837
                      TRasterP out_ras, const int margin);
Shinya Kitaoka 120a6e
void ras_to_vec(const TRasterP ras, const int channels,
shun-iwasawa e00258
                std::vector<unsigned char="">& vec);</unsigned>
shun-iwasawa e00258
void vec_to_ras(std::vector<unsigned char="">& vec, const int channels,</unsigned>
Shinya Kitaoka 120a6e
                TRasterP ras, const int margin = 0);
shun-iwasawa 0e1837
void ras_to_ref_float_arr(const TRasterP in_ras, float* out_arr,
shun-iwasawa 0e1837
                          const int refer_mode);
shun-iwasawa 0e1837
Toshihiro Shimizu 890ddd
// void Lx_to_wrap( TRasterP ras );
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* logのserverアクセスON/OFF,install時設定をするための機能 */
Toshihiro Shimizu 890ddd
/* TEnv::getConfigDir() + "fx_ino_no_log.setup"
Shinya Kitaoka 120a6e
        が存在するとtrueを返す */
Toshihiro Shimizu 890ddd
bool log_enable_sw(void);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* toonz6.0.x専用の固定値を返すinline(埋め込み)関数 */
Shinya Kitaoka 120a6e
inline double param_range(void) { return 1.0; }  // 1 or 100%
Shinya Kitaoka 120a6e
inline int channels(void) { return 4; }          // RGBM is 4 channels
Shinya Kitaoka 120a6e
inline int bits(const TRasterP ras) {
Shinya Kitaoka 120a6e
  return ((TRaster64P)ras) ? (std::numeric_limits<unsigned short="">::digits)</unsigned>
shun-iwasawa 481b59
         : ((TRaster32P)ras)
shun-iwasawa 481b59
             ? (std::numeric_limits<unsigned char="">::digits)</unsigned>
shun-iwasawa 481b59
             : (std::numeric_limits<float>::digits);  // TRasterFP</float>
Toshihiro Shimizu 890ddd
}
Shinya Kitaoka 120a6e
inline int pixel_bits(const TRasterP ras) {
Shinya Kitaoka 120a6e
  return ino::channels() * ino::bits(ras);
Toshihiro Shimizu 890ddd
}
Shinya Kitaoka 120a6e
// inline double pixel_per_mm(void) { return 640. / 12. / 25.4; }
Toshihiro Shimizu 890ddd
inline double pixel_per_mm(void) { return 1.; }
Toshihiro Shimizu 890ddd
// inline double pixel_per_inch(void) { return 640. / 12.; }
shun-iwasawa e00258
}  // namespace ino
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class TBlendForeBackRasterFx : public TRasterFx {
shun-iwasawa 481b59
public:
shun-iwasawa 481b59
  enum ColorSpaceMode { Auto = 0, Linear, Nonlinear };
shun-iwasawa 481b59
shun-iwasawa e00258
protected:
shun-iwasawa e00258
  TRasterFxPort m_up;
shun-iwasawa e00258
  TRasterFxPort m_down;
shun-iwasawa e00258
  TDoubleParamP m_opacity;
shun-iwasawa e00258
  TBoolParamP m_clipping_mask;
shun-iwasawa e00258
shun-iwasawa e00258
  TBoolParamP m_linear;
shun-iwasawa 481b59
  TIntEnumParamP m_colorSpaceMode;
shun-iwasawa 481b59
shun-iwasawa e00258
  TDoubleParamP m_gamma;
shun-iwasawa 481b59
  TDoubleParamP m_gammaAdjust;
shun-iwasawa e00258
shun-iwasawa e00258
  // If the pixel is premultiplied, divide color data by the alpha before
shun-iwasawa e00258
  // converting from the colorspace, and then multiply by the alpha afterwards.
shun-iwasawa e00258
  // This will correct the color of the semi-transparent pixels in most cases.
shun-iwasawa e00258
  TBoolParamP m_premultiplied;
shun-iwasawa e00258
shun-iwasawa e00258
  TBoolParamP m_alpha_rendering;  // optional
shun-iwasawa e00258
shun-iwasawa e00258
  void dryComputeUpAndDown(TRectD& rect, double frame,
shun-iwasawa 26a3ce
                           const TRenderSettings& rs,
shun-iwasawa 26a3ce
                           bool upComputesWholeTile = false);
shun-iwasawa e00258
shun-iwasawa e00258
  void doComputeFx(TRasterP& dn_ras_out, const TRasterP& up_ras,
shun-iwasawa 26a3ce
                   const TPoint& pos, const double up_opacity,
shun-iwasawa 481b59
                   const double gammaDif, const double colorSpaceGamma,
shun-iwasawa 481b59
                   const bool linear_sw);
shun-iwasawa e00258
shun-iwasawa e00258
  template <class class="" q="" t,=""></class>
shun-iwasawa e00258
  void nonlinearTmpl(TRasterPT<t> dn_ras_out, const TRasterPT<t>& up_ras,</t></t>
shun-iwasawa 26a3ce
                     const double up_opacity);
shun-iwasawa e00258
shun-iwasawa e00258
  template <class class="" q="" t,=""></class>
shun-iwasawa e00258
  void linearTmpl(TRasterPT<t> dn_ras_out, const TRasterPT<t>& up_ras,</t></t>
shun-iwasawa 481b59
                  const double up_opacity, const double gammaDif);
shun-iwasawa 481b59
shun-iwasawa 481b59
  template <class class="" q="" t,=""></class>
shun-iwasawa 481b59
  void premultiToUnpremulti(TRasterPT<t> dn_ras, const TRasterPT<t>& up_ras,</t></t>
shun-iwasawa 481b59
                            const double colorSpaceGamma);
shun-iwasawa e00258
shun-iwasawa 26a3ce
  // when compute in xyz color space, do not clamp channel values in the kernel
shun-iwasawa e00258
  virtual void brendKernel(double& dnr, double& dng, double& dnb, double& dna,
shun-iwasawa 26a3ce
                           const double up_, double upg, double upb, double upa,
shun-iwasawa 26a3ce
                           const double upopacity,
shun-iwasawa 26a3ce
                           const bool alpha_rendering_sw = true,
shun-iwasawa 481b59
                           const bool do_clamp           = true) = 0;
shun-iwasawa e00258
shun-iwasawa e00258
  void computeUpAndDown(TTile& tile, double frame, const TRenderSettings& rs,
shun-iwasawa 26a3ce
                        TRasterP& dn_ras, TRasterP& up_ras,
shun-iwasawa 26a3ce
                        bool upComputesWholeTile = false);
shun-iwasawa e00258
Toshihiro Shimizu 890ddd
public:
shun-iwasawa e00258
  TBlendForeBackRasterFx(bool clipping_mask, bool has_alpha_option = false);
shun-iwasawa e00258
shun-iwasawa 481b59
  void onFxVersionSet() override;
shun-iwasawa 481b59
  void onObsoleteParamLoaded(const std::string&) override;
shun-iwasawa 481b59
shun-iwasawa e00258
  bool canHandle(const TRenderSettings& rs, double frame) override {
shun-iwasawa e00258
    return true;
shun-iwasawa e00258
  }
shun-iwasawa e00258
  bool doGetBBox(double frame, TRectD& bBox,
shun-iwasawa e00258
                 const TRenderSettings& rs) override;
shun-iwasawa e00258
  int getMemoryRequirement(const TRectD& rect, double frame,
shun-iwasawa e00258
                           const TRenderSettings& rs) override {
shun-iwasawa e00258
    return TRasterFx::memorySize(rect, rs.m_bpp);
shun-iwasawa e00258
  }
shun-iwasawa e00258
  void doDryCompute(TRectD& rect, double frame,
shun-iwasawa e00258
                    const TRenderSettings& rs) override {
shun-iwasawa e00258
    this->dryComputeUpAndDown(rect, frame, rs, false);
shun-iwasawa e00258
  }
shun-iwasawa e00258
shun-iwasawa e00258
  void doCompute(TTile& tile, double frame, const TRenderSettings& rs) override;
shun-iwasawa e00258
Shinya Kitaoka 120a6e
  /* FX nodeが無効のときの、表示port番号 */
Shinya Kitaoka 473e70
  int getPreferredInputPort() override { return 1; }
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
  bool toBeComputedInLinearColorSpace(bool settingsIsLinear,
shun-iwasawa 481b59
                                      bool tileIsLinear) const override;
shun-iwasawa 481b59
Shinya Kitaoka 473e70
  std::string getPluginId() const override { return PLUGIN_PREFIX; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
template <>
shun-iwasawa 481b59
void TBlendForeBackRasterFx::nonlinearTmpl<tpixelf, float="">(</tpixelf,>
shun-iwasawa 481b59
    TRasterFP dn_ras_out, const TRasterFP& up_ras, const double up_opacity);
shun-iwasawa 481b59
shun-iwasawa 481b59
template <>
shun-iwasawa 481b59
void TBlendForeBackRasterFx::linearTmpl<tpixelf, float="">(TRasterFP dn_ras_out,</tpixelf,>
shun-iwasawa 481b59
                                                        const TRasterFP& up_ras,
shun-iwasawa 481b59
                                                        const double up_opacity,
shun-iwasawa 481b59
                                                        const double gammaDif);
shun-iwasawa 481b59
shun-iwasawa 481b59
template <>
shun-iwasawa 481b59
void TBlendForeBackRasterFx::premultiToUnpremulti<tpixelf, float="">(</tpixelf,>
shun-iwasawa 481b59
    TRasterFP dn_ras, const TRasterFP& up_ras, const double colorSpaceGamma);
shun-iwasawa 481b59
Toshihiro Shimizu 890ddd
#endif /* !ino_common_h */