Exemple #1
0
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);
}
Exemple #2
0
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;
}