try to decode the image header as soon as some data is available

This commit is contained in:
2019-09-26 18:34:33 +02:00
parent 8b179260fb
commit 13b2f6eb07
4 changed files with 16 additions and 5 deletions

View File

@@ -179,9 +179,8 @@ bool Asset::open_url(const std::string& url, std::function<bool(float)> progress
close();
LOG("download %s", url.c_str());
m_current_url = url;
std::vector<uint8_t> data;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &tmp_data);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_data_handler_asset);
#ifdef __ANDROID__
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
@@ -200,9 +199,10 @@ bool Asset::open_url(const std::string& url, std::function<bool(float)> progress
{
if (m_data)
delete m_data;
m_data = new uint8_t[data.size()];
std::copy(data.begin(), data.end(), m_data);
m_len = data.size();
m_data = new uint8_t[tmp_data.size()];
std::copy(tmp_data.begin(), tmp_data.end(), m_data);
m_len = tmp_data.size();
tmp_data.clear();
return true;
}
}

View File

@@ -17,6 +17,7 @@ public:
bool m_stop_async = false;
std::function<bool(float)> on_progress;
std::future<bool> remote_future;
std::vector<uint8_t> tmp_data;
std::string m_current_path;
std::string m_current_url;

View File

@@ -135,9 +135,18 @@ bool NodeImage::set_image(const std::string& path)
void NodeImage::load_url(const std::string& url)
{
m_remote_header_decoded = false;
m_remote_asset = std::make_shared<Asset>();
m_remote_asset->open_url_async(url,
[this] (float progress) -> bool {
int w, h, c;
if (!m_remote_header_decoded &&
stbi_info_from_memory(m_remote_asset->tmp_data.data(), m_remote_asset->tmp_data.size(), &w, &h, &c))
{
if (m_autosize)
SetAspectRatio((float)w / (float)h);
m_remote_header_decoded = true;
}
return true;
},
[this] (bool success) {

View File

@@ -21,6 +21,7 @@ public:
uint16_t m_tex_id;
std::shared_ptr<Asset> m_remote_asset;
std::shared_ptr<Texture2D> m_remote_texture;
bool m_remote_header_decoded = false;
static void static_init();
virtual Node* clone_instantiate() const override;
virtual void clone_copy(Node* dest) const override;