/*********************************************************************** * FXRuby -- the Ruby language bindings for the FOX GUI toolkit. * Copyright (c) 2001-2009 by Lyle Johnson. All Rights Reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For further information please contact the author by e-mail * at "lyle@lylejohnson.name". ***********************************************************************/ /// Image rendering hints enum { IMAGE_KEEP = 0x00000001, /// Keep pixel data in client IMAGE_OWNED = 0x00000002, /// Pixel data is owned by image IMAGE_DITHER = 0, /// Dither image to look better IMAGE_NEAREST = 0x00000004, /// Turn off dithering and map to nearest color IMAGE_OPAQUE = 0x00000008, /// Force opaque background IMAGE_ALPHACOLOR = 0x00000010, /// Override transparancy color IMAGE_SHMI = 0x00000020, /// Using shared memory image IMAGE_SHMP = 0x00000040, /// Using shared memory pixmap IMAGE_ALPHAGUESS = 0x00000080 /// Guess transparency color from corners }; %rename("hasAlpha?") FXImage::hasAlpha() const; /** * An Image is a rectangular array of pixels. It supports two representations * of these pixels: a client-side pixel buffer which is stored as an array of * FXColor, and a server-side pixmap which is stored in an organization directly * compatible with the screen, for fast drawing onto the device. * The server-side representation is not directly accessible from the current * process as it lives in the process of the X Server or GDI. */ class FXImage : public FXDrawable { public: %extend { /** * Create an image. If a client-side pixel buffer has been specified, * the image does not own the pixel buffer unless the IMAGE_OWNED flag is * set. If the IMAGE_OWNED flag is set but a NULL pixel buffer is * passed, a pixel buffer will be automatically created and will be owned * by the image. The flags IMAGE_SHMI and IMAGE_SHMP may be specified for * large images to instruct render() to use shared memory to communicate * with the server. */ FXImage(FXApp* a,VALUE ary=Qnil,FXuint opts=0,FXint w=1,FXint h=1){ FXColor* pix=0; if(!NIL_P(ary)){ Check_Type(ary,T_ARRAY); if(FXMALLOC(&pix,FXColor,RARRAY_LEN(ary))){ for(long i=0; i<RARRAY_LEN(ary); i++){ pix[i]=static_cast<FXColor>(NUM2UINT(rb_ary_entry(ary,i))); } } opts&=IMAGE_OWNED; } return new FXRbImage(a,pix,opts,w,h); } /// To get to the pixel data FXMemoryBuffer *getData() const { if(self->getData()){ return new FXMemoryBuffer(self->getData(),self->getWidth()*self->getHeight()); } else{ return 0; } } } /// To get to the option flags FXuint getOptions() const; /// Change options void setOptions(FXuint opts); %extend { /** * Populate the image with new pixel data of the same size; it will assume * ownership of the pixel data if image IMAGE_OWNED option is passed. * The server-side representation of the image, if it exists, is not updated. * This can be done by calling render(). */ void setData(VALUE ary,FXuint opts=0,VALUE w=Qnil,VALUE h=Qnil){ FXColor* pix=0; Check_Type(ary,T_ARRAY); if( ( (NIL_P(w) || NIL_P(h)) && self->getWidth()*self->getHeight() != RARRAY_LEN(ary)) || (!(NIL_P(w) || NIL_P(h)) && NUM2UINT(w)*NUM2UINT(h) != RARRAY_LEN(ary))){ rb_raise( rb_eArgError, "array size does not match image size" ); } if(FXMALLOC(&pix,FXColor,RARRAY_LEN(ary))){ for(long i=0; i<RARRAY_LEN(ary); i++){ pix[i]=static_cast<FXColor>(NUM2UINT(rb_ary_entry(ary,i))); } } opts|=IMAGE_OWNED; if( NIL_P(w) || NIL_P(h) ){ self->setData(pix,opts); }else{ self->setData(pix,opts,NUM2UINT(w),NUM2UINT(h)); } } } /// Get pixel at x,y FXColor getPixel(FXint x,FXint y) const; /// Change pixel at x,y void setPixel(FXint x,FXint y,FXColor color); /// Scan the image and return FALSE if fully opaque bool hasAlpha() const; /// Destructor virtual ~FXImage(); }; DECLARE_FXOBJECT_VIRTUALS(FXImage) DECLARE_FXID_VIRTUALS(FXImage) DECLARE_FXDRAWABLE_VIRTUALS(FXImage) DECLARE_FXIMAGE_VIRTUALS(FXImage) %{ static swig_type_info *FXImage_dynamic_cast(void **ptr) { FXImage **ppImage = reinterpret_cast<FXImage **>(ptr); FXBMPImage *pBMPImage=dynamic_cast<FXBMPImage*>(*ppImage); if(pBMPImage){ *ptr=reinterpret_cast<void*>(pBMPImage); return SWIG_TypeQuery("FXBMPImage *"); } FXGIFImage *pGIFImage=dynamic_cast<FXGIFImage*>(*ppImage); if(pGIFImage){ *ptr=reinterpret_cast<void*>(pGIFImage); return SWIG_TypeQuery("FXGIFImage *"); } FXICOImage *pICOImage=dynamic_cast<FXICOImage*>(*ppImage); if(pICOImage){ *ptr=reinterpret_cast<void*>(pICOImage); return SWIG_TypeQuery("FXICOImage *"); } FXIcon *pIcon=dynamic_cast<FXIcon*>(*ppImage); if(pIcon){ *ptr=reinterpret_cast<void*>(pIcon); return SWIG_TypeQuery("FXIcon *"); } FXJPGImage *pJPGImage=dynamic_cast<FXJPGImage*>(*ppImage); if(pJPGImage){ *ptr=reinterpret_cast<void*>(pJPGImage); return SWIG_TypeQuery("FXJPGImage *"); } FXPCXImage *pPCXImage=dynamic_cast<FXPCXImage*>(*ppImage); if(pPCXImage){ *ptr=reinterpret_cast<void*>(pPCXImage); return SWIG_TypeQuery("FXPCXImage *"); } FXPNGImage *pPNGImage=dynamic_cast<FXPNGImage*>(*ppImage); if(pPNGImage){ *ptr=reinterpret_cast<void*>(pPNGImage); return SWIG_TypeQuery("FXPNGImage *"); } FXPPMImage *pPPMImage=dynamic_cast<FXPPMImage*>(*ppImage); if(pPPMImage){ *ptr=reinterpret_cast<void*>(pPPMImage); return SWIG_TypeQuery("FXPPMImage *"); } FXRGBImage *pRGBImage=dynamic_cast<FXRGBImage*>(*ppImage); if(pRGBImage){ *ptr=reinterpret_cast<void*>(pRGBImage); return SWIG_TypeQuery("FXRGBImage *"); } FXTGAImage *pTGAImage=dynamic_cast<FXTGAImage*>(*ppImage); if(pTGAImage){ *ptr=reinterpret_cast<void*>(pTGAImage); return SWIG_TypeQuery("FXTGAImage *"); } FXTIFImage *pTIFImage=dynamic_cast<FXTIFImage*>(*ppImage); if(pTIFImage){ *ptr=reinterpret_cast<void*>(pTIFImage); return SWIG_TypeQuery("FXTIFImage *"); } FXXBMImage *pXBMImage=dynamic_cast<FXXBMImage*>(*ppImage); if(pXBMImage){ *ptr=reinterpret_cast<void*>(pXBMImage); return SWIG_TypeQuery("FXXBMImage *"); } FXXPMImage *pXPMImage=dynamic_cast<FXXPMImage*>(*ppImage); if(pXPMImage){ *ptr=reinterpret_cast<void*>(pXPMImage); return SWIG_TypeQuery("FXXPMImage *"); } return 0; } %} DYNAMIC_CAST(SWIGTYPE_p_FXImage, FXImage_dynamic_cast);