static void extract(pak_file_t* pak, const char* fname) { assert(pak); assert(fname); LOGD("debug fname=%s", fname); int size = pak_file_seek(pak, fname); if(size == 0) { return; } FILE* f = fopen(fname, "w"); if(f == 0) { LOGE("fopen %s failed", fname); return; } unsigned char buf[4096]; while(size > 0) { int bytes = (size > 4096) ? 4096 : size; if(pak_file_read(pak, buf, bytes, 1) != 1) { break; } if(fwrite(buf, bytes, 1, f) != 1) { LOGE("fwrite %s failed", fname); break; } size -= bytes; } fclose(f); }
a3d_spriteTex_t* a3d_spriteTex_new(const char* fname, const char* resource) { assert(fname); assert(resource); LOGD("debug fname=%s, resource=%s", fname, resource); a3d_spriteTex_t* self = (a3d_spriteTex_t*) malloc(sizeof(a3d_spriteTex_t)); if(self == NULL) { LOGE("malloc failed"); return NULL; } pak_file_t* pak = NULL; texgz_tex_t* tex = NULL; if(fname[0] == '$') { pak = pak_file_open(resource, PAK_FLAG_READ); if(pak) { const char* key = &(fname[1]); int size = pak_file_seek(pak, key); if(size > 0) { tex = texgz_tex_importf(pak->f, size); } else { LOGE("invalid fname=%s", fname); } pak_file_close(&pak); } } else { tex = texgz_tex_import(fname); } if(tex == NULL) { goto fail_tex; } // load tex glGenTextures(1, &self->id_tex); glBindTexture(GL_TEXTURE_2D, self->id_tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, tex->format, tex->stride, tex->vstride, 0, tex->format, tex->type, tex->pixels); // no longer needed texgz_tex_delete(&tex); strncpy(self->fname, fname, 256); self->fname[255] = '\0'; self->ref_count = 0; // success return self; // failure fail_tex: free(self); return NULL; }