Adam Butler wrote:
> Hello,
> 
> Sorry accidentally sent that last message without finishing it.
> 
> Freevo worked in the same system but its not really the same because I 
> upgraded ubuntu to fiesty, which updated heaps of packages and probably has a 
> newer version of python. I seem to remember finding freevo in the 2.4 and 2.5 
> site patches folders which explains why I had to re-install it after I 
> upgraded. Maybe I can force freevo and kaa,etc to use python 2.4 or maybe try 
> getting the pygame that was in ubuntu edgy.
> 
> I think the patch was for a different version of pygame and I am not sure how 
> to apply patches, but I manually added the changes where required.
> After applying the changes in the patch freevo runs but when I look at a 
> folder with an image associated I now get freevo crash with the below error.
> 
> I attached the image.c I updated in pygame if its any help

You patched image looks fine.

BTW all you need to do is:
cd /path/to/pygame-1.7release
patch -Np0 -i /path/to/patch

The blurr skin should work fine.

You can add the line to skin_utils.py:
print 'image is "%s"' % image
This may show what image is causing the crash, I suspect that it is None

Index: src/skins/main/skin_utils.py
===================================================================
--- src/skins/main/skin_utils.py        (revision 9565)
+++ src/skins/main/skin_utils.py        (working copy)
@@ -46,6 +46,7 @@

 def pygamesurface_imlib2_scale(image, newsize):

+    print 'image is "%s"' % image
     buf = pygame.image.tostring(image, 'RGBA')
     im2 = imlib2.new(image.get_size(), buf)
     scaled_im2 = im2.scale(newsize)

What you can sensibly try is to grab a copy of freevo from the svn
repository and install it, you can always re-install the old one later.

Duncan

