【问题标题】:How to access mem_ptr after png_set_mem_fn如何在 png_set_mem_fn 之后访问 mem_ptr
【发布时间】:2015-08-09 12:35:36
【问题描述】:

我有以下回调:

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

【问题讨论】:

  • “为什么在 C++ 中需要函数指针?”这是一个大胆的声明。 my_struct 仅用于此问题中的示例,但我的 实际 代码在语义上是等效的。
  • png_get_mem_ptr 看起来很相关。
  • @JoachimPileborg 不,我的意思是mem_ptr,就像png_set_mem_fn 的函数原型一样。
  • @AlanStokes 这应该是一个答案,我不知道我是怎么在文档中错过的!

标签: c++ libpng


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 2013-09-16
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多