博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

NDK学习笔记(Add.cpp注释)(一)

Posted on 2015-10-29 19:12  SolHe  阅读(362)  评论(0编辑  收藏  举报
// Add.C
// Copyright (c) 2009 The Foundry Visionmongers Ltd.  All Rights Reserved.

static const char* const HELP = "Adds a constant to a set of channels";

#include "DDImage/PixelIop.h"       \\导入像素处理器头文件,该头文件用于对像素进行操作
#include "DDImage/Row.h"             
#include "DDImage/Knobs.h"

using namespace DD::Image;

class Add : public PixelIop
{
  float value[4];               \\定义一个包含四个浮点类型变量的列表
public:                    \\定义公有函数
  void in_channels(int input, ChannelSet& mask) const;        \\定义一个无返回值无类型的in_channels成员函数,该成员函数类型是const
  Add(Node* node) : PixelIop(node)                \\该Add类继承PixelIop类
  {
    value[0] = value[1] = value[2] = value[3] = 0;              \\初始化value列表
  }
  bool pass_transform() const { return true; }          \\定义公有成员函数
  void pixel_engine(const Row &in, int y, int x, int r, ChannelMask, Row & out);   \\调用公有函数,该成员函数来自PixelIop类
  virtual void knobs(Knob_Callback);             \\定义成员函数,该成员函数继承自PixelIop类
  static const Iop::Description d;              \\定义一个静态函数d,该函数用于描述Add类的属性
  const char* Class() const { return d.name; }                  \\
  const char* node_help() const { return HELP; }              
  void _validate(bool);  
};

void Add::_validate(bool for_real)
{
  copy_info();
  for (unsigned i = 0; i < 4; i++) {
    if (value[i]) {
      set_out_channels(Mask_All);
      info_.black_outside(false);
      return;
    }
  }
  set_out_channels(Mask_None);
}

void Add::in_channels(int input, ChannelSet& mask) const
{
  // mask is unchanged
}

void Add::pixel_engine(const Row& in, int y, int x, int r,
                       ChannelMask channels, Row& out)          
{
  foreach (z, channels) {
    const float c = value[colourIndex(z)];
    const float* inptr = in[z] + x;
    const float* END = inptr + (r - x);
    float* outptr = out.writable(z) + x;
    while (inptr < END)
      *outptr++ = *inptr++ + c;
  }
}

void Add::knobs(Knob_Callback f)               \\定义一个无返回值的函数来添加colorknob
{
  AColor_knob(f, value, IRange(0, 4), "value");         \\添加一个颜色knob
}

#include "DDImage/NukeWrapper.h"

static Iop* build(Node* node) { return new NukeWrapper(new Add(node)); }               \\把Add类打包成节点
const Iop::Description Add::d("Add", "Color/Math/Add", build);                \\添加相关属性