Add padding params in ResourceCache

This commit is contained in:
Nomango 2019-08-21 17:31:28 +08:00
parent 318eeff9c7
commit 92e61ed297
2 changed files with 66 additions and 27 deletions

View File

@ -224,7 +224,7 @@ namespace kiwano
return 0; return 0;
} }
UInt32 ResourceCache::AddFrameSequence(String const & id, String const& file_path, Int32 cols, Int32 rows) UInt32 ResourceCache::AddFrameSequence(String const & id, String const& file_path, Int32 cols, Int32 rows, Float32 padding_x, Float32 padding_y)
{ {
if (cols <= 0 || rows <= 0) if (cols <= 0 || rows <= 0)
return 0; return 0;
@ -235,23 +235,27 @@ namespace kiwano
Float32 raw_width = raw->GetWidth(); Float32 raw_width = raw->GetWidth();
Float32 raw_height = raw->GetHeight(); Float32 raw_height = raw->GetHeight();
Float32 width = raw_width / cols; Float32 width = (raw_width - (cols - 1) * padding_x) / cols;
Float32 height = raw_height / rows; Float32 height = (raw_height - (rows - 1) * padding_y) / rows;
Vector<FramePtr> frames; Vector<FramePtr> frames;
frames.reserve(rows * cols); frames.reserve(rows * cols);
Float32 dty = 0;
for (Int32 i = 0; i < rows; i++) for (Int32 i = 0; i < rows; i++)
{ {
Float32 dtx = 0;
for (Int32 j = 0; j < cols; j++) for (Int32 j = 0; j < cols; j++)
{ {
FramePtr ptr = new (std::nothrow) Frame(raw->GetTexture()); FramePtr ptr = new (std::nothrow) Frame(raw->GetTexture());
if (ptr) if (ptr)
{ {
ptr->SetCropRect(Rect{ j * width, i * height, (j + 1) * width, (i + 1) * height }); ptr->SetCropRect(Rect{ dtx, dty, dtx + width, dty + height });
frames.push_back(ptr); frames.push_back(ptr);
} }
dtx += (width + padding_x);
} }
dty += (height + padding_y);
} }
FrameSequencePtr fs = new (std::nothrow) FrameSequence(frames); FrameSequencePtr fs = new (std::nothrow) FrameSequence(frames);
@ -309,27 +313,21 @@ namespace kiwano
String path; String path;
}; };
bool LoadTexturesFromData(ResourceCache* loader, GlobalData* gdata, const String* id, const String* type, bool LoadTexturesFromData(ResourceCache* loader, GlobalData* gdata, const String* id, const String* type, const String* file)
const String* file, const Vector<const WChar*>* files, Int32 rows, Int32 cols)
{ {
if (!gdata || !id) return false; if (!gdata || !id) return false;
if (file) if (file && !(*file).empty())
{ {
if (!(*file).empty()) // Simple image
{ return loader->AddFrame(*id, gdata->path + (*file));
if (rows || cols)
{
// Frame slices
return !!loader->AddFrameSequence(*id, gdata->path + (*file), std::max(cols, 1), std::max(rows, 1));
}
else
{
// Simple image
return loader->AddFrame(*id, gdata->path + (*file));
}
}
} }
return false;
}
bool LoadTexturesFromData(ResourceCache* loader, GlobalData* gdata, const String* id, const Vector<const WChar*>* files)
{
if (!gdata || !id) return false;
// Frames // Frames
if (files) if (files)
@ -350,6 +348,30 @@ namespace kiwano
return false; return false;
} }
bool LoadTexturesFromData(ResourceCache* loader, GlobalData* gdata, const String* id, const String* file,
Int32 rows, Int32 cols, Float32 padding_x, Float32 padding_y)
{
if (!gdata || !id) return false;
if (file)
{
if (!(*file).empty())
{
if (rows || cols)
{
// Frame slices
return !!loader->AddFrameSequence(*id, gdata->path + (*file), std::max(cols, 1), std::max(rows, 1), padding_x, padding_y);
}
else
{
// Simple image
return loader->AddFrame(*id, gdata->path + (*file));
}
}
}
return false;
}
bool LoadJsonData(ResourceCache* loader, Json const& json_data) bool LoadJsonData(ResourceCache* loader, Json const& json_data)
{ {
GlobalData global_data; GlobalData global_data;
@ -371,6 +393,15 @@ namespace kiwano
if (image.count(L"rows")) rows = image[L"rows"].as_int(); if (image.count(L"rows")) rows = image[L"rows"].as_int();
if (image.count(L"cols")) cols = image[L"cols"].as_int(); if (image.count(L"cols")) cols = image[L"cols"].as_int();
if (rows || cols)
{
Float32 padding_x = 0, padding_y = 0;
if (image.count(L"padding-x")) padding_x = image[L"padding-x"].get<Float32>();
if (image.count(L"padding-y")) padding_y = image[L"padding-y"].get<Float32>();
return LoadTexturesFromData(loader, &global_data, id, file, rows, cols, padding_x, padding_y);
}
if (image.count(L"files")) if (image.count(L"files"))
{ {
Vector<const WChar*> files; Vector<const WChar*> files;
@ -379,13 +410,11 @@ namespace kiwano
{ {
files.push_back(file.as_string().c_str()); files.push_back(file.as_string().c_str());
} }
if (!LoadTexturesFromData(loader, &global_data, id, type, file, &files, rows, cols)) return LoadTexturesFromData(loader, &global_data, id, &files);
return false;
} }
else else
{ {
if (!LoadTexturesFromData(loader, &global_data, id, type, file, nullptr, rows, cols)) return LoadTexturesFromData(loader, &global_data, id, type, file);
return false;
} }
} }
} }
@ -413,6 +442,16 @@ namespace kiwano
if (auto attr = image->IntAttribute(L"rows")) rows = attr; if (auto attr = image->IntAttribute(L"rows")) rows = attr;
if (auto attr = image->IntAttribute(L"cols")) cols = attr; if (auto attr = image->IntAttribute(L"cols")) cols = attr;
if (rows || cols)
{
Float32 padding_x = 0, padding_y = 0;
if (auto attr = image->FloatAttribute(L"padding-x")) padding_x = attr;
if (auto attr = image->FloatAttribute(L"padding-y")) padding_y = attr;
if (!LoadTexturesFromData(loader, &global_data, &id, &file, rows, cols, padding_x, padding_y))
return false;
}
if (file.empty() && !image->NoChildren()) if (file.empty() && !image->NoChildren())
{ {
Vector<const WChar*> files_arr; Vector<const WChar*> files_arr;
@ -423,12 +462,12 @@ namespace kiwano
files_arr.push_back(path); files_arr.push_back(path);
} }
} }
if (!LoadTexturesFromData(loader, &global_data, &id, &type, &file, &files_arr, rows, cols)) if (!LoadTexturesFromData(loader, &global_data, &id, &files_arr))
return false; return false;
} }
else else
{ {
if (!LoadTexturesFromData(loader, &global_data, &id, &type, &file, nullptr, rows, cols)) if (!LoadTexturesFromData(loader, &global_data, &id, &type, &file))
return false; return false;
} }
} }

View File

@ -57,7 +57,7 @@ namespace kiwano
// 添加序列帧 // 添加序列帧
// 按行列数裁剪图片 // 按行列数裁剪图片
UInt32 AddFrameSequence(String const& id, String const& file_path, Int32 cols, Int32 rows = 1); UInt32 AddFrameSequence(String const& id, String const& file_path, Int32 cols, Int32 rows = 1, Float32 padding_x = 0, Float32 padding_y = 0);
// 添加序列帧 // 添加序列帧
UInt32 AddFrameSequence(String const& id, FrameSequencePtr frames); UInt32 AddFrameSequence(String const& id, FrameSequencePtr frames);