如何在png_set_mem_fn之后访问mem_ptr

How to access mem_ptr after png_set_mem_fn

本文关键字:mem fn 访问 ptr 之后 set png      更新时间:2023-10-16

我有以下回调:

struct my_struct{
    void*(my_alloc)(size_t);
    void (my_free)(void*);
};
void *alloc_fn(png_structp png, png_size_t size){
    my_struct *ptr = static_cast<my_struct*>(/* what here? */);
    return ptr->my_alloc(size);
}
void free_fn(png_structp png, void *mem){
    my_struct *ptr = static_cast<my_struct*>(/* again, madness! */);
    ptr->my_free(mem);
}

,我将像这样使用:

int main(){
    png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
    my_struct mem_fn{std::malloc, std::free};
    png_set_mem_fn(png_ptr, &mem_fun, alloc_fn, free_fn);
    // use png_ptr to load png
}

png_set_mem_fn具有以下原型:

void png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn);

但我不知道如何检索alloc_fnfree_fn内部的mem_ptr

我读过png_get_progressive_ptrpng_get_user_chunk_ptr,这是我在任何文档中看到的唯一合适的函数。但是png_get_progressive_ptr返回回调,而png_get_user_chunk_ptr文件中的用户数据相关。

我到底错过了什么?我应该如何检索mem_fun ?

您需要使用png_get_mem_ptr。这在http://www.libpng.org/pub/png/libpng-manual.txt中有记录。