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
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
|
|
|
|
|
|
|
|
|
|
|