farbfeld.c

#ifdef LIL_USE_FARBFELD
#ifdef _WIN32
#include <winsock2.h>
#else
#include <arpa/inet.h>
#endif

#include "inc.h"

LUAFUNC(importFarbfeld){
	size_t len;
	const char* data = lua_tolstring(L, 1, &len);
	if(len < 18)
		return 0;
	const uint32_t w = ntohl(*((uint32_t*)(data+8+0)));
	const uint32_t h = ntohl(*((uint32_t*)(data+8+4)));
	if(w + h < 2)
		return 0;
	if((w * h * 4 * 2) + 16 > len)
		return 0;
	const lil_Image* img = lil_newImage(L, w, h);
	if(!img)
		return 0;
	#pragma omp parallel for
	for(size_t o = 0; o < img->w * img->h; o++){
		#define chan(i) img->d[o].arr[i] = data[((o*8)+((i)*2))+16]
		chan(0);
		chan(1);
		chan(2);
		chan(3);
		#undef chan
	}
	lil_pushImage(L, img);
	return 1;
}

LUAFUNC(exportFarbfeld){
	const lil_Image* img = lil_getImage(L, 1);
	const size_t len = 16 + (img->w * img->h * 4 * 2);
	unsigned char* data = malloc(len);
	memcpy(data, "farbfeld", 8);
	*(uint32_t*)(data+8) = htonl(img->w);
	*(uint32_t*)(data+12) = htonl(img->h);
	uint8_t* dv = (uint8_t*)&(data[16]);
	#pragma omp parallel for
	for(size_t o = 0; o < img->w * img->h; o++){
		if(img->d[o].a){
			#define chan(i) dv[(o*8)+((i)*2)+0] = dv[(o*8)+((i)*2)+1] = img->d[o].arr[i]
			chan(0);
			chan(1);
			chan(2);
			chan(3);
			#undef pix
		} else {
			#if INTPTR_MAX == INT64_MAX
			*((uint64_t*)&dv[o * 8]) = 0;
			#else
			*((uint32_t*)&dv[o * 8])       = 0;
			*((uint32_t*)&dv[(o * 8) + 4]) = 0;
			#endif
		}
	}
	lua_pushlstring(L, (const char*)data, len);
	free(data);
	return 1;
}

#endif
generated by LDoc 1.4.6 Last updated 2023-04-13 13:58:34