3
0

ImageConvertJob.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Processing/ImageConvertJob.h>
  9. #include <Processing/PixelFormatInfo.h>
  10. #include <Processing/ImageToProcess.h>
  11. #include <Converters/PixelOperation.h>
  12. #include <Processing/ImageConvert.h>
  13. #include <BuilderSettings/BuilderSettingManager.h>
  14. namespace ImageProcessingAtom
  15. {
  16. IImageObjectPtr ImageConvertOutput::GetOutputImage() const
  17. {
  18. return m_outputImage;
  19. }
  20. void ImageConvertOutput::SetOutputImage(IImageObjectPtr image)
  21. {
  22. m_outputImage = image;
  23. }
  24. void ImageConvertOutput::SetReady(bool ready)
  25. {
  26. m_outputReady = ready;
  27. }
  28. bool ImageConvertOutput::IsReady() const
  29. {
  30. return m_outputReady;
  31. }
  32. float ImageConvertOutput::GetProgress() const
  33. {
  34. return m_progress;
  35. }
  36. void ImageConvertOutput::SetProgress(float progress)
  37. {
  38. m_progress = progress;
  39. }
  40. void ImageConvertOutput::Reset()
  41. {
  42. m_outputImage = nullptr;
  43. m_outputReady = false;
  44. m_progress = 0.0f;
  45. }
  46. ImagePreviewConvertJob::ImagePreviewConvertJob(IImageObjectPtr image, const TextureSettings* textureSetting,
  47. const PresetSettings* preset, const AZStd::string& platformId,
  48. ImageConvertOutput* output, bool autoDelete /*= true*/, AZ::JobContext* jobContext /*= nullptr*/)
  49. : AZ::Job(autoDelete, jobContext)
  50. , m_isCancelled(false)
  51. , m_output(output)
  52. {
  53. AZ_Assert(m_output, "Needs to have an output destination for image conversion!");
  54. if (image && textureSetting && preset)
  55. {
  56. AZStd::unique_ptr<ImageConvertProcessDescriptor> desc = AZStd::make_unique<ImageConvertProcessDescriptor>();
  57. desc->m_textureSetting = *textureSetting;
  58. desc->m_presetSetting = *preset;
  59. desc->m_platform = platformId;
  60. desc->m_inputImage = image;
  61. desc->m_isPreview = true;
  62. m_process = AZStd::make_unique<ImageConvertProcess>(AZStd::move(desc));
  63. }
  64. }
  65. void ImagePreviewConvertJob::Process()
  66. {
  67. if (!m_process)
  68. {
  69. AZ_Error("Image Processing", false, "Cannot start processing, invalid setting or image!");
  70. m_output->SetReady(true);
  71. m_output->SetProgress(1.0f);
  72. return;
  73. }
  74. m_output->SetReady(false);
  75. while (!m_process->IsFinished() && !IsJobCancelled())
  76. {
  77. m_process->UpdateProcess();
  78. m_output->SetProgress(m_process->GetProgress() / static_cast<float>(m_previewProcessStep));
  79. }
  80. IImageObjectPtr outputImage = m_process->GetOutputImage();
  81. if (!IsJobCancelled())
  82. {
  83. // convert the output image to RGBA format for preview
  84. m_output->SetProgress(1.0f / static_cast<float>(m_previewProcessStep));
  85. IImageObjectPtr uncompressedImage = ConvertImageForPreview(outputImage);
  86. m_output->SetOutputImage(uncompressedImage);
  87. }
  88. m_output->SetReady(true);
  89. m_output->SetProgress(1.0f);
  90. }
  91. void ImagePreviewConvertJob::Cancel()
  92. {
  93. m_isCancelled = true;
  94. }
  95. bool ImagePreviewConvertJob::IsJobCancelled()
  96. {
  97. return m_isCancelled || IsCancelled();
  98. }
  99. }// namespace ImageProcessingAtom