// 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); \\添加相关属性

NDK学习笔记(Add.cpp注释)(一)的更多相关文章

  1. NDK学习笔记(三):DynamicKnobs的机制

    最近的NDK开发涉及到了动态input及动态knobs的问题. 开发需求如下:建立一个节点,该节点能获取每一个input上游的inputframerange信息. 具体下来就是:需要Node的inpu ...

  2. NDK学习笔记(四):OutputContext机制

    首先NDK文档中的Op.h头文件中已经有了相关概念的解释,摘录翻译如下: /*! \fn const OutputContext& Op::outputContext() const; The ...

  3. NDK学习笔记-JNI多线程

    前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...

  4. NDK学习笔记-使用现有so动态库

    前面将的都是如何使用C/C++文件生成so动态库,那么在使用别人的so动态库的时候应该怎么做呢?这篇文章就是使用一个变声功能的动态库,完成对于以有so动态库的说明. 动态库来源 在互联网中,有着许许多 ...

  5. NDK学习笔记-增量更新

    虽然现在有插件化开发和热修复,但为何还需要增量更新?插件化开发和热修复依赖于宿主程序,增量更新适合更新宿主程序. 差分包生成的前提 差分包的生成依赖于BsDiff开源项目,而BsDiff又依赖于Bzi ...

  6. NDK学习笔记-NDK开发流程

    本文主要是说明一下在eclipse下如何对NDK进行配置 配置NDK 虽然现在基本上都使用Android Studio进行Android开发,但一些项目在eclipse中仍有运用,这里讲一讲eclip ...

  7. NDK学习笔记-C语言

    本文简要回顾了C语言的一些注意事项和理解细节,不再赘述C语言的所有语法 头文件 头文件作为引入文件,在编译的时候,加载到源代码,参与编译 在VS2013中可以看到,当引入头文件时候,只能看到函数的声明 ...

  8. Python爬虫初学者学习笔记(带注释)

    一,安装编程工具并进入编程界面 首先去https://www.continuum.io/downloads/网站下载Anaconda工具并安装;打开cmd,输入jupyter notebook并回车( ...

  9. NDK学习笔记(五)Reader机制

    针对每一种后缀名Nuke都提供了对应的模块.为了决定用哪个版本的reader或writer模块,Nuke会先解析文件后缀名再以此为依据调用相关模块. 以JPG为例: 该文件格式有两种后缀名:.jpg和 ...

随机推荐

  1. navicat下载安装和激活一分钟完成

    下载navicat安装包和注册机 下载地址:https://pan.baidu.com/s/1Nakfuv7Z__vLiY6sHNusNg      提取码:v4gz 安装navicat  软件 以管 ...

  2. html 调用ocx控件

    !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/x ...

  3. 【转载】 【caffe转向pytorch】caffe的BN层+scale层=pytorch的BN层

    原文地址: https://blog.csdn.net/u011668104/article/details/81532592 ------------------------------------ ...

  4. Python之路PythonThread,第一篇,进程1

    python3 进程1 多任务编程: 可以有效的利用计算机资源,同时执行多个任务, 进程:进程就是程序在计算机中一次执行的结果: 进程和程序的区别: 程序是一个静态文件的描述,不占用计算机的系统资源: ...

  5. 百练6376-二维数组右上左下遍历-2015正式C题

    C:二维数组右上左下遍历 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺 ...

  6. Web form ajax请求

    1.添加web应用程序 2.添加web窗体 web窗体Demo <%@ Page Language="C#" AutoEventWireup="true" ...

  7. soft-nms

    https://blog.csdn.net/app_12062011/article/details/77963494 ----> NMS-非极大值抑制进行后处理. 通常的做法是将检测框按得分排 ...

  8. 20155208徐子涵 2016-2017-2 《Java程序设计》第2周学习总结

    20155208徐子涵 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 第三章 基础语法 3.1 类型.变量与运算符 • 关键字:在定义java文件名的时候要 ...

  9. js 下载文件的操作方法

    https://blog.csdn.net/zhoumengshun/article/details/71405963

  10. java-方法重写的注意事项

    1.父类中私有方法不能被重写.因为父类的私有方法子类根本就无法继承. 2.子类重写父类方法时,访问权限不能更低.最好就一致. 3.父类静态方法,子类也必须通过静态方法进行重写.其实这个算不上方法重写, ...