ezResult ezImageConversion::ConvertSingleStep(const ezImageConversionStep* pStep, const ezImageView& source, ezImage& target,
                                              ezImageFormat::Enum targetFormat)
{
  if (!pStep)
  {
    target.ResetAndCopy(source);
    return EZ_SUCCESS;
  }

  ezImageFormat::Enum sourceFormat = source.GetImageFormat();

  ezImageHeader header = source.GetHeader();
  header.SetImageFormat(targetFormat);
  target.ResetAndAlloc(header);

  if (!ezImageFormat::IsCompressed(sourceFormat))
  {
    if (!ezImageFormat::IsCompressed(targetFormat))
    {
      // we have to do the computation in 64-bit otherwise it might overflow for very large textures (8k x 4k or bigger).
      ezUInt64 numElements =
          ezUInt64(8) * (ezUInt64)target.GetArrayPtr<void>().GetCount() / (ezUInt64)ezImageFormat::GetBitsPerPixel(targetFormat);
      return static_cast<const ezImageConversionStepLinear*>(pStep)->ConvertPixels(source.GetArrayPtr<void>(), target.GetArrayPtr<void>(),
                                                                                   (ezUInt32)numElements, sourceFormat, targetFormat);
    }
    else
    {
      return ConvertSingleStepCompress(source, target, sourceFormat, targetFormat, pStep);
    }
  }
  else
  {
    return ConvertSingleStepDecompress(source, target, sourceFormat, targetFormat, pStep);
  }
}
ezResult ezImageConversion::Convert(const ezImageView& source, ezImage& target, ezImageFormat::Enum targetFormat)
{
  ezImageFormat::Enum sourceFormat = source.GetImageFormat();

  // Trivial copy
  if (sourceFormat == targetFormat)
  {
    if (&source != &target)
    {
      // copy if not already the same
      target.ResetAndCopy(source);
    }
    return EZ_SUCCESS;
  }

  ezHybridArray<ConversionPathNode, 16> path;
  ezUInt32 numScratchBuffers = 0;
  if (BuildPath(sourceFormat, targetFormat, &source == &target, path, numScratchBuffers).Failed())
  {
    return EZ_FAILURE;
  }

  return Convert(source, target, path, numScratchBuffers);
}