litehtml/containers/cairo/cairo_images_cache.h
faywong 270b7389d1 Fix build error caused by non-const copy ctor of cairo_surface_wrapper
Detailed error context: 
containers/cairo/cairo_images_cache.h:64:11: note: in instantiation of template class 'std::__value_type<std::string, cairo_surface_wrapper>' requested here
                if(iter != m_images.end())

MacOSX.platform/Developer/SDKs/MacOSX13.1.sdk/usr/include/c++/v1/__utility/pair.h:54:5: error: the parameter for this explicitly-defaulted copy constructor is const, but a member or base requires it to be non-const
    pair(pair const&) = default;
2024-03-27 17:17:50 +03:00

92 lines
1.9 KiB
C++

#ifndef LITEHTML_CAIRO_IMAGES_CACHE_H
#define LITEHTML_CAIRO_IMAGES_CACHE_H
#include <mutex>
#include <map>
#include <string>
#include <cairo.h>
class cairo_surface_wrapper
{
cairo_surface_t* surface;
public:
cairo_surface_wrapper() : surface(nullptr) {}
cairo_surface_wrapper(const cairo_surface_wrapper& v) : surface(v.surface)
{
if(v.surface)
{
surface = cairo_surface_reference(v.surface);
}
}
explicit cairo_surface_wrapper(cairo_surface_t* v) : surface(v) {}
cairo_surface_wrapper(cairo_surface_wrapper&& v) noexcept
{
surface = v.surface;
v.surface = nullptr;
}
cairo_surface_wrapper& operator=(const cairo_surface_wrapper& v)
{
if(surface != v.surface)
{
if(surface)
{
cairo_surface_destroy(surface);
}
surface = cairo_surface_reference(v.surface);
}
return *this;
}
~cairo_surface_wrapper()
{
if(surface)
{
cairo_surface_destroy(surface);
}
}
cairo_surface_t* get() { return cairo_surface_reference(surface); }
};
class cairo_images_cache
{
std::mutex m_mutex;
std::map<std::string, cairo_surface_wrapper> m_images;
public:
void add_image(const std::string& url, cairo_surface_t* image)
{
std::unique_lock<std::mutex> lock(m_mutex);
m_images[url] = cairo_surface_wrapper(image);
}
cairo_surface_t* get_image(const std::string& url)
{
std::unique_lock<std::mutex> lock(m_mutex);
auto iter = m_images.find(url);
if(iter != m_images.end())
{
return iter->second.get();
}
return nullptr;
}
bool reserve(const std::string& url)
{
std::unique_lock<std::mutex> lock(m_mutex);
auto iter = m_images.find(url);
if (iter == m_images.end())
{
m_images[url] = cairo_surface_wrapper();
return true;
}
return false;
}
bool exists(const std::string& url)
{
std::unique_lock<std::mutex> lock(m_mutex);
auto iter = m_images.find(url);
return iter != m_images.end();
}
};
#endif //LITEHTML_CAIRO_IMAGES_CACHE_H