📄 lua_str.c
字号:
#include <allegro.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#include <lua_aleg.h>
#include <lua_pal.h>
#include <xpackfile.h>
#include <algif.h>
#include <string.h>
#include <lua_str.h>
//------------------------------------------------------------------------------------------
#define return_bitmap()\
if (bmp==NULL)\
{\
lua_pushnil(L);\
return 1;\
}\
else\
{\
ad= (AUD*) lua_newuserdata (L, sizeof(AUD));\
if (!ad)\
{destroy_bitmap(bmp);return 0;}\
luaL_getmetatable(L,"allegro_meta");\
lua_setmetatable(L,-2);\
ad->DataType=AL_BITMAP;\
ad->DataPtr=bmp;\
return 1;}
#define get_bitmap_userdata()\
AUD* au_bitmap = (AUD*) lua_touserdata (L,1);\
BITMAP* bitmap;\
if (au_bitmap && au_bitmap->DataType==AL_BITMAP) bitmap = (BITMAP*) au_bitmap->DataPtr;\
else bitmap = screen;
//------------------------------------------------------------------------------------------
enum image_format_types {IMG_FORMAT_BMP=0,IMG_FORMAT_PCX,IMG_FORMAT_TGA,IMG_FORMAT_GIF,IMG_FORMAT_END};
char* img_format_strings[]={ "BMP", "PCX", "TGA", "GIF",NULL};
//------------------------------------------------------------------------------------------
char* get_image_format_str(lua_State* L,int img_format)
{
if (img_format>=IMG_FORMAT_BMP && img_format<IMG_FORMAT_END)
{
return img_format_strings[img_format];
}
else
{
lua_pushstring(L,"Invalid image format type.");
lua_error (L);
return NULL;
}
}
//------------------------------------------------------------------------------------------
int get_image_format_type(lua_State* L,char* type)
{
if (type==NULL) return IMG_FORMAT_BMP;
if (!strnicmp(type,"GIF",3)) return IMG_FORMAT_GIF;
if (!strnicmp(type,"PCX",3)) return IMG_FORMAT_PCX;
if (!strnicmp(type,"TGA",3)) return IMG_FORMAT_TGA;
if (!strnicmp(type,"BMP",3)) return IMG_FORMAT_BMP;
lua_pushstring(L,"Invalid image format type.");
lua_error (L);
return -1;
}
//------------------------------------------------------------------------------------------
// str = bmp_to_str(type,bmp,pal)
// where type= "PCX" or "GIF" or "BMP" or "TGA"
int l_bmp_to_str(lua_State* L)
{
AUD* au_bitmap;
BITMAP* bitmap= NULL;
PACKFILE* f;
int file_type= 0;
char* file_type_str= NULL;
void* output_string= NULL;
long output_size= 0;
PALETTE palette;
int result;
file_type = get_image_format_type( L , (char*) lua_tostring(L,1) ) ;
if (lua_isnil (L,2))
{
bitmap=screen;
}
else
{
au_bitmap = (AUD*) lua_touserdata (L,2);
if (au_bitmap && au_bitmap->DataType==AL_BITMAP) bitmap = (BITMAP*) au_bitmap->DataPtr;
}
if (bitmap==NULL) return 0;
if (!ConvertLuaToPalette(L,3,palette,0,255))
{
get_palette(palette);
}
f = mem_fopen_write_buffer(&output_string,&output_size);
if (f==NULL) return 0;
switch(file_type)
{
case IMG_FORMAT_GIF: result=save_gif_pf(f, bitmap, palette); break;
case IMG_FORMAT_PCX: result=save_pcx_pf(f, bitmap, palette); break;
case IMG_FORMAT_TGA: result=save_tga_pf(f, bitmap, palette); break;
default: result=save_bmp_pf(f, bitmap, palette); break;
}
pack_fclose(f);
lua_pushlstring ( L, (const char*) output_string, output_size );
return 1;
}
//------------------------------------------------------------------------------------------
// bmp = str_to_bmp("GIF","GIF84a......")
static int l_str_to_bmp(lua_State *L)
{
AUD* ad= NULL;
BITMAP* bmp= NULL;
size_t length= 0;
int file_type= get_image_format_type(L,(char*) lua_tostring(L,1) ) ;
char* s= (char*) lua_tolstring(L,2,&length);
PACKFILE* f= mem_fopen_read_buffer(s,length);
PALETTE pal;
if (f==NULL) return 0;
switch(file_type)
{
case IMG_FORMAT_GIF: bmp = load_gif_pf(f,pal); break;
case IMG_FORMAT_PCX: bmp = load_pcx_pf(f,pal); break;
case IMG_FORMAT_TGA: bmp = load_tga_pf(f,pal); break;
default: bmp = load_bmp_pf(f,pal); break;
}
if (bmp==NULL)
{
pack_fclose(f);
return 0;
}
pack_fclose(f);
//return bitmap
ad= (AUD*) lua_newuserdata (L, sizeof(AUD));\
if (!ad)
{
destroy_bitmap(bmp);
return 0;
}
else
{
luaL_getmetatable(L,"allegro_meta");
lua_setmetatable(L,-2);
ad->DataType=AL_BITMAP;
ad->DataPtr=bmp;
ConvertPaletteToLua(L,pal,0,255,0);
return 2;
}
}
//------------------------------------------------------------------------------------------
static const luaL_Reg image_string_lib[] = {
{"str_to_bmp", l_str_to_bmp},
{"bmp_to_str", l_bmp_to_str},
{NULL, NULL}
};
//------------------------------------------------------------------------------------------
int luaopen_image_string(lua_State* L)
{
luaL_register(L, "allegro", image_string_lib);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -