Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

200 lines
6.6 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkImageBlend.h,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
// .NAME vtkImageBlend - blend images together using alpha or opacity
// .SECTION Description
// vtkImageBlend takes L, LA, RGB, or RGBA images as input and blends them
// according to the alpha values and/or the opacity setting for each input.
//
// The spacing, origin, extent, and number of components of the output are
// the same as those for the first input. If the input has an alpha
// component, then this component is copied unchanged into the output.
// In addition, if the first input has either one component or two
// components i.e. if it is either L (greyscale) or LA (greyscale + alpha)
// then all other inputs must also be L or LA.
//
// Different blending modes are available:
//
// \em Normal (default) :
// This is the standard blending mode used by OpenGL and other graphics
// packages. The output always has the same number of components
// and the same extent as the first input. The alpha value of the first
// input is not used in the blending computation, instead it is copied
// directly to the output.
//
// \code
// output <- input[0]
// foreach input i {
// foreach pixel px {
// r <- input[i](px)(alpha) * opacity[i]
// f <- (255 - r)
// output(px) <- output(px) * f + input(px) * r
// }
// }
// \endcode
//
// \em Compound :
// Images are compounded together and each component is scaled by the sum of
// the alpha/opacity values. Use the CompoundThreshold method to set
// specify a threshold in compound mode. Pixels with opacity*alpha less
// or equal than this threshold are ignored.
// The alpha value of the first input, if present, is NOT copied to the alpha
// value of the output. The output always has the same number of components
// and the same extent as the first input.
//
// \code
// output <- 0
// foreach pixel px {
// sum <- 0
// foreach input i {
// r <- input[i](px)(alpha) * opacity(i)
// sum <- sum + r
// if r > threshold {
// output(px) <- output(px) + input(px) * r
// }
// }
// output(px) <- output(px) / sum
// }
// \endcode
#ifndef __vtkImageBlend_h
#define __vtkImageBlend_h
#include "vtkThreadedImageAlgorithm.h"
class vtkImageStencilData;
#define VTK_IMAGE_BLEND_MODE_NORMAL 0
#define VTK_IMAGE_BLEND_MODE_COMPOUND 1
class VTK_IMAGING_EXPORT vtkImageBlend : public vtkThreadedImageAlgorithm
{
public:
static vtkImageBlend *New();
vtkTypeRevisionMacro(vtkImageBlend,vtkThreadedImageAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent);
// Description:
// Set an Input of this filter. This method is only for support of
// old-style pipeline connections. When writing new code you should
// use vtkAlgorithm::AddInputConnection(0, data).
void SetInput(int num, vtkDataObject *input);
void SetInput(vtkDataObject *input) { this->SetInput(0, input); };
// Description:
// Get one input to this filter. This method is only for support of
// old-style pipeline connections. When writing new code you should
// use vtkAlgorithm::GetInputConnection(0, num).
vtkDataObject *GetInput(int num);
vtkDataObject *GetInput() { return this->GetInput(0); };
// Description:
// Get the number of inputs to this filter. This method is only for
// support of old-style pipeline connections. When writing new code
// you should use vtkAlgorithm::GetNumberOfInputConnections(0).
int GetNumberOfInputs() { return this->GetNumberOfInputConnections(0); };
// Description:
// Set the opacity of an input image: the alpha values of the image are
// multiplied by the opacity. The opacity of image idx=0 is ignored.
void SetOpacity(int idx, double opacity);
double GetOpacity(int idx);
// Description:
// Set a stencil to apply when blending the data.
void SetStencil(vtkImageStencilData *stencil);
vtkImageStencilData *GetStencil();
// Description:
// Set the blend mode
vtkSetClampMacro(BlendMode,int,
VTK_IMAGE_BLEND_MODE_NORMAL,
VTK_IMAGE_BLEND_MODE_COMPOUND );
vtkGetMacro(BlendMode,int);
void SetBlendModeToNormal()
{this->SetBlendMode(VTK_IMAGE_BLEND_MODE_NORMAL);};
void SetBlendModeToCompound()
{this->SetBlendMode(VTK_IMAGE_BLEND_MODE_COMPOUND);};
const char *GetBlendModeAsString(void);
// Description:
// Specify a threshold in compound mode. Pixels with opacity*alpha less
// or equal the threshold are ignored.
vtkSetMacro(CompoundThreshold,double);
vtkGetMacro(CompoundThreshold,double);
protected:
vtkImageBlend();
~vtkImageBlend();
virtual int RequestUpdateExtent(vtkInformation *,
vtkInformationVector **,
vtkInformationVector *);
void InternalComputeInputUpdateExtent(int inExt[6], int outExt[6],
int inWExtent[6]);
virtual int RequestInformation (vtkInformation *,
vtkInformationVector **,
vtkInformationVector *);
void ThreadedRequestData (vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector,
vtkImageData ***inData, vtkImageData **outData,
int ext[6], int id);
// see vtkAlgorithm for docs.
virtual int FillInputPortInformation(int, vtkInformation*);
// see vtkAlgorithm for docs.
virtual int RequestData(vtkInformation* request,
vtkInformationVector** inputVector,
vtkInformationVector* outputVector);
double *Opacity;
int OpacityArrayLength;
int BlendMode;
double CompoundThreshold;
int DataWasPassed;
private:
vtkImageBlend(const vtkImageBlend&); // Not implemented.
void operator=(const vtkImageBlend&); // Not implemented.
};
// Description:
// Get the blending mode as a descriptive string
inline const char *vtkImageBlend::GetBlendModeAsString()
{
switch (this->BlendMode)
{
case VTK_IMAGE_BLEND_MODE_NORMAL:
return "Normal";
case VTK_IMAGE_BLEND_MODE_COMPOUND:
return "Compound";
default:
return "Unknown Blend Mode";
}
}
#endif