> ***** Imlib2 Developer Warning ***** :
>         This program is calling the Imlib call:
> 
>         imlib_image_set_has_alpha();
> 
>         With the parameter:
> 
>         image
> 
>         being NULL. Please fix your program.
> Traceback (most recent call last):
>   File "/usr/lib/python2.5/site-packages/freevo/main.py", line 290, in 
> eventhandler
>     app.eventhandler(event)
>   File "/usr/lib/python2.5/site-packages/freevo/menu.py", line 673, in 
> eventhandler
>     action( arg=arg, menuw=self )
>   File "/usr/lib/python2.5/site-packages/freevo/directory.py", line 477, in 
> cwd
>     self.check_password_and_build(arg=None, menuw=menuw
>  File "/usr/lib/python2.5/site-packages/freevo/directory.py", line 532, in 
> check_password_and_build
>     self.build(arg=arg, menuw=menuw)
>   File "/usr/lib/python2.5/site-packages/freevo/directory.py", line 786, in 
> build
>     menuw.pushmenu(item_menu)
>   File "/usr/lib/python2.5/site-packages/freevo/menu.py", line 378, in 
> pushmenu
>     self.refresh()
>   File "/usr/lib/python2.5/site-packages/freevo/menu.py", line 406, in refresh
>     skin.draw('menu', self, self.menustack[-1])
>   File "/usr/lib/python2.5/site-packages/freevo/skins/main/main.py", line 
> 526, in draw
>     a.draw(settings, object, menu, style, type, self.force_redraw)
>   File "/usr/lib/python2.5/site-packages/freevo/skins/main/area.py", line 
> 194, in draw
>     self.update_content()
>   File "/usr/lib/python2.5/site-packages/freevo/skins/main/view_area.py", 
> line 107, in update_content
>     image, i_w, i_h = format_image(self.settings, item, width, height, 0, 
> self.xml_settings.anamorphic)
>   File "/usr/lib/python2.5/site-packages/freevo/skins/main/skin_utils.py", 
> line 187, in format_image
>     cimage = pygamesurface_imlib2_scale(image, (width, height))
>   File "/usr/lib/python2.5/site-packages/freevo/skins/main/skin_utils.py", 
> line 50, in pygamesurface_imlib2_scale
>     im2 = imlib2.new(image.get_size(), buf)
>   File "/usr/lib/python2.5/site-packages/kaa/imlib2/__init__.py", line 114, 
> in new
>     return Image(_Imlib2.create(size, bytes, from_format, copy))
> RuntimeError: Failed to create image
> Exception exceptions.ReferenceError: ReferenceError('weakly-referenced object 
> no longer exists',) in <bound method Connection.__del__ of 
> <sqlite.main.Connection instance at 0x217e3b0>> ignore
> 
> 
> 
> ----- Original Message ----
> From: Jason Tackaberry <[EMAIL PROTECTED]>
> To: freevo-users@lists.sourceforge.net
> Sent: Wednesday, 2 May, 2007 8:27:49 PM
> Subject: Re: [Freevo-users] problems after fiesty or kaa upgrade
> 
> On 2007-05-02 15:19, Adam Butler wrote:
>> Rolling back kaa didn´t help, freevo used to work for me so its quite
>> annoying that its not now (I almost finished downloading all my album
>> covers). I notice that pyGame is a part of ubuntu so I could try
>> uninstalling and getting the latest and applying your patch as you
>> suggest.
> 
> Freevo used to work on the same system you're using now?  (The one with
> Python 2.5?)  Or was python recently upgraded?
> 
> 
>> In the trace it mentions skins, I was using a non-standard skin, I´d
>> like to try changing this to the default - where is this setting stored?
> 
> In the SKIN_XML_FILE variable in local_config.py.  I guess you could try
> blurr.
> 
> 
>> I should have looked at the stack trace I posted, it says
>> python2.5/site-packages, I think that last stack trace was after I
>> tried fixing the code, not that I really knew what I was doing. below
>> is the actual trace after I re-unzipped the freevo source and reinstalled.
>> [...]
>> File "/usr/lib/python2.5/site-packages/freevo/skins/main/area.py",
>> line 571, in __draw_background__
>> (bg.width,bg.height), 'RGBA')
>> ValueError: String length does not equal format and resolution size
> 
> Yes this is still the pygame bug (with python 2.5).
> 
> 
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> Freevo-users mailing list
> Freevo-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/freevo-users
> 
> 
> 
> 
> 
>       ___________________________________________________________
> Yahoo! Answers - Got a question? Someone out there knows the answer. Try it
> now.
> http://uk.answers.yahoo.com/ 
> 
> 
> ------------------------------------------------------------------------
> 
> /*
>     pygame - Python Game Library
>     Copyright (C) 2000-2001  Pete Shinners
> 
>     This library is free software; you can redistribute it and/or
>     modify it under the terms of the GNU Library General Public
>     License as published by the Free Software Foundation; either
>     version 2 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
>     Library General Public License for more details.
> 
>     You should have received a copy of the GNU Library General Public
>     License along with this library; if not, write to the Free
>     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
> 
>     Pete Shinners
>     [EMAIL PROTECTED]
> */
> 
> /*
>  *  image module for pygame
>  */
> #include "pygame.h"
> 
> static int is_extended = 0;
> static int SaveTGA(SDL_Surface *surface, char *file, int rle);
> static int SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle);
> static SDL_Surface* opengltosdl(void);
> 
> 
> #define DATAROW(data, row, width, height, flipped) \
>                       ((flipped) ? (((char*)data)+(height-row-1)*width) : 
> (((char*)data)+row*width))
> 
> 
>     /*DOC*/ static char doc_load[] =
>     /*DOC*/    "pygame.image.load(file, [namehint]) -> Surface\n"
>     /*DOC*/    "load an image to a new Surface\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "This will load an image into a new surface. You can pass it\n"
>     /*DOC*/    "either a filename, or a python file-like object to load the 
> image\n"
>     /*DOC*/    "from. If you pass a file-like object that isn't actually a 
> file\n"
>     /*DOC*/    "(like the StringIO class), then you might want to also pass\n"
>     /*DOC*/    "either the filename or extension as the namehint string. 
> The\n"
>     /*DOC*/    "namehint can help the loader determine the filetype.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "If pygame was installed without SDL_image support, the load\n"
>     /*DOC*/    "will only work with BMP images. You can test if SDL_image 
> is\n"
>     /*DOC*/    "available with the get_extended() function. These extended\n"
>     /*DOC*/    "file formats usually include GIF, PNG, JPG, PCX, TGA, and 
> more.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "If the image format supports colorkeys and pixel alphas, 
> the\n"
>     /*DOC*/    "load() function will properly load and configure these 
> types\n"
>     /*DOC*/    "of transparency.\n"
>     /*DOC*/ ;
> 
> static PyObject* image_load_basic(PyObject* self, PyObject* arg)
> {
>       PyObject* file, *final;
>       char* name = NULL;
>       SDL_Surface* surf;
>       SDL_RWops *rw;
>       if(!PyArg_ParseTuple(arg, "O|s", &file, &name))
>               return NULL;
> 
>       if(PyString_Check(file) || PyUnicode_Check(file))
>       {
>               if(!PyArg_ParseTuple(arg, "s|O", &name, &file))
>                       return NULL;
>               Py_BEGIN_ALLOW_THREADS
>               surf = SDL_LoadBMP(name);
>               Py_END_ALLOW_THREADS
>       }
>       else
>       {
>               if(!name && PyFile_Check(file))
>                       name = PyString_AsString(PyFile_Name(file));
> 
>               if(!(rw = RWopsFromPython(file)))
>                       return NULL;
>               if(RWopsCheckPython(rw))
>                       surf = SDL_LoadBMP_RW(rw, 1);
>               else
>               {
>                       Py_BEGIN_ALLOW_THREADS
>                       surf = SDL_LoadBMP_RW(rw, 1);
>                       Py_END_ALLOW_THREADS
>               }
>       }
>       if(!surf)
>               return RAISE(PyExc_SDLError, SDL_GetError());
> 
>       final = PySurface_New(surf);
>       if(!final)
>               SDL_FreeSurface(surf);
>       return final;
> }
> 
> 
> 
> 
> static SDL_Surface* opengltosdl()
> {
>         /*we need to get ahold of the pyopengl glReadPixels function*/
>         /*we use pyopengl's so we don't need to link with opengl at 
> compiletime*/
>         PyObject *pyopengl, *readpixels = NULL;
>         int typeflag=0, formatflag=0;
>         SDL_Surface *surf;
>         Uint32 rmask, gmask, bmask;
>         int i;
>         unsigned char *pixels;
>         PyObject *data;
> 
>         surf = SDL_GetVideoSurface();
> 
>         pyopengl = PyImport_ImportModule("OpenGL.GL");
>         if(pyopengl)
>         {
>                 PyObject* dict = PyModule_GetDict(pyopengl);
>                 if(dict)
>                 {
>                         PyObject *o;
>                         o = PyDict_GetItemString(dict, "GL_RGB");
>                         if(!o) {Py_DECREF(pyopengl); return NULL;}
>                         formatflag = PyInt_AsLong(o);
>                         o = PyDict_GetItemString(dict, "GL_UNSIGNED_BYTE");
>                         if(!o) {Py_DECREF(pyopengl); return NULL;}
>                         typeflag = PyInt_AsLong(o);
>                         readpixels = PyDict_GetItemString(dict, 
> "glReadPixels");
>                         if(!readpixels) {Py_DECREF(pyopengl); return NULL;}
>                 }
>                 Py_DECREF(pyopengl);
>         }
>         else
>         {
>             RAISE(PyExc_ImportError, "Cannot import PyOpenGL");
>             return NULL;
>         }
> 
>         data = PyObject_CallFunction(readpixels, "iiiiii",
>                                 0, 0, surf->w, surf->h, formatflag, typeflag);
>         if(!data)
>         {
>                 RAISE(PyExc_SDLError, "glReadPixels returned NULL");
>                 return NULL;
>         }
>         pixels = (unsigned char*)PyString_AsString(data);
> 
>         if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
>         {
>             rmask=0x000000FF; gmask=0x0000FF00; bmask=0x00FF0000;
>         }
>         else
>         {
>             rmask=0x00FF0000; gmask=0x0000FF00; bmask=0x000000FF;
>         }
>         surf = SDL_CreateRGBSurface(SDL_SWSURFACE, surf->w, surf->h, 24,
>                     rmask, gmask, bmask, 0);
>         if(!surf)
>         {
>                 Py_DECREF(data);
>                 RAISE(PyExc_SDLError, SDL_GetError());
>                 return NULL;
>         }
> 
>         for(i=0; i<surf->h; ++i)
>                 memcpy(((char *) surf->pixels) + surf->pitch * i, pixels + 
> 3*surf->w * (surf->h-i-1), surf->w*3);
> 
>         Py_DECREF(data);
>         return surf;
> }
> 
> 
> 
> 
>     /*DOC*/ static char doc_save[] =
>     /*DOC*/    "pygame.image.save(Surface, file) -> None\n"
>     /*DOC*/    "save surface data\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "This will save your surface as a BMP or TGA image. The 
> given\n"
>     /*DOC*/    "file argument can be either a filename or a python 
> file-like\n"
>     /*DOC*/    "object. This will also work under OPENGL display modes.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "The image will default to save with the TGA format. If the\n"
>     /*DOC*/    "filename has the BMP extension, it will use the BMP format.\n"
>     /*DOC*/ ;
> 
> PyObject* image_save(PyObject* self, PyObject* arg)
> {
>       PyObject* surfobj, *file;
>       SDL_Surface *surf;
>       SDL_Surface *temp = NULL;
>       int result;
> 
>       if(!PyArg_ParseTuple(arg, "O!O", &PySurface_Type, &surfobj, &file))
>               return NULL;
>       surf = PySurface_AsSurface(surfobj);
> 
>       if(surf->flags & SDL_OPENGL)
>       {
>                 temp = surf = opengltosdl();
>                 if(!surf)
>                     return NULL;
>       }
>       else
>               PySurface_Prep(surfobj);
> 
>       if(PyString_Check(file) || PyUnicode_Check(file))
>       {
>               int namelen;
>               char* name;
>               if(!PyArg_ParseTuple(arg, "O|s", &file, &name))
>                       return NULL;
>                 namelen = strlen(name);
>               Py_BEGIN_ALLOW_THREADS
>                 if(name[namelen-1]=='p' || name[namelen-1]=='P')
>                   result = SDL_SaveBMP(surf, name);
>                 else
>                     result = SaveTGA(surf, name, 1);
>               Py_END_ALLOW_THREADS
>       }
>       else
>       {
>               SDL_RWops* rw;
>               if(!(rw = RWopsFromPython(file)))
>                       return NULL;
> /*            result = SDL_SaveBMP_RW(surf, rw, 1);*/
>               result = SaveTGA_RW(surf, rw, 1);
>       }
> 
> 
>       if(temp)
>               SDL_FreeSurface(temp);
>       else
>               PySurface_Unprep(surfobj);
> 
>       if(result == -1)
>               return RAISE(PyExc_SDLError, SDL_GetError());
> 
>       RETURN_NONE
> }
> 
> 
> 
>     /*DOC*/ static char doc_get_extended[] =
>     /*DOC*/    "pygame.image.get_extended() -> int\n"
>     /*DOC*/    "returns true if SDL_image formats are available\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "This will return a true value if the extended image formats\n"
>     /*DOC*/    "from SDL_image are available for loading.\n"
>     /*DOC*/ ;
> 
> PyObject* image_get_extended(PyObject* self, PyObject* arg)
> {
>       if(!PyArg_ParseTuple(arg, ""))
>               return NULL;
>       return PyInt_FromLong(is_extended);
> }
> 
> 
>     /*DOC*/ static char doc_tostring[] =
>     /*DOC*/    "pygame.image.tostring(Surface, format, flipped=0) -> string\n"
>     /*DOC*/    "create a raw string buffer of the surface data\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "This will copy the image data into a large string buffer.\n"
>     /*DOC*/    "This can be used to transfer images to other libraries like\n"
>     /*DOC*/    "PIL's fromstring() and PyOpenGL's glTexImage2D(). \n"
>     /*DOC*/    "\n"
>     /*DOC*/    "The flipped argument will cause the output string to have\n"
>     /*DOC*/    "it's contents flipped vertically.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "The format argument is a string representing which type of\n"
>     /*DOC*/    "string data you need. It can be one of the following, \"P\"\n"
>     /*DOC*/    "for 8bit palette indices. \"RGB\" for 24bit RGB data, 
> \"RGBA\"\n"
>     /*DOC*/    "for 32bit RGB and alpha, or \"RGBX\" for 32bit padded RGB 
> colors.\n"
>     /*DOC*/    "\"ARGB\" is a popular format for big endian platforms.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "These flags are a subset of the formats supported the PIL\n"
>     /*DOC*/    "Python Image Library. Note that the \"P\" format only will\n"
>     /*DOC*/    "work for 8bit Surfaces.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "If you ask for the \"RGBA\" format and the image only has\n"
>     /*DOC*/    "colorkey data. An alpha channel will be created from the\n"
>     /*DOC*/    "colorkey values.\n"
>     /*DOC*/ ;
> 
> PyObject* image_tostring(PyObject* self, PyObject* arg)
> {
>       PyObject *surfobj, *string=NULL;
>       char *format, *data, *pixels;
>       SDL_Surface *surf, *temp=NULL;
>       int w, h, color, flipped=0;
>       Py_ssize_t len;
>       int Rmask, Gmask, Bmask, Amask, Rshift, Gshift, Bshift, Ashift, Rloss, 
> Gloss, Bloss, Aloss;
>       int hascolorkey, colorkey;
> 
>       if(!PyArg_ParseTuple(arg, "O!s|i", &PySurface_Type, &surfobj, &format, 
> &flipped))
>               return NULL;
>       surf = PySurface_AsSurface(surfobj);
>       if(surf->flags & SDL_OPENGL)
>       {
>               temp = surf = opengltosdl();
>               if(!surf)
>                       return NULL;
>       }
> 
>       Rmask = surf->format->Rmask; Gmask = surf->format->Gmask;
>       Bmask = surf->format->Bmask; Amask = surf->format->Amask;
>       Rshift = surf->format->Rshift; Gshift = surf->format->Gshift;
>       Bshift = surf->format->Bshift; Ashift = surf->format->Ashift;
>       Rloss = surf->format->Rloss; Gloss = surf->format->Gloss;
>       Bloss = surf->format->Bloss; Aloss = surf->format->Aloss;
>       hascolorkey = (surf->flags & SDL_SRCCOLORKEY) && !Amask;
>       colorkey = surf->format->colorkey;
> 
>       if(!strcmp(format, "P"))
>       {
>               if(surf->format->BytesPerPixel != 1)
>                       return RAISE(PyExc_ValueError, "Can only create \"P\" 
> format data with 8bit Surfaces");
>               string = PyString_FromStringAndSize(NULL, 
> (Py_ssize_t)surf->w*surf->h);
>               if(!string)
>                       return NULL;
>               PyString_AsStringAndSize(string, &data, &len);
> 
>               PySurface_Lock(surfobj);
>               pixels = (char*)surf->pixels;
>               for(h=0; h<surf->h; ++h)
>                       memcpy(DATAROW(data, h, surf->w, surf->h, flipped), 
> pixels+(h*surf->pitch), surf->w);
>               PySurface_Unlock(surfobj);
>       }
>       else if(!strcmp(format, "RGB"))
>       {
>               string = PyString_FromStringAndSize(NULL, 
> (Py_ssize_t)surf->w*surf->h*3);
>               if(!string)
>                       return NULL;
>               PyString_AsStringAndSize(string, &data, &len);
> 
>               if(!temp)
>                     PySurface_Lock(surfobj);
>               pixels = (char*)surf->pixels;
>               switch(surf->format->BytesPerPixel)
>               {
>               case 1:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint8* ptr = (Uint8*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[0] = 
> (char)surf->format->palette->colors[color].r;
>                                       data[1] = 
> (char)surf->format->palette->colors[color].g;
>                                       data[2] = 
> (char)surf->format->palette->colors[color].b;
>                                       data += 3;
>                               }
>                       }break;
>               case 2:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint16* ptr = (Uint16*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[0] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[1] = (char)(((color & Gmask) >> 
> Gshift) << Gloss);
>                                       data[2] = (char)(((color & Bmask) >> 
> Bshift) << Bloss);
>                                       data += 3;
>                               }
>                       }break;
>               case 3:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint8* ptr = (Uint8*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                       color = ptr[0] + (ptr[1]<<8) + 
> (ptr[2]<<16);
> #else
>                                       color = ptr[2] + (ptr[1]<<8) + 
> (ptr[0]<<16);
> #endif
>                                       ptr += 3;
>                                       data[0] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[1] = (char)(((color & Gmask) >> 
> Gshift) << Gloss);
>                                       data[2] = (char)(((color & Bmask) >> 
> Bshift) << Bloss);
>                                       data += 3;
>                               }
>                       }break;
>               case 4:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint32* ptr = (Uint32*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[0] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[1] = (char)(((color & Gmask) >> 
> Gshift) << Rloss);
>                                       data[2] = (char)(((color & Bmask) >> 
> Bshift) << Rloss);
>                                       data += 3;
>                               }
>                       }break;
>               }
>               if(!temp)
>                     PySurface_Unlock(surfobj);
>       }
>       else if(!strcmp(format, "RGBX") || !strcmp(format, "RGBA"))
>       {
>               if(strcmp(format, "RGBA"))
>                       hascolorkey = 0;
> 
>               string = PyString_FromStringAndSize(NULL, 
> (Py_ssize_t)surf->w*surf->h*4);
>               if(!string)
>                       return NULL;
>               PyString_AsStringAndSize(string, &data, &len);
> 
>               PySurface_Lock(surfobj);
>               pixels = (char*)surf->pixels;
>               switch(surf->format->BytesPerPixel)
>               {
>               case 1:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint8* ptr = (Uint8*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[0] = 
> (char)surf->format->palette->colors[color].r;
>                                       data[1] = 
> (char)surf->format->palette->colors[color].g;
>                                       data[2] = 
> (char)surf->format->palette->colors[color].b;
>                                       data[3] = hascolorkey ? 
> (char)(color!=colorkey)*255 : (char)255;
>                                       data += 4;
>                               }
>                       }break;
>               case 2:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint16* ptr = (Uint16*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[0] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[1] = (char)(((color & Gmask) >> 
> Gshift) << Gloss);
>                                       data[2] = (char)(((color & Bmask) >> 
> Bshift) << Bloss);
>                                       data[3] = hascolorkey ? 
> (char)(color!=colorkey)*255 :
>                                                               (char)(Amask ? 
> (((color & Amask) >> Ashift) << Aloss) : 255);
>                                       data += 4;
>                               }
>                       }break;
>               case 3:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint8* ptr = (Uint8*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                       color = ptr[0] + (ptr[1]<<8) + 
> (ptr[2]<<16);
> #else
>                                       color = ptr[2] + (ptr[1]<<8) + 
> (ptr[0]<<16);
> #endif
>                                       ptr += 3;
>                                       data[0] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[1] = (char)(((color & Gmask) >> 
> Gshift) << Gloss);
>                                       data[2] = (char)(((color & Bmask) >> 
> Bshift) << Bloss);
>                                       data[3] = hascolorkey ? 
> (char)(color!=colorkey)*255 :
>                                                               (char)(Amask ? 
> (((color & Amask) >> Ashift) << Aloss) : 255);
>                                       data += 4;
>                               }
>                       }break;
>               case 4:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint32* ptr = (Uint32*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[0] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[1] = (char)(((color & Gmask) >> 
> Gshift) << Rloss);
>                                       data[2] = (char)(((color & Bmask) >> 
> Bshift) << Rloss);
>                                       data[3] = hascolorkey ? 
> (char)(color!=colorkey)*255 :
>                                                               (char)(Amask ? 
> (((color & Amask) >> Ashift) << Rloss) : 255);
>                                       data += 4;
>                               }
>                       }break;
>               }
>               PySurface_Unlock(surfobj);
>       }
>       else if(!strcmp(format, "ARGB"))
>       {
>               hascolorkey = 0;
> 
>               string = PyString_FromStringAndSize(NULL, 
> (Py_ssize_t)surf->w*surf->h*4);
>               if(!string)
>                       return NULL;
>               PyString_AsStringAndSize(string, &data, &len);
> 
>               PySurface_Lock(surfobj);
>               pixels = (char*)surf->pixels;
>               switch(surf->format->BytesPerPixel)
>               {
>               case 1:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint8* ptr = (Uint8*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[1] = 
> (char)surf->format->palette->colors[color].r;
>                                       data[2] = 
> (char)surf->format->palette->colors[color].g;
>                                       data[3] = 
> (char)surf->format->palette->colors[color].b;
>                                       data[0] = hascolorkey ? 
> (char)(color!=colorkey)*255 : (char)255;
>                                       data += 4;
>                               }
>                       }break;
>               case 2:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint16* ptr = (Uint16*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[1] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[2] = (char)(((color & Gmask) >> 
> Gshift) << Gloss);
>                                       data[3] = (char)(((color & Bmask) >> 
> Bshift) << Bloss);
>                                       data[0] = hascolorkey ? 
> (char)(color!=colorkey)*255 :
>                                                               (char)(Amask ? 
> (((color & Amask) >> Ashift) << Aloss) : 255);
>                                       data += 4;
>                               }
>                       }break;
>               case 3:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint8* ptr = (Uint8*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                       color = ptr[0] + (ptr[1]<<8) + 
> (ptr[2]<<16);
> #else
>                                       color = ptr[2] + (ptr[1]<<8) + 
> (ptr[0]<<16);
> #endif
>                                       ptr += 3;
>                                       data[1] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[2] = (char)(((color & Gmask) >> 
> Gshift) << Gloss);
>                                       data[3] = (char)(((color & Bmask) >> 
> Bshift) << Bloss);
>                                       data[0] = hascolorkey ? 
> (char)(color!=colorkey)*255 :
>                                                               (char)(Amask ? 
> (((color & Amask) >> Ashift) << Aloss) : 255);
>                                       data += 4;
>                               }
>                       }break;
>               case 4:
>                       for(h=0; h<surf->h; ++h)
>                       {
>                               Uint32* ptr = (Uint32*)DATAROW(surf->pixels, h, 
> surf->pitch, surf->h, flipped);
>                               for(w=0; w<surf->w; ++w)
>                               {
>                                       color = *ptr++;
>                                       data[1] = (char)(((color & Rmask) >> 
> Rshift) << Rloss);
>                                       data[2] = (char)(((color & Gmask) >> 
> Gshift) << Rloss);
>                                       data[3] = (char)(((color & Bmask) >> 
> Bshift) << Rloss);
>                                       data[0] = hascolorkey ? 
> (char)(color!=colorkey)*255 :
>                                                               (char)(Amask ? 
> (((color & Amask) >> Ashift) << Rloss) : 255);
>                                       data += 4;
>                               }
>                       }break;
>               }
>               PySurface_Unlock(surfobj);
>       }
>       else
>         {
>                 if(temp) SDL_FreeSurface(temp);
>               return RAISE(PyExc_ValueError, "Unrecognized type of format");
>         }
> 
>         if(temp) SDL_FreeSurface(temp);
>       return string;
> }
> 
> 
> 
>     /*DOC*/ static char doc_fromstring[] =
>     /*DOC*/    "pygame.image.fromstring(string, size, format, flipped=0) -> 
> Surface\n"
>     /*DOC*/    "create a surface from a raw string buffer\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "This will create a new Surface from a copy of raw data in\n"
>     /*DOC*/    "a string. This can be used to transfer images from other\n"
>     /*DOC*/    "libraries like PIL's fromstring(). \n"
>     /*DOC*/    "\n"
>     /*DOC*/    "In most cases you can use the frombuffer() which accepts 
> strings\n"
>     /*DOC*/    "and is about 20 times faster.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "The flipped argument should be set to true if the image in\n"
>     /*DOC*/    "the string is.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "The format argument is a string representing which type of\n"
>     /*DOC*/    "string data you need. It can be one of the following, \"P\"\n"
>     /*DOC*/    "for 8bit palette indices. \"RGB\" for 24bit RGB data, 
> \"RGBA\"\n"
>     /*DOC*/    "for 32bit RGB and alpha, or \"RGBX\" for 32bit padded RGB 
> colors.\n"
>     /*DOC*/    "\"ARGB\" is a popular format for big endian platforms.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "These flags are a subset of the formats supported the PIL\n"
>     /*DOC*/    "Python Image Library. Note that the \"P\" format only 
> create\n"
>     /*DOC*/    "an 8bit surface, but the colormap will be all black.\n"
>     /*DOC*/ ;
> 
> PyObject* image_fromstring(PyObject* self, PyObject* arg)
> {
>       PyObject *string;
>       char *format, *data;
>       SDL_Surface *surf = NULL;
>       int w, h, flipped=0;
>       Py_ssize_t len;
>       int loopw, looph;
> 
>       if(!PyArg_ParseTuple(arg, "O!(ii)s|i", &PyString_Type, &string, &w, &h, 
> &format, &flipped))
>               return NULL;
> 
>       if(w < 1 || h < 1)
>               return RAISE(PyExc_ValueError, "Resolution must be positive 
> values");
> 
>       PyString_AsStringAndSize(string, &data, &len);
> 
>       if(!strcmp(format, "P"))
>       {
>               if(len != w*h)
>                       return RAISE(PyExc_ValueError, "String length does not 
> equal format and resolution size");
> 
>                 surf = SDL_CreateRGBSurface(0, w, h, 8, 0, 0, 0, 0);
>                 if(!surf)
>                         return RAISE(PyExc_SDLError, SDL_GetError());
>                 SDL_LockSurface(surf);
>                 for(looph=0; looph<h; ++looph)
>                         memcpy(((char*)surf->pixels)+looph*surf->pitch, 
> DATAROW(data, looph, w, h, flipped), w);
>                 SDL_UnlockSurface(surf);
>       }
>       else if(!strcmp(format, "RGB"))
>       {
>               if(len != w*h*3)
>                       return RAISE(PyExc_ValueError, "String length does not 
> equal format and resolution size");
>               surf = SDL_CreateRGBSurface(0, w, h, 24, 0xFF<<16, 0xFF<<8, 
> 0xFF, 0);
>               if(!surf)
>                       return RAISE(PyExc_SDLError, SDL_GetError());
>               SDL_LockSurface(surf);
>               for(looph=0; looph<h; ++looph)
>               {
>                       Uint8* pix = (Uint8*)DATAROW(surf->pixels, looph, 
> surf->pitch, h, flipped);
>                       for(loopw=0; loopw<w; ++loopw)
>                       {
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                               pix[2] = data[0]; pix[1] = data[1]; pix[0] = 
> data[2];
> #else
>                               pix[0] = data[0]; pix[1] = data[1]; pix[2] = 
> data[2];
> #endif
>                               pix += 3;
>                               data += 3;
>                       }
>               }
>               SDL_UnlockSurface(surf);
>       }
>       else if(!strcmp(format, "RGBA") || !strcmp(format, "RGBX"))
>       {
>               int alphamult = !strcmp(format, "RGBA");
>                 if(len != w*h*4)
>                       return RAISE(PyExc_ValueError, "String length does not 
> equal format and resolution size");
>               surf = SDL_CreateRGBSurface((alphamult?SDL_SRCALPHA:0), w, h, 
> 32,
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                         0xFF, 0xFF<<8, 0xFF<<16, 
> (alphamult?0xFF<<24:0));
> #else
>                                         0xFF<<24, 0xFF<<16, 0xFF<<8, 
> (alphamult?0xFF:0));
> #endif
>               if(!surf)
>                       return RAISE(PyExc_SDLError, SDL_GetError());
>               SDL_LockSurface(surf);
>               for(looph=0; looph<h; ++looph)
>               {
>                       Uint32* pix = (Uint32*)DATAROW(surf->pixels, looph, 
> surf->pitch, h, flipped);
>                       for(loopw=0; loopw<w; ++loopw)
>                       {
>                                 *pix++ = *((Uint32*)data);
>                                 data += 4;
>                       }
>               }
>               SDL_UnlockSurface(surf);
>       }
>       else if(!strcmp(format, "ARGB"))
>       {
>                 if(len != w*h*4)
>                       return RAISE(PyExc_ValueError, "String length does not 
> equal format and resolution size");
>               surf = SDL_CreateRGBSurface(SDL_SRCALPHA, w, h, 32,
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                         0xFF<<24, 0xFF, 0xFF<<8, 0xFF<<16);
> #else
>                                         0xFF, 0xFF<<24, 0xFF<<16, 0xFF<<8);
> #endif
>               if(!surf)
>                       return RAISE(PyExc_SDLError, SDL_GetError());
>               SDL_LockSurface(surf);
>               for(looph=0; looph<h; ++looph)
>               {
>                       Uint32* pix = (Uint32*)DATAROW(surf->pixels, looph, 
> surf->pitch, h, flipped);
>                       for(loopw=0; loopw<w; ++loopw)
>                       {
>                                 *pix++ = *((Uint32*)data);
>                                 data += 4;
>                       }
>               }
>               SDL_UnlockSurface(surf);
>       }
>       else
>               return RAISE(PyExc_ValueError, "Unrecognized type of format");
> 
>       if(!surf)
>               return NULL;
>       return PySurface_New(surf);
> }
> 
> 
> 
>     /*DOC*/ static char doc_frombuffer[] =
>     /*DOC*/    "pygame.image.frombuffer(string, size, format) -> Surface\n"
>     /*DOC*/    "create a surface from a python memory buffer\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "This works like the fromstring() method, but uses Python\n"
>     /*DOC*/    "buffer objects. It is about 20 times faster than 
> fromstring().\n"
>     /*DOC*/    "Strings and memory maps are examples of buffers in Python.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "See the fromstring() function for information about the 
> size\n"
>     /*DOC*/    "and format arguments.\n"
>     /*DOC*/ ;
> 
> PyObject* image_frombuffer(PyObject* self, PyObject* arg)
> {
>       PyObject *buffer;
>       char *format, *data;
>       SDL_Surface *surf = NULL;
>       int w, h;
>       Py_ssize_t len;
>         PyObject *surfobj;
> 
>       if(!PyArg_ParseTuple(arg, "O(ii)s|i", &buffer, &w, &h, &format))
>               return NULL;
> 
>       if(w < 1 || h < 1)
>               return RAISE(PyExc_ValueError, "Resolution must be positive 
> values");
> 
>         /* breaking constness here, we should really not change this string */
>         if(PyObject_AsCharBuffer(buffer, (const char**)&data, &len) == -1)
>               return NULL;
>         
>       if(!strcmp(format, "P"))
>       {
>               if(len != w*h)
>                       return RAISE(PyExc_ValueError, "Buffer length does not 
> equal format and resolution size");
> 
>                 surf = SDL_CreateRGBSurfaceFrom(data, w, h, 8, 3, 0, 0, 0, 0);
>       }
>       else if(!strcmp(format, "RGB"))
>       {
>               if(len != w*h*3)
>                       return RAISE(PyExc_ValueError, "Buffer length does not 
> equal format and resolution size");
>               surf = SDL_CreateRGBSurfaceFrom(data, w, h, 24, w*3, 0xFF, 
> 0xFF<<8, 0xFF<<16, 0);
>       }
>       else if(!strcmp(format, "RGBA") || !strcmp(format, "RGBX"))
>       {
>               int alphamult = !strcmp(format, "RGBA");
>                 if(len != w*h*4)
>                       return RAISE(PyExc_ValueError, "Buffer length does not 
> equal format and resolution size");
>               surf = SDL_CreateRGBSurfaceFrom(data, w, h, 32, w*4,
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                         0xFF, 0xFF<<8, 0xFF<<16, 
> (alphamult?0xFF<<24:0));
> #else
>                                         0xFF<<24, 0xFF<<16, 0xFF<<8, 
> (alphamult?0xFF:0));
> #endif
>                 if(alphamult)
>                     surf->flags |= SDL_SRCALPHA;
>       }
>       else if(!strcmp(format, "ARGB"))
>       {
>                 if(len != w*h*4)
>                       return RAISE(PyExc_ValueError, "Buffer length does not 
> equal format and resolution size");
>               surf = SDL_CreateRGBSurfaceFrom(data, w, h, 32, w*4,
> #if SDL_BYTEORDER == SDL_LIL_ENDIAN
>                                         0xFF<<24, 0xFF, 0xFF<<8, 0xFF<<16);
> #else
>                                         0xFF, 0xFF<<24, 0xFF<<16, 0xFF<<8);
> #endif
>                 surf->flags |= SDL_SRCALPHA;
>       }
>       else
>               return RAISE(PyExc_ValueError, "Unrecognized type of format");
> 
>       if(!surf)
>               return RAISE(PyExc_SDLError, SDL_GetError());
>       surfobj = PySurface_New(surf);
>         Py_INCREF(buffer);
>         ((PySurfaceObject*)surfobj)->dependency = buffer;
>         return surfobj;
> }
> 
> 
> 
> /*******************************************************/
> /* tga code by Mattias Engdegård, in the public domain */
> /*******************************************************/
> 
> struct TGAheader {
>     Uint8 infolen;            /* length of info field */
>     Uint8 has_cmap;           /* 1 if image has colormap, 0 otherwise */
>     Uint8 type;
> 
>     Uint8 cmap_start[2];      /* index of first colormap entry */
>     Uint8 cmap_len[2];                /* number of entries in colormap */
>     Uint8 cmap_bits;          /* bits per colormap entry */
> 
>     Uint8 yorigin[2];         /* image origin (ignored here) */
>     Uint8 xorigin[2];
>     Uint8 width[2];           /* image size */
>     Uint8 height[2];
>     Uint8 pixel_bits;         /* bits/pixel */
>     Uint8 flags;
> };
> 
> enum tga_type {
>     TGA_TYPE_INDEXED = 1,
>     TGA_TYPE_RGB = 2,
>     TGA_TYPE_BW = 3,
>     TGA_TYPE_RLE = 8          /* additive */
> };
> 
> 
> #define TGA_INTERLEAVE_MASK   0xc0
> #define TGA_INTERLEAVE_NONE   0x00
> #define TGA_INTERLEAVE_2WAY   0x40
> #define TGA_INTERLEAVE_4WAY   0x80
> 
> #define TGA_ORIGIN_MASK               0x30
> #define TGA_ORIGIN_LEFT               0x00
> #define TGA_ORIGIN_RIGHT      0x10
> #define TGA_ORIGIN_LOWER      0x00
> #define TGA_ORIGIN_UPPER      0x20
> 
> /* read/write unaligned little-endian 16-bit ints */
> #define LE16(p) ((p)[0] + ((p)[1] << 8))
> #define SETLE16(p, v) ((p)[0] = (v), (p)[1] = (v) >> 8)
> 
> #ifndef MIN
> #define MIN(a, b) ((a) < (b) ? (a) : (b))
> #endif
> 
> #define TGA_RLE_MAX 128               /* max length of a TGA RLE chunk */
> /* return the number of bytes in the resulting buffer after RLE-encoding
>    a line of TGA data */
> static int rle_line(Uint8 *src, Uint8 *dst, int w, int bpp)
> {
>     int x = 0;
>     int out = 0;
>     int raw = 0;
>     while(x < w) {
>       Uint32 pix;
>       int x0 = x;
>       memcpy(&pix, src + x * bpp, bpp);
>       x++;
>       while(x < w && memcmp(&pix, src + x * bpp, bpp) == 0
>             && x - x0 < TGA_RLE_MAX)
>           x++;
>       /* use a repetition chunk iff the repeated pixels would consume
>          two bytes or more */
>       if((x - x0 - 1) * bpp >= 2 || x == w) {
>           /* output previous raw chunks */
>           while(raw < x0) {
>               int n = MIN(TGA_RLE_MAX, x0 - raw);
>               dst[out++] = n - 1;
>               memcpy(dst + out, src + raw * bpp, n * bpp);
>               out += n * bpp;
>               raw += n;
>           }
> 
>           if(x - x0 > 0) {
>               /* output new repetition chunk */
>               dst[out++] = 0x7f + x - x0;
>               memcpy(dst + out, &pix, bpp);
>               out += bpp;
>           }
>           raw = x;
>       }
>     }
>     return out;
> }
> 
> /*
>  * Save a surface to an output stream in TGA format.
>  * 8bpp surfaces are saved as indexed images with 24bpp palette, or with
>  *     32bpp palette if colourkeying is used.
>  * 15, 16, 24 and 32bpp surfaces are saved as 24bpp RGB images,
>  * or as 32bpp RGBA images if alpha channel is used.
>  *
>  * RLE compression is not used in the output file.
>  *
>  * Returns -1 upon error, 0 if success
>  */
> static int SaveTGA_RW(SDL_Surface *surface, SDL_RWops *out, int rle)
> {
>     SDL_Surface *linebuf = NULL;
>     int alpha = 0;
>     int ckey = -1;
>     struct TGAheader h;
>     int srcbpp;
>     unsigned surf_flags;
>     unsigned surf_alpha;
>     Uint32 rmask, gmask, bmask, amask;
>     SDL_Rect r;
>     int bpp;
>     Uint8 *rlebuf = NULL;
> 
>     h.infolen = 0;
>     SETLE16(h.cmap_start, 0);
> 
>     srcbpp = surface->format->BitsPerPixel;
>     if(srcbpp < 8) {
>       SDL_SetError("cannot save <8bpp images as TGA");
>       return -1;
>     }
> 
>     if(srcbpp == 8) {
>       h.has_cmap = 1;
>       h.type = TGA_TYPE_INDEXED;
>       if(surface->flags & SDL_SRCCOLORKEY) {
>           ckey = surface->format->colorkey;
>           h.cmap_bits = 32;
>       } else
>           h.cmap_bits = 24;
>       SETLE16(h.cmap_len, surface->format->palette->ncolors);
>       h.pixel_bits = 8;
>       rmask = gmask = bmask = amask = 0;
>     } else {
>       h.has_cmap = 0;
>       h.type = TGA_TYPE_RGB;
>       h.cmap_bits = 0;
>       SETLE16(h.cmap_len, 0);
>       if(surface->format->Amask) {
>           alpha = 1;
>           h.pixel_bits = 32;
>       } else
>           h.pixel_bits = 24;
>       if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
>           int s = alpha ? 0 : 8;
>           amask = 0x000000ff >> s;
>           rmask = 0x0000ff00 >> s;
>           gmask = 0x00ff0000 >> s;
>           bmask = 0xff000000 >> s;
>       } else {
>           amask = alpha ? 0xff000000 : 0;
>           rmask = 0x00ff0000;
>           gmask = 0x0000ff00;
>           bmask = 0x000000ff;
>       }
>     }
>     bpp = h.pixel_bits >> 3;
>     if(rle)
>           h.type += TGA_TYPE_RLE;
> 
>     SETLE16(h.yorigin, 0);
>     SETLE16(h.xorigin, 0);
>     SETLE16(h.width, surface->w);
>     SETLE16(h.height, surface->h);
>     h.flags = TGA_ORIGIN_UPPER | (alpha ? 8 : 0);
> 
>     if(!SDL_RWwrite(out, &h, sizeof(h), 1))
>       return -1;
> 
>     if(h.has_cmap) {
>       int i;
>       SDL_Palette *pal = surface->format->palette;
>       Uint8 entry[4];
>       for(i = 0; i < pal->ncolors; i++) {
>           entry[0] = pal->colors[i].b;
>           entry[1] = pal->colors[i].g;
>           entry[2] = pal->colors[i].r;
>           entry[3] = (i == ckey) ? 0 : 0xff;
>           if(!SDL_RWwrite(out, entry, h.cmap_bits >> 3, 1))
>               return -1;
>       }
>     }
> 
>     linebuf = SDL_CreateRGBSurface(SDL_SWSURFACE, surface->w, 1, h.pixel_bits,
>                                  rmask, gmask, bmask, amask);
>     if(!linebuf)
>       return -1;
>     if(h.has_cmap)
>       SDL_SetColors(linebuf, surface->format->palette->colors, 0,
>                     surface->format->palette->ncolors);
>     if(rle) {
>       rlebuf = malloc(bpp * surface->w + 1 + surface->w / TGA_RLE_MAX);
>       if(!rlebuf) {
>           SDL_SetError("out of memory");
>           goto error;
>       }
>     }
> 
>     /* Temporarily remove colourkey and alpha from surface so copies are
>        opaque */
>     surf_flags = surface->flags & (SDL_SRCALPHA | SDL_SRCCOLORKEY);
>     surf_alpha = surface->format->alpha;
>     if(surf_flags & SDL_SRCALPHA)
>       SDL_SetAlpha(surface, 0, 255);
>     if(surf_flags & SDL_SRCCOLORKEY)
>       SDL_SetColorKey(surface, 0, surface->format->colorkey);
> 
>     r.x = 0;
>     r.w = surface->w;
>     r.h = 1;
>     for(r.y = 0; r.y < surface->h; r.y++) {
>       int n;
>       void *buf;
>       if(SDL_BlitSurface(surface, &r, linebuf, NULL) < 0)
>           break;
>       if(rle) {
>           buf = rlebuf;
>           n = rle_line(linebuf->pixels, rlebuf, surface->w, bpp);
>       } else {
>           buf = linebuf->pixels;
>           n = surface->w * bpp;
>       }
>       if(!SDL_RWwrite(out, buf, n, 1))
>           break;
>     }
> 
>     /* restore flags */
>     if(surf_flags & SDL_SRCALPHA)
>       SDL_SetAlpha(surface, SDL_SRCALPHA, (Uint8)surf_alpha);
>     if(surf_flags & SDL_SRCCOLORKEY)
>       SDL_SetColorKey(surface, SDL_SRCCOLORKEY, surface->format->colorkey);
> 
> error:
>     free(rlebuf);
>     SDL_FreeSurface(linebuf);
>     return 0;
> }
> 
> static int SaveTGA(SDL_Surface *surface, char *file, int rle)
> {
>     SDL_RWops *out = SDL_RWFromFile(file, "wb");
>     int ret;
>     if(!out)
>       return -1;
>     ret = SaveTGA_RW(surface, out, rle);
>     SDL_RWclose(out);
>     return ret;
> }
> 
> 
> 
> 
> 
> static PyMethodDef image_builtins[] =
> {
>       { "load_basic", image_load_basic, 1, doc_load },
>       { "save", image_save, 1, doc_save },
>       { "get_extended", image_get_extended, 1, doc_get_extended },
> 
>       { "tostring", image_tostring, 1, doc_tostring },
>       { "fromstring", image_fromstring, 1, doc_fromstring },
>       { "frombuffer", image_frombuffer, 1, doc_frombuffer },
> 
>       { NULL, NULL }
> };
> 
> 
> 
>     /*DOC*/ static char doc_pygame_image_MODULE[] =
>     /*DOC*/    "This module contains functions to transfer images in and 
> out\n"
>     /*DOC*/    "of Surfaces. At the minimum the included load() function 
> will\n"
>     /*DOC*/    "support BMP files. If SDL_image is properly installed when\n"
>     /*DOC*/    "pygame is installed, it will support all the formats 
> included\n"
>     /*DOC*/    "with SDL_image. You can call the get_extended() function to 
> test\n"
>     /*DOC*/    "if the SDL_image support is available.\n"
>     /*DOC*/    "\n"
>     /*DOC*/    "Some functions that communicate with other libraries will 
> require\n"
>     /*DOC*/    "that those libraries are properly installed. For example, the 
> save()\n"
>     /*DOC*/    "function can only save OPENGL surfaces if pyopengl is 
> available.\n"
>     /*DOC*/ ;
> 
> PYGAME_EXPORT
> void initimage(void)
> {
>       PyObject *module, *dict;
>       PyObject *extmodule;
> 
>     /* create the module */
>       module = Py_InitModule3("image", image_builtins, 
> doc_pygame_image_MODULE);
>       dict = PyModule_GetDict(module);
> 
> 
>       /* try to get extended formats */
>       extmodule = PyImport_ImportModule("pygame.imageext");
>       if(extmodule)
>       {
>               PyObject *extdict = PyModule_GetDict(extmodule);
>               PyObject* extload = PyDict_GetItemString(extdict, 
> "load_extended");
>               PyDict_SetItemString(dict, "load_extended", extload);
>               PyDict_SetItemString(dict, "load", extload);
>               Py_INCREF(extload);
>               Py_INCREF(extload);
>               is_extended = 1;
>       }
>       else
>       {
>               PyObject* basicload = PyDict_GetItemString(dict, "load_basic");
>               PyErr_Clear();
>               PyDict_SetItemString(dict, "load_extended", Py_None);
>               PyDict_SetItemString(dict, "load", basicload);
>               Py_INCREF(Py_None);
>               Py_INCREF(basicload);
>               is_extended = 0;
>       }
> 
>       /*imported needed apis*/
>       import_pygame_base();
>       import_pygame_surface();
>       import_pygame_rwobject();
> }
> 
> 
> 
> ------------------------------------------------------------------------
> 
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Freevo-users mailing list
> Freevo-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/freevo-users



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Freevo-users mailing list
Freevo-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freevo-users

Reply via email to