From bc2c4c30ddb7fbfe96f66bf133d1028dbe1c2075 Mon Sep 17 00:00:00 2001
From: Mathieu Westphal <mathieu.westphal@kitware.com>
Date: Mon, 17 Feb 2025 19:18:07 +0100
Subject: [PATCH] OBJImporter: Use ImageReaderFactory for textures

---
 IO/Import/vtkOBJImporterInternals.cxx | 83 +++++++--------------------
 1 file changed, 22 insertions(+), 61 deletions(-)

diff --git a/IO/Import/vtkOBJImporterInternals.cxx b/IO/Import/vtkOBJImporterInternals.cxx
index 4d265a98abe..ec5b5ed58f8 100644
--- a/IO/Import/vtkOBJImporterInternals.cxx
+++ b/IO/Import/vtkOBJImporterInternals.cxx
@@ -1,16 +1,14 @@
 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
 // SPDX-License-Identifier: BSD-3-Clause
 #include "vtkOBJImporterInternals.h"
-#include "vtkBMPReader.h"
-#include "vtkJPEGReader.h"
+#include "vtkImageReader2.h"
+#include "vtkImageReader2Factory.h"
 #include "vtkOBJImporter.h"
-#include "vtkPNGReader.h"
 #include "vtkPolyDataMapper.h"
 #include "vtkProperty.h"
 #include "vtkRenderWindow.h"
 #include "vtkRenderer.h"
 #include "vtkSmartPointer.h"
-#include "vtkTIFFReader.h"
 #include "vtkTexture.h"
 #include "vtkTransform.h"
 #include "vtksys/FStream.hxx"
@@ -402,71 +400,34 @@ bool bindTexturedPolydataToRenderWindow(vtkRenderWindow* renderWindow, vtkRender
     // For each named material, load and bind the texture, add it to the renderer
 
     std::string textureFilename = reader->GetTextureFilename(port_idx);
-
-    auto kti = knownTextures.find(textureFilename);
-    if (kti == knownTextures.end())
+    if (!textureFilename.empty())
     {
-      vtkSmartPointer<vtkTIFFReader> tex_tiff_Loader = vtkSmartPointer<vtkTIFFReader>::New();
-      vtkSmartPointer<vtkBMPReader> tex_bmp_Loader = vtkSmartPointer<vtkBMPReader>::New();
-      vtkSmartPointer<vtkJPEGReader> tex_jpg_Loader = vtkSmartPointer<vtkJPEGReader>::New();
-      vtkSmartPointer<vtkPNGReader> tex_png_Loader = vtkSmartPointer<vtkPNGReader>::New();
-      int bIsReadableBMP = tex_bmp_Loader->CanReadFile(textureFilename.c_str());
-      int bIsReadableJPEG = tex_jpg_Loader->CanReadFile(textureFilename.c_str());
-      int bIsReadablePNG = tex_png_Loader->CanReadFile(textureFilename.c_str());
-      int bIsReadableTIFF = tex_tiff_Loader->CanReadFile(textureFilename.c_str());
-
-      if (!textureFilename.empty())
+      auto kti = knownTextures.find(textureFilename);
+      if (kti == knownTextures.end())
       {
-        if (bIsReadableJPEG)
-        {
-          tex_jpg_Loader->SetFileName(textureFilename.c_str());
-          tex_jpg_Loader->Update();
-          vtkSmartPointer<vtkTexture> vtk_texture = vtkSmartPointer<vtkTexture>::New();
-          vtk_texture->AddInputConnection(tex_jpg_Loader->GetOutputPort());
-          actor->SetTexture(vtk_texture);
-          knownTextures[textureFilename] = vtk_texture;
-        }
-        else if (bIsReadablePNG)
-        {
-          tex_png_Loader->SetFileName(textureFilename.c_str());
-          tex_png_Loader->Update();
-          vtkSmartPointer<vtkTexture> vtk_texture = vtkSmartPointer<vtkTexture>::New();
-          vtk_texture->AddInputConnection(tex_png_Loader->GetOutputPort());
-          actor->SetTexture(vtk_texture);
-          knownTextures[textureFilename] = vtk_texture;
-        }
-        else if (bIsReadableBMP)
-        {
-          tex_bmp_Loader->SetFileName(textureFilename.c_str());
-          tex_bmp_Loader->Update();
-          vtkSmartPointer<vtkTexture> vtk_texture = vtkSmartPointer<vtkTexture>::New();
-          vtk_texture->AddInputConnection(tex_bmp_Loader->GetOutputPort());
-          actor->SetTexture(vtk_texture);
-          knownTextures[textureFilename] = vtk_texture;
-        }
-        else if (bIsReadableTIFF)
+        vtkSmartPointer<vtkImageReader2> imgReader;
+        imgReader.TakeReference(
+          vtkImageReader2Factory::CreateImageReader2(textureFilename.c_str()));
+
+        if (!imgReader)
         {
-          tex_tiff_Loader->SetFileName(textureFilename.c_str());
-          tex_tiff_Loader->Update();
-          vtkSmartPointer<vtkTexture> vtk_texture = vtkSmartPointer<vtkTexture>::New();
-          vtk_texture->AddInputConnection(tex_tiff_Loader->GetOutputPort());
-          actor->SetTexture(vtk_texture);
-          knownTextures[textureFilename] = vtk_texture;
+          vtkErrorWithObjectMacro(
+            reader, "Cannot instantiate image reader for texture: " << textureFilename);
         }
         else
         {
-          if (!textureFilename
-                 .empty()) // OK to have no texture image, but if its not empty it ought to exist.
-          {
-            vtkErrorWithObjectMacro(
-              reader, "Nonexistent texture image type!? imagefile: " << textureFilename);
-          }
+          imgReader->SetFileName(textureFilename.c_str());
+
+          vtkSmartPointer<vtkTexture> vTexture = vtkSmartPointer<vtkTexture>::New();
+          vTexture->SetInputConnection(imgReader->GetOutputPort());
+          actor->SetTexture(vTexture);
+          knownTextures[textureFilename] = vTexture;
         }
       }
-    }
-    else // this is a texture we already have seen
-    {
-      actor->SetTexture(kti->second);
+      else // this is a texture we already have seen
+      {
+        actor->SetTexture(kti->second);
+      }
     }
 
     vtkSmartPointer<vtkProperty> properties = vtkSmartPointer<vtkProperty>::New();
-- 
GitLab