Как GLFWimage управляет данными? - PullRequest
0 голосов
/ 29 сентября 2019

Я нашел эту тему: GLFW SetWindowIcon Меня удивило, как класс GLFWimage управляет своими символами * пикселей. Сам класс не имеет конструктора, поэтому он не может сам создать массив, содержащий данные изображения. Конечно, я могу просто скопировать указатель на предварительно созданный массив данных, но пример в теме должен освободить данные после загрузки. Я предполагаю, что glfwSetWindowIcon просто копирует данные из указателя GLFWimage. Честно говоря, я не вижу, что освобождается в виде значков. [0] .pixels просто получает указатель от функции. Я написал себе класс, который загружает изображение. Я устанавливаю значение GLFWimage для данных внутри этого класса. Чем я позвонил: glfwSetWindowIcon. Затем я изменил данные внутри. Значок остается в строке меню и в верхней панели окна. Меня это еще больше сбивает с толку, поскольку в opengl так много противоречивых ответов об освобождении данных. Вот класс, который я написал. Помните, что файл, отправленный его конструктору, должен быть предварительно обработан для необработанных данных:

class icon_gl{
public:
int width;
int height;
unsigned char * pixels;
bool failed;
int file_size;

icon_gl(int set_width, int set_height, string name){
    width = set_width;
    height = set_height;
    failed = 1;
    pixels = new unsigned char[set_width*set_height*4];
    ifstream file(name.c_str(), ios::binary);
    if(file.is_open()){
        file.seekg(0, ios::end);
        file_size = file.tellg();
    }
    if(file_size == set_width*set_height*4){
        failed =0;
        file.seekg(0, ios::beg);
        file.read((char*)pixels, set_width*set_height*4);
    }
}
~icon_gl(){
    delete[] pixels;
}
void import(GLFWimage * img_gl){
    img_gl->width=width;
    img_gl->height=height;
    img_gl->pixels = pixels;
}
};

Вот главное:

icon_gl icon32(32, 32, "iconimage.i");
GLFWimage ico_image;
icon32.import(&ico_image);
glfwSetWindowIcon(window, 1, &ico_image);

И поведение &&:

for (int i=0; i<32*32*4; i++)icon32.pixels[i] = 255;

Вопросы: Как opengl управляет своими данными? Может быть, вы могли бы дать мне несколько хороших ссылок? Я ищу весь объем, а не один случай. Как работает SOIL_free_image_data? Это просто ошибка или каким-то образом редактировать параметры указателя (длина данных)? Разве управление длиной указателя не относится к объему работы компилятора?

...