diff --git a/Common/DataModel/vtkDataSetAttributes.cxx b/Common/DataModel/vtkDataSetAttributes.cxx index 3b6f2cfd8388235cf18e9983a530436f8833dee9..d629a9d50fc1d8fe8a9a7deb278a8dbd25f49122 100644 --- a/Common/DataModel/vtkDataSetAttributes.cxx +++ b/Common/DataModel/vtkDataSetAttributes.cxx @@ -16,8 +16,10 @@ #include "vtkArrayDispatch.h" #include "vtkArrayIteratorIncludes.h" +#include "vtkAssume.h" #include "vtkCell.h" #include "vtkCharArray.h" +#include "vtkDataArrayAccessor.h" #include "vtkDoubleArray.h" #include "vtkFloatArray.h" #include "vtkIdTypeArray.h" @@ -460,6 +462,13 @@ struct CopyStructuredDataWorker this->OutExt[5] - this->InExt[4] }; + // Give the compiler a hand -- allow optimizations that require both arrays + // to have the same stride. + VTK_ASSUME(src->GetNumberOfComponents() == dest->GetNumberOfComponents()); + + vtkDataArrayAccessor<Array1T> d(dest); + vtkDataArrayAccessor<Array2T> s(src); + const int dims[3] = { this->InExt[1] - this->InExt[0] + 1, this->InExt[3] - this->InExt[2] + 1, this->InExt[5] - this->InExt[4] + 1}; @@ -477,8 +486,7 @@ struct CopyStructuredDataWorker for (int comp = 0, max = dest->GetNumberOfComponents(); comp < max; ++comp) { - dest->SetTypedComponent(outTupleIdx, comp, - src->GetTypedComponent(inTupleIdx, comp)); + d.Set(outTupleIdx, comp, s.Get(inTupleIdx, comp)); } outTupleIdx++; } @@ -612,9 +620,7 @@ void vtkDataSetAttributes::CopyStructuredData(vtkDataSetAttributes *fromPd, // legacy code around until we've done through benchmarking. vtkDataArray *inDA = vtkDataArray::SafeDownCast(inArray); vtkDataArray *outDA = vtkDataArray::SafeDownCast(outArray); - if ((inArray->HasStandardMemoryLayout() && - outArray->HasStandardMemoryLayout()) || - (!inDA || !outDA)) + if (!inDA || !outDA) // String array, etc { vtkArrayIterator* srcIter = inArray->NewIterator(); vtkArrayIterator* destIter = outArray->NewIterator(); @@ -634,7 +640,8 @@ void vtkDataSetAttributes::CopyStructuredData(vtkDataSetAttributes *fromPd, if (!vtkArrayDispatch::Dispatch2SameValueType::Execute(outDA, inDA, worker)) { - vtkWarningMacro("Dispatch failed for array " << inArray->GetName()); + // Fallback to vtkDataArray API (e.g. vtkBitArray): + worker(outDA, inDA); } } }