Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tstream.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "tflash.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzBase includes
Toshihiro Shimizu 890ddd
#include "tdoubleparam.h"
Toshihiro Shimizu 890ddd
#include "tnotanimatableparam.h"
Toshihiro Shimizu 890ddd
#include "tfxparam.h"
Toshihiro Shimizu 890ddd
#include "trasterfx.h"
Toshihiro Shimizu 890ddd
#include "tbasefx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    Local namespace
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
void makeRectCoherent(TRectD &rect, const TPointD &pos)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	rect -= pos;
Toshihiro Shimizu 890ddd
	rect.x0 = tfloor(rect.x0);
Toshihiro Shimizu 890ddd
	rect.y0 = tfloor(rect.y0);
Toshihiro Shimizu 890ddd
	rect.x1 = tceil(rect.x1);
Toshihiro Shimizu 890ddd
	rect.y1 = tceil(rect.y1);
Toshihiro Shimizu 890ddd
	rect += pos;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    TImageCombinationFx  declaration
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TImageCombinationFx : public TBaseRasterFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFxPortDG m_group;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TImageCombinationFx();
Toshihiro Shimizu 890ddd
	virtual ~TImageCombinationFx() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// Virtual interface for heirs
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! The raster processing function that must be reimplemented to perform the fx
Toshihiro Shimizu 890ddd
	virtual void process(const TRasterP &up, const TRasterP &down, double frame) = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//! Whether the 'up' rasters of process() invocations must be allocated to
Toshihiro Shimizu 890ddd
	//! entirely cover the 'down' counterpart. Should be enabled if the process()
Toshihiro Shimizu 890ddd
	//! function affects 'down' pixels when the 'up's are fully transparent.
