Files
o3de/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImagePreview.cpp
T
Qing Tao 89e6df1c7f ATOM-16575 clean up image builder presets files (#4611)
ATOM-16575 clean up image builder presets files
Removed unused image builder presets
Deprecating preset UUID and use preset name as unique id
Delete all .exportsettings file which were only used for legacy imageProcessing gem.

Signed-off-by: Qing Tao <qingtao@amazon.com>
2021-10-11 15:18:39 -07:00

116 lines
3.6 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AzCore/PlatformIncl.h>
#include <Processing/ImagePreview.h>
#include <BuilderSettings/BuilderSettingManager.h>
#include <ImageLoader/ImageLoaders.h>
#include <Processing/ImageConvert.h>
#include <Processing/PixelFormatInfo.h>
#include <Processing/Utils.h>
#include <Editor/EditorCommon.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <Atom/RPI.Reflect/Image/StreamingImageAsset.h>
#include <QImage>
namespace ImageProcessingAtom
{
ImagePreview::ImagePreview(const AZStd::string& inputImageFile, TextureSettings* textureSetting)
: m_imageFileName(inputImageFile)
, m_textureSetting(textureSetting)
, m_presetSetting(nullptr)
, m_inputImage(nullptr)
{
InitializeJobSettings();
}
void ImagePreview::StartConvert()
{
// If there is ongoing job, cancel it
Cancel();
m_output.Reset();
if (m_inputImage == nullptr)
{
// Load input image
m_inputImage = IImageObjectPtr(LoadImageFromFile(m_imageFileName));
}
// Get preset if the setting in texture is changed
if (m_presetSetting == nullptr || m_presetSetting->m_name != m_textureSetting->m_preset)
{
m_presetSetting = BuilderSettingManager::Instance()->GetPreset(m_textureSetting->m_preset);
}
const bool autoDelete = false;
PlatformName defaultPlatform = BuilderSettingManager::s_defaultPlatform;
m_convertJob = AZStd::make_unique<ImagePreviewConvertJob>(m_inputImage, m_textureSetting, m_presetSetting,
defaultPlatform, &m_output, autoDelete, m_jobContext.get());
m_convertJob->SetDependent(&m_doneJob);
m_convertJob->Start();
}
bool ImagePreview::IsDone()
{
return m_output.IsReady();
}
float ImagePreview::GetProgress()
{
if (!m_output.IsReady())
{
return m_output.GetProgress();
}
return 1.0f;
}
void ImagePreview::Cancel()
{
if (m_convertJob)
{
m_convertJob->Cancel();
// Block until job completes
m_doneJob.StartAndWaitForCompletion();
AZ_Assert(m_output.IsReady(), "Conversion job is not done yet!");
}
m_convertJob.release();
m_doneJob.Reset(true);
}
IImageObjectPtr ImagePreview::GetOutputImage()
{
return m_output.GetOutputImage(ImageConvertOutput::Preview);
}
ImagePreview::~ImagePreview()
{
Cancel();
// Maintain the releasing order
m_jobManager.release();
m_jobContext.release();
m_jobCancelGroup.release();
}
void ImagePreview::InitializeJobSettings()
{
AZ::JobManagerDesc desc;
AZ::JobManagerThreadDesc threadDesc;
desc.m_workerThreads.push_back(threadDesc);
// Check to ensure these have not already been initialized.
AZ_Error("Image Processing", !m_jobManager && !m_jobCancelGroup && !m_jobContext, "ImagePreview::InitializeJobSettings is being called again after it has already been initialized");
m_jobManager = AZStd::make_unique<AZ::JobManager>(desc);
m_jobCancelGroup = AZStd::make_unique<AZ::JobCancelGroup>();
m_jobContext = AZStd::make_unique<AZ::JobContext>(*m_jobManager, *m_jobCancelGroup);
new (&m_doneJob) AZ::JobCompletion(m_jobContext.get()); //re-initialize with the job context
}
}// namespace ImageProcessingAtom