Let we make new enum for lanczos resize method, named SINC.
Also, remove some unused codes at material definition load images.
Since we use only desired size and sampling mode at metadata,
we don't need to give input for fitting mode and orientation corrections.
Change-Id: I4df1412540f4c75a869ffa47ff4b09425f622fe1
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
{
ImageInformation(const std::string url,
const Dali::ImageDimensions dimensions,
- Dali::FittingMode::Type fittingMode,
- Dali::SamplingMode::Type samplingMode,
- bool orientationCorrection)
+ Dali::SamplingMode::Type samplingMode)
: mUrl(url),
mDimensions(dimensions),
- mFittingMode(fittingMode),
- mSamplingMode(samplingMode),
- mOrientationCorrection(orientationCorrection)
+ mSamplingMode(samplingMode)
{
}
bool operator==(const ImageInformation& rhs) const
{
- // Check url and orientation correction is enough.
- return (mUrl == rhs.mUrl) && (mOrientationCorrection == rhs.mOrientationCorrection);
+ return (mUrl == rhs.mUrl) && (mDimensions == rhs.mDimensions) && (mSamplingMode == rhs.mSamplingMode);
}
std::string mUrl;
Dali::ImageDimensions mDimensions;
- Dali::FittingMode::Type mFittingMode;
- Dali::SamplingMode::Type mSamplingMode;
- bool mOrientationCorrection;
+ Dali::SamplingMode::Type mSamplingMode : 5;
};
// Hash functor list
*hashTargetPtr++ = info.mDimensions.GetHeight() & 0xff;
*hashTargetPtr++ = (info.mDimensions.GetHeight() >> 8u) & 0xff;
- // Bit-pack the FittingMode, SamplingMode and orientation correction.
- // FittingMode=2bits, SamplingMode=3bits, orientationCorrection=1bit
- *hashTargetPtr = (info.mFittingMode << 4u) | (info.mSamplingMode << 1) | (info.mOrientationCorrection ? 1 : 0);
- }
- else
- {
- // We are not including sizing information, but we still need an extra byte for orientationCorrection.
- hashTarget.resize(1u);
- hashTarget[0u] = info.mOrientationCorrection ? 't' : 'f';
+ // Bit-pack the SamplingMode.
+ *hashTargetPtr = (info.mSamplingMode);
}
return Dali::CalculateHash(info.mUrl) ^ Dali::CalculateHash(hashTarget);
{
oss << "d:" << info.mDimensions.GetWidth() << "x" << info.mDimensions.GetHeight() << " ";
}
- oss << "f:" << info.mFittingMode << " s:" << info.mSamplingMode << " c:" << info.mOrientationCorrection << " ";
+ oss << "s:" << info.mSamplingMode << " ";
oss << "u:" << info.mUrl << "]";
});
// Load the image synchronously (block the thread here).
- Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromFile(info.mUrl, info.mDimensions, info.mFittingMode, info.mSamplingMode, info.mOrientationCorrection);
+ Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromFile(info.mUrl, info.mDimensions, Dali::FittingMode::DEFAULT, info.mSamplingMode, true);
if(pixelBuffer)
{
pixelData = Dali::Devel::PixelBuffer::Convert(pixelBuffer, releasePixelData);
Dali::PixelData GetCachedPixelData(const std::string& url)
{
- return GetCachedPixelData(url, ImageDimensions(), FittingMode::DEFAULT, SamplingMode::BOX_THEN_LINEAR, true);
+ return GetCachedPixelData(url, ImageDimensions(), SamplingMode::BOX_THEN_LINEAR);
}
Dali::PixelData GetCachedPixelData(const std::string& url,
ImageDimensions dimensions,
- FittingMode::Type fittingMode,
- SamplingMode::Type samplingMode,
- bool orientationCorrection)
+ SamplingMode::Type samplingMode)
{
- ImageInformation info(url, dimensions, fittingMode, samplingMode, orientationCorrection);
+ ImageInformation info(url, dimensions, samplingMode);
if(gCacheImpl == nullptr)
{
DALI_LOG_INFO(gLogFilter, Debug::Verbose, "CacheImpl not prepared! load PixelData without cache.\n");
* @note If cache handler is not created yet, or destroyed due to app terminated, it will load image synchronously without cache.
* @param[in] url The URL of the image file to load
* @param[in] dimensions The width and height to fit the loaded image to
- * @param[in] fittingMode The method used to fit the shape of the image before loading to the shape defined by the size parameter
* @param[in] samplingMode The filtering method used when sampling pixels from the input image while fitting it to desired size
- * @param[in] orientationCorrection Reorient the image to respect any orientation metadata in its header
* @return A PixelData object containing the image, or an invalid object on failure
*/
Dali::PixelData GetCachedPixelData(const std::string& url,
ImageDimensions dimensions,
- FittingMode::Type fittingMode,
- SamplingMode::Type samplingMode,
- bool orientationCorrection);
+ SamplingMode::Type samplingMode);
} // namespace ImageResourceLoader
} // namespace Internal
/*\r
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.\r
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.\r
*\r
* Licensed under the Apache License, Version 2.0 (the "License");\r
* you may not use this file except in compliance with the License.\r
BOX_THEN_NEAREST = Dali::SamplingMode::BOX_THEN_NEAREST,\r
BOX_THEN_LINEAR = Dali::SamplingMode::BOX_THEN_LINEAR,\r
NO_FILTER = Dali::SamplingMode::NO_FILTER,\r
- DONT_CARE = Dali::SamplingMode::DONT_CARE\r
+ DONT_CARE = Dali::SamplingMode::DONT_CARE,\r
+ LANCZOS = Dali::SamplingMode::LANCZOS,\r
+ BOX_THEN_LANCZOS = Dali::SamplingMode::BOX_THEN_LANCZOS,\r
};\r
\r
static Type FromString(const char* s, size_t len);\r
ENUM_STRING_MAPPING(ImageData::SamplingMode, BOX_THEN_LINEAR),\r
ENUM_STRING_MAPPING(ImageData::SamplingMode, NO_FILTER),\r
ENUM_STRING_MAPPING(ImageData::SamplingMode, DONT_CARE),\r
+ ENUM_STRING_MAPPING(ImageData::SamplingMode, LANCZOS),\r
+ ENUM_STRING_MAPPING(ImageData::SamplingMode, BOX_THEN_LANCZOS),\r
};\r
return SAMPLING_MODE_TYPES;\r
}\r
const js::Reader<ImageData>& GetImageMetaDataReader()\r
{\r
static const auto IMAGE_METADATA_READER = std::move(js::Reader<ImageData>()\r
- .Register(*js::MakeProperty("uri", js::Read::String, &ImageData::mImageUri))\r
- .Register(*js::MakeProperty("minWidth", js::Read::Number, &ImageData::mMinWidth))\r
- .Register(*js::MakeProperty("minHeight", js::Read::Number, &ImageData::mMinHeight))\r
- .Register(*js::MakeProperty("samplingMode", gt::ReadStringEnum<ImageData::SamplingMode>, &ImageData::mSamplingMode)));\r
+ .Register(*js::MakeProperty("uri", js::Read::String, &ImageData::mImageUri))\r
+ .Register(*js::MakeProperty("minWidth", js::Read::Number, &ImageData::mMinWidth))\r
+ .Register(*js::MakeProperty("minHeight", js::Read::Number, &ImageData::mMinHeight))\r
+ .Register(*js::MakeProperty("samplingMode", gt::ReadStringEnum<ImageData::SamplingMode>, &ImageData::mSamplingMode)));\r
return IMAGE_METADATA_READER;\r
}\r
\r
const js::Reader<MetaData>& GetMetaDataReader()\r
{\r
static const auto METADATA_READER = std::move(js::Reader<MetaData>()\r
- .Register(*js::MakeProperty("images", js::Read::Array<ImageData, js::ObjectReader<ImageData>::Read>, &MetaData::mImageData)));\r
+ .Register(*js::MakeProperty("images", js::Read::Array<ImageData, js::ObjectReader<ImageData>::Read>, &MetaData::mImageData)));\r
return METADATA_READER;\r
}\r
} // namespace\r
static constexpr std::string_view EMBEDDED_DATA_BASE64_ENCODING_TYPE = "base64,";
Dali::PixelData LoadImageResource(const std::string& resourcePath,
- TextureDefinition& textureDefinition,
- FittingMode::Type fittingMode,
- bool orientationCorrection)
+ TextureDefinition& textureDefinition)
{
Dali::PixelData pixelData;
if(!textureDefinition.mTextureBuffer.empty())
{
- DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss)
- { oss << "[s:" << textureDefinition.mTextureBuffer.size() << "]"; });
- Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromBuffer(textureDefinition.mTextureBuffer.data(), textureDefinition.mTextureBuffer.size(), textureDefinition.mMinImageDimensions, fittingMode, textureDefinition.mSamplingMode, orientationCorrection);
+ DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss) { oss << "[s:" << textureDefinition.mTextureBuffer.size() << "]"; });
+ Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromBuffer(textureDefinition.mTextureBuffer.data(), textureDefinition.mTextureBuffer.size(), textureDefinition.mMinImageDimensions, FittingMode::DEFAULT, textureDefinition.mSamplingMode, true);
if(pixelBuffer)
{
pixelData = Devel::PixelBuffer::Convert(pixelBuffer);
}
- DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss)
- {
+ DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss) {
oss << "[";
if(pixelData)
{
Dali::Toolkit::DecodeBase64FromString(data, buffer);
uint32_t bufferSize = buffer.size();
- DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss)
- { oss << "[embedded s:" << bufferSize << "]"; });
- Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromBuffer(reinterpret_cast<uint8_t*>(buffer.data()), bufferSize, textureDefinition.mMinImageDimensions, fittingMode, textureDefinition.mSamplingMode, orientationCorrection);
+ DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss) { oss << "[embedded s:" << bufferSize << "]"; });
+ Dali::Devel::PixelBuffer pixelBuffer = Dali::LoadImageFromBuffer(reinterpret_cast<uint8_t*>(buffer.data()), bufferSize, textureDefinition.mMinImageDimensions, FittingMode::DEFAULT, textureDefinition.mSamplingMode, true);
if(pixelBuffer)
{
pixelData = Dali::Devel::PixelBuffer::Convert(pixelBuffer, true);
}
- DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss)
- {
+ DALI_TRACE_END_WITH_MESSAGE_GENERATOR(gTraceFilter, "DALI_MODEL_LOAD_IMAGE_FROM_BUFFER", [&](std::ostringstream& oss) {
oss << "[";
if(pixelData)
{
else
{
textureDefinition.mDirectoryPath = resourcePath;
- pixelData = Internal::ImageResourceLoader::GetCachedPixelData(resourcePath + textureDefinition.mImageUri, textureDefinition.mMinImageDimensions, fittingMode, textureDefinition.mSamplingMode, orientationCorrection);
+ pixelData = Internal::ImageResourceLoader::GetCachedPixelData(resourcePath + textureDefinition.mImageUri, textureDefinition.mMinImageDimensions, textureDefinition.mSamplingMode);
}
return pixelData;
}
// Load textures
auto iTexture = mTextureStages.begin();
- auto checkStage = [&](uint32_t flags)
- {
+ auto checkStage = [&](uint32_t flags) {
return iTexture != mTextureStages.end() && MaskMatch(iTexture->mSemantic, flags);
};
// Check for compulsory textures: Albedo, Metallic, Roughness, Normal
if(checkStage(ALBEDO | METALLIC))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
if(checkStage(NORMAL | ROUGHNESS))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
else // single value normal-roughness
{
if(checkStage(ALBEDO))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
else if(mNeedAlbedoTexture) // single value albedo, albedo-alpha or albedo-metallic
const bool createMetallicRoughnessAndNormal = hasTransparency || std::distance(mTextureStages.begin(), iTexture) > 0;
if(checkStage(METALLIC | ROUGHNESS))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
else if(createMetallicRoughnessAndNormal && mNeedMetallicRoughnessTexture)
if(checkStage(NORMAL))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
else if(mNeedNormalTexture)
// Extra textures.
if(checkStage(SUBSURFACE))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
if(checkStage(OCCLUSION))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
if(checkStage(EMISSIVE))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
if(checkStage(SPECULAR))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
if(checkStage(SPECULAR_COLOR))
{
- raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture, FittingMode::DEFAULT, true), iTexture->mTexture.mSamplerFlags});
+ raw.mTextures.push_back({LoadImageResource(imagesPath, iTexture->mTexture), iTexture->mTexture.mSamplerFlags});
++iTexture;
}
bool MaterialDefinition::CheckTextures(uint32_t flags) const
{
- return std::find_if(mTextureStages.begin(), mTextureStages.end(), [flags](const TextureStage& ts)
- { return MaskMatch(ts.mSemantic, flags); }) != mTextureStages.end();
+ return std::find_if(mTextureStages.begin(), mTextureStages.end(), [flags](const TextureStage& ts) { return MaskMatch(ts.mSemantic, flags); }) != mTextureStages.end();
}
} // namespace Loader
*hashTargetPtr++ = (size.GetHeight() >> 8u) & 0xff;
// Bit-pack the FittingMode, SamplingMode.
- // FittingMode=2bits, SamplingMode=3bits
- *hashTargetPtr = (fittingMode << 3u) | (samplingMode);
+ // FittingMode=3bits, SamplingMode=4bits
+ *hashTargetPtr = (fittingMode << 4u) | (samplingMode);
}
// Append whether we will not correction orientation. We don't do additional job when it is true, the general cases.
float scaleFactor; ///< The scale factor to apply to the Texture when masking
int32_t referenceCount; ///< The reference count of clients using this Texture
LoadState loadState; ///< The load state showing the load progress of the Texture
- Dali::FittingMode::Type fittingMode : 3; ///< The requested FittingMode
- Dali::SamplingMode::Type samplingMode : 3; ///< The requested SamplingMode
+ Dali::FittingMode::Type fittingMode : 4; ///< The requested FittingMode
+ Dali::SamplingMode::Type samplingMode : 5; ///< The requested SamplingMode
StorageType storageType; ///< CPU storage / GPU upload;
Dali::AnimatedImageLoading animatedImageLoading; ///< AnimatedImageLoading that contains animated image information.
uint32_t frameIndex; ///< Frame index that be loaded, in case of animated image
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::FittingMode, SCALE_TO_FILL)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::FittingMode, FIT_WIDTH)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::FittingMode, FIT_HEIGHT)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::FittingMode, VISUAL_FITTING)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::FittingMode, DEFAULT)
DALI_ENUM_TO_STRING_TABLE_END(FITTING_MODE)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, BOX_THEN_LINEAR)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, NO_FILTER)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, DONT_CARE)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, LANCZOS)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, BOX_THEN_LANCZOS)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, DEFAULT)
DALI_ENUM_TO_STRING_TABLE_END(SAMPLING_MODE)
// stop behavior
mActionStatus(DevelAnimatedImageVisual::Action::PLAY),
mWrapModeU(WrapMode::DEFAULT),
mWrapModeV(WrapMode::DEFAULT),
+ mStopBehavior(DevelImageVisual::StopBehavior::CURRENT_FRAME),
mFittingMode(FittingMode::VISUAL_FITTING),
mSamplingMode(SamplingMode::BOX_THEN_LINEAR),
- mStopBehavior(DevelImageVisual::StopBehavior::CURRENT_FRAME),
mStartFirstFrame(false),
mIsJumpTo(false)
{
Dali::WrapMode::Type mWrapModeU : 3;
Dali::WrapMode::Type mWrapModeV : 3;
- Dali::FittingMode::Type mFittingMode : 3;
- Dali::SamplingMode::Type mSamplingMode : 4;
DevelImageVisual::StopBehavior::Type mStopBehavior : 2;
+ Dali::FittingMode::Type mFittingMode : 4;
+ Dali::SamplingMode::Type mSamplingMode : 5;
bool mStartFirstFrame : 1;
bool mIsJumpTo : 1;
};
mObserver(observer),
mMaskingData(maskingData),
mDesiredSize(size),
- mFittingMode(fittingMode),
- mSamplingMode(samplingMode),
mBatchSize(batchSize),
mInterval(interval),
mLoadState(TextureManager::LoadState::NOT_STARTED),
+ mFittingMode(fittingMode),
+ mSamplingMode(samplingMode),
mRequestingLoad(false),
mPreMultiplyOnLoad(preMultiplyOnLoad)
{
FrameReadyObserver& mObserver;
TextureManager::MaskingDataPointer& mMaskingData;
Dali::ImageDimensions mDesiredSize;
- Dali::FittingMode::Type mFittingMode : 3;
- Dali::SamplingMode::Type mSamplingMode : 4;
uint32_t mBatchSize;
uint32_t mInterval;
TextureManager::LoadState mLoadState;
+ Dali::FittingMode::Type mFittingMode : 4;
+ Dali::SamplingMode::Type mSamplingMode : 5;
bool mRequestingLoad : 1;
bool mPreMultiplyOnLoad : 1;
};
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, BOX_THEN_LINEAR)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, NO_FILTER)
DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, DONT_CARE)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, LANCZOS)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, BOX_THEN_LANCZOS)
+ DALI_ENUM_TO_STRING_WITH_SCOPE(Dali::SamplingMode, DEFAULT)
DALI_ENUM_TO_STRING_TABLE_END(SAMPLING_MODE)
// wrap modes
* "BOX_THEN_LINEAR"
* "NO_FILTER"
* "DONT_CARE"
+ * "LANCZOS"
+ * "BOX_THEN_LANCZOS"
* "DEFAULT"
*
* where loadPolicy should be one of the following image loading modes
ImageVisualShaderFactory& mImageVisualShaderFactory;
- Dali::FittingMode::Type mFittingMode : 3;
- Dali::SamplingMode::Type mSamplingMode : 4;
+ Dali::FittingMode::Type mFittingMode : 4;
+ Dali::SamplingMode::Type mSamplingMode : 5;
Dali::WrapMode::Type mWrapModeU : 3;
Dali::WrapMode::Type mWrapModeV : 3;
Dali::Toolkit::ImageVisual::LoadPolicy::Type mLoadPolicy;