Toshihiro Shimizu 890ddd
	virtual bool requiresFullRect() { return false; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// Low-level TRasterFx-related functions
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int dynamicPortGroupsCount() const { return 1; }
Toshihiro Shimizu 890ddd
	const TFxPortDG *dynamicPortGroup(int g) const { return (g == 0) ? &m_group : 0; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canHandle(const TRenderSettings &info, double frame) { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getMemoryRequirement(const TRectD &rect, double frame, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		// At max the memory of another tile with the same infos may be allocated apart from
Toshihiro Shimizu 890ddd
		// the externally supplied one.
Toshihiro Shimizu 890ddd
		return TRasterFx::memorySize(rect, info.m_bpp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doDryCompute(TRectD &rect, double frame, const TRenderSettings &info);
Toshihiro Shimizu 890ddd
	void doCompute(TTile &tile, double frame, const TRenderSettings &info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void compatibilityTranslatePort(int majorVersion, int minorVersion, std::string &portName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getPreferredInputPort() { return 1; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    TImageCombinationFx  implementation
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TImageCombinationFx::TImageCombinationFx()
Toshihiro Shimizu 890ddd
	: m_group("Source", 2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	addInputPort("Source1", new TRasterFxPort, 0);
Toshihiro Shimizu 890ddd
	addInputPort("Source2", new TRasterFxPort, 0);
Toshihiro Shimizu 890ddd
	setName(L"ImageCombinationFx");
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool TImageCombinationFx::doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bBox = TRectD();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int p, pCount = getInputPortCount();
Toshihiro Shimizu 890ddd
	for (p = 0; p != pCount; ++p) {
Toshihiro Shimizu 890ddd
		TRasterFxPort *port = static_cast<trasterfxport *="">(getInputPort(p));</trasterfxport>
Toshihiro Shimizu 890ddd
		TRectD inputBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		bool hasInput = (port && port->isConnected()) ? (*port)->doGetBBox(frame, inputBBox, info) : false;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (hasInput)
Toshihiro Shimizu 890ddd
			bBox += inputBBox;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return (bBox.getLx() >= 0) && (bBox.getLy() >= 0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//---------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageCombinationFx::doCompute(TTile &tile, double frame, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int p, pCount = getInputPortCount();
Toshihiro Shimizu 890ddd
	TRasterFxPort *port = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Skip empty ports
Toshihiro Shimizu 890ddd
	for (p = pCount - 1; p >= 0; --p) // Reverse iteration - bottom ports have high indices
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		port = static_cast<trasterfxport *="">(getInputPort(p));</trasterfxport>
Toshihiro Shimizu 890ddd
		if (port && port->getFx())
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// If there is no input, clear and return
Toshihiro Shimizu 890ddd
	if (p < 0) {
Toshihiro Shimizu 890ddd
		tile.getRaster()->clear(); // Probably not necessary unless externally invocation
Toshihiro Shimizu 890ddd
		return;					   // deliberately soiled tile - however, should be rare anyway.
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Calculate the tiles' geometries
Toshihiro Shimizu 890ddd
	const TRect &tileRect(tile.getRaster()->getBounds());
Toshihiro Shimizu 890ddd
	const TDimension &tileSize(tileRect.getSize());
Toshihiro Shimizu 890ddd
	TRectD tileRectD(tile.m_pos, TDimensionD(tileSize.lx, tileSize.ly));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Render the first viable port directly on tile
Toshihiro Shimizu 890ddd
	(*port)->compute(tile, frame, info); // Should we do it only if the bbox is not empty?
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Then, render each subsequent port and process() it on top of tile
Toshihiro Shimizu 890ddd
	bool canRestrict = !requiresFullRect();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (--p; p >= 0; --p) {
Toshihiro Shimizu 890ddd
		port = static_cast<trasterfxport *="">(getInputPort(p));</trasterfxport>
Toshihiro Shimizu 890ddd
		if (!(port && port->getFx())) // Skip empty ports
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Will allocate a new tile to calculate the input contribution - so, if possible
Toshihiro Shimizu 890ddd
		// we'll restrict allocation to the input port's bbox
Toshihiro Shimizu 890ddd
		TRectD computeRect(tileRectD);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (canRestrict) {
Toshihiro Shimizu 890ddd
			TRectD inBBox;
Toshihiro Shimizu 890ddd
			(*port)->getBBox(frame, inBBox, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			computeRect *= inBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			makeRectCoherent(computeRect, tile.m_pos); // Make it coherent with tile's pixel geometry
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Calculate the input port and perform processing
Toshihiro Shimizu 890ddd
		TDimension computeSize(tround(computeRect.getLx()), tround(computeRect.getLy()));
Toshihiro Shimizu 890ddd
		if ((computeSize.lx > 0) && (computeSize.ly > 0)) {
Toshihiro Shimizu 890ddd
			TTile inTile; // Observe its locality - not incidental
Toshihiro Shimizu 890ddd
			(*port)->allocateAndCompute(inTile, computeRect.getP00(), computeSize,
Toshihiro Shimizu 890ddd
										tile.getRaster(), frame, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			// Invoke process() to deal with the actual fx processing
Toshihiro Shimizu 890ddd
			TRasterP up(inTile.getRaster()), down(tile.getRaster());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (canRestrict) {
Toshihiro Shimizu 890ddd
				// Extract from tile the part corresponding to inTile
Toshihiro Shimizu 890ddd
				TRect downRect(convert(computeRect.getP00() - tile.m_pos), computeSize);
Toshihiro Shimizu 890ddd
				down = down->extract(downRect);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			assert(up->getSize() == down->getSize());
Toshihiro Shimizu 890ddd
			process(up, down, frame); // This is the point with the max concentration
Toshihiro Shimizu 890ddd
									  // of allocated resources
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageCombinationFx::doDryCompute(
Toshihiro Shimizu 890ddd
	TRectD &rect, double frame, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// Mere copy of doCompute(), stripped of the actual computations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int p, pCount = getInputPortCount();
Toshihiro Shimizu 890ddd
	TRasterFxPort *port = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (p = pCount - 1; p >= 0; --p) {
Toshihiro Shimizu 890ddd
		port = static_cast<trasterfxport *="">(getInputPort(p));</trasterfxport>
Toshihiro Shimizu 890ddd
		if (port && port->getFx())
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (p < 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	(*port)->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canRestrict = !requiresFullRect();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	for (--p; p >= 0; --p) {
Toshihiro Shimizu 890ddd
		port = static_cast<trasterfxport *="">(getInputPort(p));</trasterfxport>
Toshihiro Shimizu 890ddd
		if (!(port && port->getFx()))
Toshihiro Shimizu 890ddd
			continue;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRectD computeRect(rect);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (canRestrict) {
Toshihiro Shimizu 890ddd
			TRectD inBBox;
Toshihiro Shimizu 890ddd
			(*port)->getBBox(frame, inBBox, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			computeRect *= inBBox;
Toshihiro Shimizu 890ddd
			makeRectCoherent(computeRect, rect.getP00());
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TDimension computeSize(tround(computeRect.getLx()), tround(computeRect.getLy()));
Toshihiro Shimizu 890ddd
		if ((computeSize.lx > 0) && (computeSize.ly > 0))
Toshihiro Shimizu 890ddd
			(*port)->dryCompute(computeRect, frame, info);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void TImageCombinationFx::compatibilityTranslatePort(int major, int minor, std::string &portName)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (VersionNumber(major, minor) < VersionNumber(1, 20)) {
Toshihiro Shimizu 890ddd
		if (portName == "Up")
Toshihiro Shimizu 890ddd
			portName = "Source1";
Toshihiro Shimizu 890ddd
		else if (portName == "Down")
Toshihiro Shimizu 890ddd
			portName = "Source2";
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    TImageCombinationFx  heir classes
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class OverFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FX_DECLARATION(OverFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	OverFx()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setName(L"OverFx");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::over(down, up);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class AddFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(AddFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleParamP m_value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	AddFx() : m_value(100.0)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bindParam(this, "value", m_value);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		double value = m_value->getValue(frame) / 100.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (value != 1.0)
Toshihiro Shimizu 890ddd
			TRop::add(up, down, down, value);
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			TRop::add(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ColorDodgeFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(AddFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::colordodge(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ColorBurnFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(AddFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::colorburn(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class ScreenFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(AddFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	bool requiresFullRect() { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::screen(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class SubFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(SubFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TBoolParamP m_matte;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	SubFx() : m_matte(false)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bindParam(this, "matte", m_matte);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::sub(up, down, down, m_matte->getValue());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MultFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(MultFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleParamP m_value;
Toshihiro Shimizu 890ddd
	TBoolParamP m_matte;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MultFx() : m_value(0.0), m_matte(false)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bindParam(this, "value", m_value);
Toshihiro Shimizu 890ddd
		bindParam(this, "matte", m_matte);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool requiresFullRect() { return m_matte->getValue(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::mult(up, down, down, m_value->getValue(frame), m_matte->getValue());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MinFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(MinFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TBoolParamP m_matte;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MinFx() : m_matte(true)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bindParam(this, "matte", m_matte);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool requiresFullRect() { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::ropmin(up, down, down, m_matte->getValue());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MaxFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(MaxFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::ropmax(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class LinearBurnFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(LinearBurnFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::linearburn(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//This Fx is probably unused...!
Toshihiro Shimizu 890ddd
class OverlayFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(OverlayFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	OverlayFx() {}
Toshihiro Shimizu 890ddd
	~OverlayFx() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRop::overlay(up, down, down);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class BlendFx : public TImageCombinationFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(BlendFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDoubleParamP m_value;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	BlendFx() : m_value(0.0)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bindParam(this, "value", m_value);
Toshihiro Shimizu 890ddd
		m_value->setValueRange(0.0, 100.0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool requiresFullRect() { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void process(const TRasterP &up, const TRasterP &down, double frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		double value = 0.01 * m_value->getValue(frame);
Toshihiro Shimizu 890ddd
		UCHAR matteValue = (UCHAR)(value * 255.0 + 0.5);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRop::crossDissolve(up, down, down, matteValue);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFxPort *getXsheetPort() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return getInputPort(1);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
//    Matte Fxs  definition
Toshihiro Shimizu 890ddd
//******************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class InFx : public TBaseRasterFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(InFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRasterFxPort m_source, m_matte;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	InFx()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		addInputPort("Source", m_source);
Toshihiro Shimizu 890ddd
		addInputPort("Matte", m_matte);
Toshihiro Shimizu 890ddd
		setName(L"InFx");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~InFx() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool doGetBBox(double frame, TRectD &bbox, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_matte.isConnected() && m_source.isConnected()) {
Toshihiro Shimizu 890ddd
			bool ret = m_matte->doGetBBox(frame, bbox, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			if (bbox == TConsts::infiniteRectD)
Toshihiro Shimizu 890ddd
				return m_source->doGetBBox(frame, bbox, info);
Toshihiro Shimizu 890ddd
			else
Toshihiro Shimizu 890ddd
				return ret;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		bbox = TRectD();
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canHandle(const TRenderSettings &info, double frame) { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doCompute(TTile &tile, double frame, const TRenderSettings &ri)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		//This fx is not visible if either the source or the matte tiles are empty.
Toshihiro Shimizu 890ddd
		//It's because only source is visible, and only where matte is opaque.
Toshihiro Shimizu 890ddd
		if (!(m_source.isConnected() && m_matte.isConnected()))
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TTile srcTile;
Toshihiro Shimizu 890ddd
		m_source->allocateAndCompute(srcTile, tile.m_pos, tile.getRaster()->getSize(), tile.getRaster(), frame, ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_matte->compute(tile, frame, ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRop::ropin(srcTile.getRaster(), tile.getRaster(), tile.getRaster());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doDryCompute(TRectD &rect,
Toshihiro Shimizu 890ddd
					  double frame,
Toshihiro Shimizu 890ddd
					  const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (!(m_source.isConnected() && m_matte.isConnected()))
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_source->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
		m_matte->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getMemoryRequirement(const TRectD &rect, double frame, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TRasterFx::memorySize(rect, info.m_bpp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void compute(TFlash &flash, int frame)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_matte.isConnected()) {
Toshihiro Shimizu 890ddd
			flash.pushMatrix();
Toshihiro Shimizu 890ddd
			flash.beginMask();
Toshihiro Shimizu 890ddd
			((TRasterFxP)(m_matte.getFx()))->compute(flash, frame);
Toshihiro Shimizu 890ddd
			flash.endMask();
Toshihiro Shimizu 890ddd
			flash.popMatrix();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_source.isConnected()) {
Toshihiro Shimizu 890ddd
			flash.pushMatrix();
Toshihiro Shimizu 890ddd
			flash.enableMask();
Toshihiro Shimizu 890ddd
			((TRasterFxP)(m_source.getFx()))->compute(flash, frame);
Toshihiro Shimizu 890ddd
			flash.disableMask();
Toshihiro Shimizu 890ddd
			flash.popMatrix();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class OutFx : public TBaseRasterFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(OutFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRasterFxPort m_source, m_matte;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	OutFx()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		addInputPort("Source", m_source);
Toshihiro Shimizu 890ddd
		addInputPort("Matte", m_matte);
Toshihiro Shimizu 890ddd
		setName(L"OutFx");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~OutFx() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool doGetBBox(double frame, TRectD &bbox, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_source.isConnected())
Toshihiro Shimizu 890ddd
			return m_source->doGetBBox(frame, bbox, info);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canHandle(const TRenderSettings &info, double frame) { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doCompute(TTile &tile, double frame, const TRenderSettings &ri)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		// If there is no source, do nothing
Toshihiro Shimizu 890ddd
		if (!m_source.isConnected())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		// Here, source is visible where matte is transparent. So if there is
Toshihiro Shimizu 890ddd
		// no matte, just build source.
Toshihiro Shimizu 890ddd
		if (!m_matte.isConnected()) {
Toshihiro Shimizu 890ddd
			m_source->compute(tile, frame, ri);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TTile srcTile;
Toshihiro Shimizu 890ddd
		m_source->allocateAndCompute(srcTile, tile.m_pos, tile.getRaster()->getSize(), tile.getRaster(), frame, ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_matte->compute(tile, frame, ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRop::ropout(srcTile.getRaster(), tile.getRaster(), tile.getRaster());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doDryCompute(TRectD &rect,
Toshihiro Shimizu 890ddd
					  double frame,
Toshihiro Shimizu 890ddd
					  const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (!m_source.isConnected())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_matte.isConnected()) {
Toshihiro Shimizu 890ddd
			m_source->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_source->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
		m_matte->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getMemoryRequirement(const TRectD &rect, double frame, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TRasterFx::memorySize(rect, info.m_bpp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class AtopFx : public TBaseRasterFx
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FX_DECLARATION(AtopFx)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRasterFxPort m_up, m_dn;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	AtopFx()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		addInputPort("Up", m_up);
Toshihiro Shimizu 890ddd
		addInputPort("Down", m_dn);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool canHandle(const TRenderSettings &info, double frame) { return true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		bBox = TRectD();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TRectD inputBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			bool hasInput = m_up.isConnected() ? m_up->doGetBBox(frame, inputBBox, info) : false;
Toshihiro Shimizu 890ddd
			if (hasInput)
Toshihiro Shimizu 890ddd
				bBox += inputBBox;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		{
Toshihiro Shimizu 890ddd
			TRectD inputBBox;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			bool hasInput = m_dn.isConnected() ? m_dn->doGetBBox(frame, inputBBox, info) : false;
Toshihiro Shimizu 890ddd
			if (hasInput)
Toshihiro Shimizu 890ddd
				bBox += inputBBox;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		return (bBox.getLx() >= 0) && (bBox.getLy() >= 0);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doCompute(TTile &tile, double frame, const TRenderSettings &ri)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		// Here it's just like matte in, but the matte is visible under up.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_dn.isConnected())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_up.isConnected()) {
Toshihiro Shimizu 890ddd
			m_dn->compute(tile, frame, ri);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TTile upTile;
Toshihiro Shimizu 890ddd
		m_up->allocateAndCompute(upTile, tile.m_pos, tile.getRaster()->getSize(), tile.getRaster(), frame, ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_dn->compute(tile, frame, ri);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRop::atop(upTile.getRaster(), tile.getRaster(), tile.getRaster());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void doDryCompute(TRectD &rect,
Toshihiro Shimizu 890ddd
					  double frame,
Toshihiro Shimizu 890ddd
					  const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (!m_dn.isConnected())
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (!m_up.isConnected()) {
Toshihiro Shimizu 890ddd
			m_dn->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
			return;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_up->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
		m_dn->dryCompute(rect, frame, info);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getMemoryRequirement(const TRectD &rect, double frame, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TRasterFx::memorySize(rect, info.m_bpp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================
Toshihiro Shimizu 890ddd
//    Fx identifiers
Toshihiro Shimizu 890ddd
//-----------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(OverFx, "overFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(AddFx, "addFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(SubFx, "subFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(MultFx, "multFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(InFx, "inFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(OutFx, "outFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(AtopFx, "atopFx")
Toshihiro Shimizu 890ddd
//FX_IDENTIFIER(XorFx,       "xorFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(MinFx, "minFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(MaxFx, "maxFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(LinearBurnFx, "linearBurnFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(OverlayFx, "overlayFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(BlendFx, "blendFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(ColorDodgeFx, "colorDodgeFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(ColorBurnFx, "colorBurnFx")
Toshihiro Shimizu 890ddd
FX_IDENTIFIER(ScreenFx, "screenFx")