Commit d7964786 authored by Allison Vacanti's avatar Allison Vacanti Committed by Kitware Robot

Merge topic 'PDFExporter_image_transparency_blend'

4bb2b2bd Blend images in Context2D PDF exporter with brush.
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Acked-by: Scott Wittenburg's avatarScott Wittenburg <scott.wittenburg@kitware.com>
Merge-request: !4758
parents ce41ee9c 4bb2b2bd
...@@ -19,7 +19,9 @@ ...@@ -19,7 +19,9 @@
#include "vtkBrush.h" #include "vtkBrush.h"
#include "vtkCellIterator.h" #include "vtkCellIterator.h"
#include "vtkCellTypes.h" #include "vtkCellTypes.h"
#include "vtkDataArray.h"
#include "vtkFloatArray.h" #include "vtkFloatArray.h"
#include "vtkImageBlend.h"
#include "vtkImageCast.h" #include "vtkImageCast.h"
#include "vtkImageData.h" #include "vtkImageData.h"
#include "vtkImageExtractComponents.h" #include "vtkImageExtractComponents.h"
...@@ -30,6 +32,7 @@ ...@@ -30,6 +32,7 @@
#include "vtkObjectFactory.h" #include "vtkObjectFactory.h"
#include "vtkPath.h" #include "vtkPath.h"
#include "vtkPen.h" #include "vtkPen.h"
#include "vtkPointData.h"
#include "vtkPolyData.h" #include "vtkPolyData.h"
#include "vtkRenderer.h" #include "vtkRenderer.h"
#include "vtkRenderWindow.h" #include "vtkRenderWindow.h"
...@@ -43,6 +46,7 @@ ...@@ -43,6 +46,7 @@
#include <vtk_libharu.h> #include <vtk_libharu.h>
#include <algorithm> #include <algorithm>
#include <array>
#include <cassert> #include <cassert>
#include <cmath> #include <cmath>
#include <map> #include <map>
...@@ -1579,13 +1583,34 @@ vtkImageData *vtkPDFContextDevice2D::PrepareImageData(vtkImageData *in) ...@@ -1579,13 +1583,34 @@ vtkImageData *vtkPDFContextDevice2D::PrepareImageData(vtkImageData *in)
} }
if (in->GetNumberOfScalarComponents() == 4) if (in->GetNumberOfScalarComponents() == 4)
{ // If RGBA, drop alpha -- Haru doesn't support RGBA. { // If RGBA, blend into brush color -- Haru doesn't support RGBA.
vtkNew<vtkImageExtractComponents> extract;
extract->SetInputData(in); vtkNew<vtkImageData> background;
{ // Fill the background image with brush color, saturate alpha
std::array<unsigned char, 4> bgColor;
this->Brush->GetColor(bgColor.data());
bgColor[3] = 255; // Saturate alpha
background->SetExtent(in->GetExtent());
background->AllocateScalars(VTK_UNSIGNED_CHAR, 4);
auto *scalars = vtkUnsignedCharArray::SafeDownCast(
background->GetPointData()->GetScalars());
for (int comp = 0; comp < 4; ++comp)
{
scalars->FillComponent(comp, bgColor[comp]);
}
}
// Blend the input image over the background color:
vtkNew<vtkImageBlend> blender;
blender->AddInputData(0, background);
blender->AddInputData(0, in);
in->UnRegister(this); // Remove ref++ from above in->UnRegister(this); // Remove ref++ from above
blender->SetBlendModeToNormal();
vtkNew<vtkImageExtractComponents> extract;
extract->SetInputConnection(blender->GetOutputPort(0));
extract->SetComponents(0, 1, 2); extract->SetComponents(0, 1, 2);
extract->Update(); extract->Update();
in = extract->GetOutput(); in = extract->GetOutput();
in->Register(this); in->Register(this);
} }
......
...@@ -15,6 +15,11 @@ ...@@ -15,6 +15,11 @@
/** /**
* @class vtkPDFContextDevice2D * @class vtkPDFContextDevice2D
* @brief vtkContextDevice2D implementation for use with vtkPDFExporter. * @brief vtkContextDevice2D implementation for use with vtkPDFExporter.
*
* Quirks:
* - Libharu does not support RGBA images. If an alpha channel is present in any
* drawn images, it will be blended into an opaque background filled with the
* active Brush color to produce a flat RGB image.
*/ */
#ifndef vtkPDFContextDevice2D_h #ifndef vtkPDFContextDevice2D_h
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment