TEST_F(ArrayChangeInformationFilter_test, vtkAssignAttribute_CorrectNumberOfComponentsPassedDownstream) { inAttr->SetNumberOfComponents(3); inAttr->SetNumberOfTuples(17); for (vtkIdType i = 0; i < inAttr->GetNumberOfValues(); ++i) { inAttr->SetValue(i, static_cast<float>(i)); } auto inImage = vtkSmartPointer<vtkImageData>::New(); inImage->GetPointData()->SetScalars(inAttr); inImage->SetExtent(0, 0, 2, 18, 3, 3); auto infoSource = vtkSmartPointer<InformationSource>::New(); infoSource->SetOutput(inImage); vtkDataObject::SetActiveAttributeInfo(infoSource->GetOutInfo(), vtkDataObject::FIELD_ASSOCIATION_POINTS, vtkDataSetAttributes::SCALARS, inAttr->GetName(), inAttr->GetDataType(), inAttr->GetNumberOfComponents(), static_cast<int>(inAttr->GetNumberOfTuples())); filter->SetAttributeLocation(ArrayChangeInformationFilter::POINT_DATA); filter->SetAttributeType(vtkDataSetAttributes::SCALARS); filter->SetInputConnection(infoSource->GetOutputPort()); filter->EnableRenameOff(); filter->EnableSetUnitOff(); auto assignToVectors = vtkSmartPointer<vtkAssignAttribute>::New(); assignToVectors->SetInputConnection(filter->GetOutputPort()); assignToVectors->Assign(vtkDataSetAttributes::SCALARS, vtkDataSetAttributes::VECTORS, vtkAssignAttribute::POINT_DATA); auto reassignScalars = vtkSmartPointer<vtkAssignAttribute>::New(); reassignScalars->SetInputConnection(assignToVectors->GetOutputPort()); reassignScalars->Assign(vtkDataSetAttributes::VECTORS, vtkDataSetAttributes::SCALARS, vtkAssignAttribute::POINT_DATA); auto normalize = vtkSmartPointer<vtkImageNormalize>::New(); normalize->SetInputConnection(reassignScalars->GetOutputPort()); normalize->SetEnableSMP(false); normalize->SetNumberOfThreads(1); // before patching (VTK 7.1+) vtkAssignAttribute, this would cause segmentation faults normalize->Update(); auto outImg = normalize->GetOutput(); auto outScalars = outImg->GetPointData()->GetScalars(); ASSERT_EQ(inAttr->GetNumberOfComponents(), outScalars->GetNumberOfComponents()); ASSERT_EQ(inAttr->GetNumberOfTuples(), outScalars->GetNumberOfTuples()); }
STDMETHODIMP CEncoder::SetCoderProperties(const PROPID * propIDs, const PROPVARIANT * coderProps, UInt32 numProps) { _props.clear(); for (UInt32 i = 0; i < numProps; i++) { const PROPVARIANT & prop = coderProps[i]; PROPID propID = propIDs[i]; UInt32 v = (UInt32)prop.ulVal; switch (propID) { case NCoderPropID::kLevel: { if (prop.vt != VT_UI4) return E_INVALIDARG; /* level 1..22 */ _props._level = static_cast < Byte > (prop.ulVal); Byte mylevel = static_cast < Byte > (ZSTDMT_LEVEL_MAX); if (_props._level > mylevel) _props._level = mylevel; break; } case NCoderPropID::kNumThreads: { SetNumberOfThreads(v); break; } default: { break; } } } return S_OK; }