示例#1
0
文件: cdlua5ctx.c 项目: Vulcanior/IUP
/***************************************************************************\
* CD_IMAGERGB.                                                              *
\***************************************************************************/
static void *cdimagergb_checkdata(lua_State* L, int param)
{
  static char data_s[100] = "";

  if (lua_isstring(L, param))
  {
    const char* str = lua_tostring(L, param);
    strcpy(data_s, str);
  }
  else
  {
    int ret = cdlua_rawchecktype(L, param, "cdBitmap");
    if (ret == 0)
      luaL_argerror(L, param, "must be string, cdBitmap, cdImageRGB or cdImageRGBA");  /* not a user data and not a metatable */

    if (ret == 1)
    {
      cdBitmap* *bitmap_p = (cdBitmap**)luaL_checkudata(L, param, "cdBitmap");
      if (!(*bitmap_p))
        luaL_argerror(L, param, "killed cdBitmap");

      if ((*bitmap_p)->type != CD_RGB && (*bitmap_p)->type != CD_RGBA)
        luaL_argerror(L, param, "bitmap should be of type rgb or rgba");

      if (lua_isnoneornil(L, param+1))
      {
        if ((*bitmap_p)->type == CD_RGBA)
          sprintf(data_s, "%dx%d %p %p %p %p -a", (*bitmap_p)->w, (*bitmap_p)->h,
                                                  cdBitmapGetData(*bitmap_p, CD_IRED), 
                                                  cdBitmapGetData(*bitmap_p, CD_IGREEN), 
                                                  cdBitmapGetData(*bitmap_p, CD_IBLUE), 
                                                  cdBitmapGetData(*bitmap_p, CD_IALPHA));
        else
          sprintf(data_s, "%dx%d %p %p %p", (*bitmap_p)->w, (*bitmap_p)->h,
                                            cdBitmapGetData(*bitmap_p, CD_IRED), 
                                            cdBitmapGetData(*bitmap_p, CD_IGREEN), 
                                            cdBitmapGetData(*bitmap_p, CD_IBLUE));
      }
      else
      {
        double res_f = luaL_checknumber(L, param+1);
        if ((*bitmap_p)->type == CD_RGBA)
          sprintf(data_s, "%dx%d %p %p %p %p -r%g -a", (*bitmap_p)->w, (*bitmap_p)->h,
                                                       cdBitmapGetData(*bitmap_p, CD_IRED), 
                                                       cdBitmapGetData(*bitmap_p, CD_IGREEN), 
                                                       cdBitmapGetData(*bitmap_p, CD_IBLUE), 
                                                       cdBitmapGetData(*bitmap_p, CD_IALPHA), 
                                                       res_f);
        else
          sprintf(data_s, "%dx%d %p %p %p -r%g", (*bitmap_p)->w, (*bitmap_p)->h,
                                                 cdBitmapGetData(*bitmap_p, CD_IRED), 
                                                 cdBitmapGetData(*bitmap_p, CD_IGREEN), 
                                                 cdBitmapGetData(*bitmap_p, CD_IBLUE), 
                                                 res_f);
      }

      return data_s;
    }

    ret = cdlua_rawchecktype(L, param, "cdImageRGB");
    if (ret == 1)
    {
      cdluaImageRGB *imagergb_p = (cdluaImageRGB*) luaL_checkudata(L, param, "cdImageRGB");
      if (!imagergb_p->red)
        luaL_argerror(L, param, "killed cdImageRGB");

      if (lua_isnoneornil(L, param+1))
      {
        sprintf(data_s, "%dx%d %p %p %p", imagergb_p->width, imagergb_p->height,
          imagergb_p->red, imagergb_p->green, imagergb_p->blue);
      }
      else
      {
        double res_f = luaL_checknumber(L, param+1);
        sprintf(data_s, "%dx%d %p %p %p -r%g", imagergb_p->width, imagergb_p->height,
          imagergb_p->red, imagergb_p->green, imagergb_p->blue, res_f);
      }

      return data_s;
    }

    ret = cdlua_rawchecktype(L, param, "cdImageRGBA");
    if (ret == 1)
    {
      cdluaImageRGBA *imagergba_p = (cdluaImageRGBA*) luaL_checkudata(L, param, "cdImageRGBA");
      if (!imagergba_p->red)
        luaL_argerror(L, param, "killed cdImageRGBA");

      if (lua_isnoneornil(L, param+1))
      {
        sprintf(data_s, "%dx%d %p %p %p %p -a", imagergba_p->width, imagergba_p->height,
          imagergba_p->red, imagergba_p->green, imagergba_p->blue, imagergba_p->alpha);
      }
      else
      {
        double res_f = luaL_checknumber(L, param+1);
        sprintf(data_s, "%dx%d %p %p %p %p -r%g -a", imagergba_p->width, imagergba_p->height,
          imagergba_p->red, imagergba_p->green, imagergba_p->blue, imagergba_p->alpha, res_f);
      }

      return data_s;
    }

    luaL_argerror(L, param, "must be string, cdBitmap, cdImageRGB or cdImageRGBA");  /* is a metatable but it is not one of the accepted */
  }

  return data_s;
}
示例#2
0
/***************************************************************************\
* CD_IMAGERGB.                                                              *
\***************************************************************************/
static void *cdimagergb_checkdata(int param)
{
    lua_Object imagergb;
    static char data_s[50];

    imagergb = lua_getparam(param);
    if (lua_isnil(imagergb))
        lua_error("cdCreateCanvas CD_IMAGERGB: data is a NIL imagergb!");

    if (lua_isstring(imagergb))
    {
        char* str = lua_getstring(imagergb);
        strcpy(data_s, str);
    }
    else
    {
        lua_Object res;
        int bitmap_tag = (int)lua_getnumber(lua_getglobal(BITMAP_TAG));

        if (lua_tag(imagergb) == bitmap_tag)
        {
            bitmap_t *imagergb_p;

            imagergb_p = (bitmap_t *) lua_getuserdata(imagergb);
            if (!imagergb_p->image)
                lua_error("cdCreateCanvas CD_IMAGERGB: data is a killed imagergb!");

            if (imagergb_p->image->type != CD_RGB && imagergb_p->image->type != CD_RGBA)
                lua_error("cdCreateCanvas CD_IMAGERGB: bitmap should be of type rgb or rgba!");

            res = lua_getparam(param+1);
            if (res == LUA_NOOBJECT || lua_isnil(res))
            {
                if (imagergb_p->image->type == CD_RGBA)
                    sprintf(data_s, "%dx%d %p %p %p %p -a", imagergb_p->image->w, imagergb_p->image->h,
                            cdBitmapGetData(imagergb_p->image, CD_IRED),
                            cdBitmapGetData(imagergb_p->image, CD_IGREEN),
                            cdBitmapGetData(imagergb_p->image, CD_IBLUE),
                            cdBitmapGetData(imagergb_p->image, CD_IALPHA));
                else
                    sprintf(data_s, "%dx%d %p %p %p", imagergb_p->image->w, imagergb_p->image->h,
                            cdBitmapGetData(imagergb_p->image, CD_IRED),
                            cdBitmapGetData(imagergb_p->image, CD_IGREEN),
                            cdBitmapGetData(imagergb_p->image, CD_IBLUE));
            }
            else
            {
                double res_f = lua_getnumber(res);
                if (imagergb_p->image->type == CD_RGBA)
                    sprintf(data_s, "%dx%d %p %p %p %p -r%g -a", imagergb_p->image->w, imagergb_p->image->h,
                            cdBitmapGetData(imagergb_p->image, CD_IRED),
                            cdBitmapGetData(imagergb_p->image, CD_IGREEN),
                            cdBitmapGetData(imagergb_p->image, CD_IBLUE),
                            cdBitmapGetData(imagergb_p->image, CD_IALPHA),
                            res_f);
                else
                    sprintf(data_s, "%dx%d %p %p %p -r%g", imagergb_p->image->w, imagergb_p->image->h,
                            cdBitmapGetData(imagergb_p->image, CD_IRED),
                            cdBitmapGetData(imagergb_p->image, CD_IGREEN),
                            cdBitmapGetData(imagergb_p->image, CD_IBLUE),
                            res_f);
            }
        }
        else
        {
            imagergb_t *imagergb_p;
            int imagergb_tag = (int)lua_getnumber(lua_getglobal(IMAGERGB_TAG));

            if (lua_tag(imagergb) != imagergb_tag)
            {
                imagergba_t *imagergba_p;
                int imagergba_tag = (int)lua_getnumber(lua_getglobal(IMAGERGBA_TAG));
                if (lua_tag(imagergb) != imagergba_tag)
                    lua_error("cdCreateCanvas CD_IMAGERGB: data should be of type imagergb_tag or imagergba_tag!");

                imagergba_p = (imagergba_t *) lua_getuserdata(imagergb);
                if (!(imagergba_p->red && imagergba_p->green && imagergba_p->blue))
                    lua_error("cdCreateCanvas CD_IMAGERGB: data is a killed imagergba!");

                res = lua_getparam(param+1);
                if (res == LUA_NOOBJECT || lua_isnil(res))
                {
                    sprintf(data_s, "%dx%d %p %p %p", imagergba_p->width, imagergba_p->height,
                            imagergba_p->red, imagergba_p->green, imagergba_p->blue);
                }
                else
                {
                    double res_f = lua_getnumber(res);
                    sprintf(data_s, "%dx%d %p %p %p -r%g", imagergba_p->width, imagergba_p->height,
                            imagergba_p->red, imagergba_p->green, imagergba_p->blue, res_f);
                }

                return data_s;
            }

            imagergb_p = (imagergb_t *) lua_getuserdata(imagergb);
            if (!(imagergb_p->red && imagergb_p->green && imagergb_p->blue))
                lua_error("cdCreateCanvas CD_IMAGERGB: data is a killed imagergb!");

            res = lua_getparam(param+1);
            if (res == LUA_NOOBJECT || lua_isnil(res))
            {
                sprintf(data_s, "%dx%d %p %p %p", imagergb_p->width, imagergb_p->height,
                        imagergb_p->red, imagergb_p->green, imagergb_p->blue);
            }
            else
            {
                double res_f = lua_getnumber(res);
                sprintf(data_s, "%dx%d %p %p %p -r%g", imagergb_p->width, imagergb_p->height,
                        imagergb_p->red, imagergb_p->green, imagergb_p->blue, res_f);
            }
        }
    }

    return data_s;
}