示例#1
0
int MkSurface::SaveImageData( const string &from, MemBuffer &out, bool tp ) {
  int rc = LoadBMP( from.c_str() );

  if ( rc == 0 ) {
    if ( s_surface->format->BitsPerPixel == 8 ) {
      SDL_Palette *palette = s_surface->format->palette;
      int i;

      out.Write16( Width() );
      out.Write16( Height() );
      out.Write8( s_surface->format->BitsPerPixel );
      out.Write8( tp ? RAW_DATA_TRANSPARENT : 0 );
      out.Write16( palette->ncolors ); // only for <= 256 colors (bpp = 8)

      if ( tp ) {
        int ck = GuessColorKey();
        // transparent color first
        out.Write8( palette->colors[ck].r );
        out.Write8( palette->colors[ck].g );
        out.Write8( palette->colors[ck].b );
      }

      for ( i = 0; i < palette->ncolors; ++i ) {
        out.Write8( palette->colors[i].r );
        out.Write8( palette->colors[i].g );
        out.Write8( palette->colors[i].b );
      }

      // save surface lines to file
      for ( i = 0; i < Height(); ++i ) {
        Uint8 *pix = (Uint8 *)s_surface->pixels + i * s_surface->pitch;
        out.Write( pix, Width() );
      }
    } else {
      cerr << "Error: Couldn't find palette in image " << from << endl
           << "Make sure it is 8 bit (<= 256 colors) only" << endl;
      rc = -1;
    }
  } else
    cerr << "Error: Couldn't load image " << from << endl;

  return rc;
}