⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lua_str.c

📁 lua脚本语言调用allegro游戏程序库的接口-跨平台
💻 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 + -