artisteacher fd1c1e
#pragma once
shun-iwasawa e2505a
shun-iwasawa e2505a
/*------------------------------------
shun-iwasawa e2505a
Iwa_BokehRefFx
shun-iwasawa e2505a
Apply an off-focus effect to a single source image.
shun-iwasawa e2505a
The amount of bokeh is specified by user input reference image,
shun-iwasawa e2505a
which represents the depth by brightness of pixels.
shun-iwasawa e2505a
It considers characteristics of films (which is known as Hurter–Driffield
shun-iwasawa e2505a
curves) or human eye's perception (which is known as Weber–Fechner law).
shun-iwasawa e2505a
For filtering process I used KissFFT, an FFT library by Mark Borgerding,
shun-iwasawa e2505a
distributed with a 3-clause BSD-style license.
shun-iwasawa e2505a
------------------------------------*/
shun-iwasawa e2505a
shun-iwasawa e2505a
#ifndef IWA_BOKEH_REF_H
shun-iwasawa e2505a
#define IWA_BOKEH_REF_H
shun-iwasawa e2505a
shun-iwasawa e2505a
#include "stdfx.h"
shun-iwasawa e2505a
#include "tfxparam.h"
shun-iwasawa e2505a
shun-iwasawa e2505a
#include <qvector></qvector>
shun-iwasawa e2505a
#include <qthread></qthread>
shun-iwasawa e2505a
shun-iwasawa e2505a
#include "tools/kiss_fftnd.h"
shun-iwasawa 1b1839
#include "iwa_bokeh_util.h"
shun-iwasawa e2505a
shun-iwasawa e2505a
//------------------------------------
shun-iwasawa e2505a
shun-iwasawa 1b1839
class Iwa_BokehRefFx : public Iwa_BokehCommonFx {
shun-iwasawa e2505a
  FX_PLUGIN_DECLARATION(Iwa_BokehRefFx)
shun-iwasawa e2505a
shun-iwasawa e2505a
protected:
shun-iwasawa e2505a
  TRasterFxPort m_source;  // source image
shun-iwasawa e2505a
  TRasterFxPort m_depth;   // depth reference image
shun-iwasawa e2505a
shun-iwasawa e2505a
  TIntParamP m_distancePrecision;  // Separation of depth image
shun-iwasawa e2505a
shun-iwasawa e2505a
  TBoolParamP m_fillGap;  // Toggles whether to extend pixels behind the front
shun-iwasawa e2505a
                          // layers in order to fill gap
shun-iwasawa e2505a
  // It should be ON for normal backgrounds and should be OFF for the layer
shun-iwasawa e2505a
  // which is
shun-iwasawa e2505a
  // "floating" from the lower layers such as dust, snowflake or spider-web.
shun-iwasawa e2505a
  TBoolParamP m_doMedian;  // (Effective only when the Fill Gap option is ON)
shun-iwasawa e2505a
  // Toggles whether to use Median Filter for extending the pixels.
shun-iwasawa e2505a
shun-iwasawa e2505a
  // normalize brightness of the depth reference image to unsigned char
shun-iwasawa e2505a
  // and store into dstMem
shun-iwasawa e2505a
  template <typename pixel="" raster,="" typename=""></typename>
shun-iwasawa e2505a
  void setDepthRaster(const RASTER srcRas, unsigned char* dstMem,
shun-iwasawa e2505a
                      TDimensionI dim);
shun-iwasawa e2505a
  template <typename pixel="" raster,="" typename=""></typename>
shun-iwasawa e2505a
  void setDepthRasterGray(const RASTER srcRas, unsigned char* dstMem,
shun-iwasawa e2505a
                          TDimensionI dim);
shun-iwasawa e2505a
shun-iwasawa e2505a
public:
shun-iwasawa e2505a
  Iwa_BokehRefFx();
shun-iwasawa e2505a
shun-iwasawa ce90c2
  void doCompute(TTile& tile, double frame,
shun-iwasawa ce90c2
                 const TRenderSettings& settings) override;
shun-iwasawa e2505a
};
shun-iwasawa e2505a
shun-iwasawa e2505a
#endif