/* * Create an empty RGB surface of the appropriate depth */ SDL_Surface * SDL_CreateRGBSurface (Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) { SDL_VideoDevice *video = current_video; SDL_VideoDevice *this = current_video; SDL_Surface *screen; SDL_Surface *surface; /* Make sure the size requested doesn't overflow our datatypes */ /* Next time I write a library like SDL, I'll use int for size. :) */ if ( width > 16384 || height > 16384 ) { SDL_SetError("Width or height is too large"); return(NULL); } /* Check to see if we desire the surface in video memory */ if ( video ) { screen = SDL_PublicSurface; } else { screen = NULL; } if ( screen && ((screen->flags&SDL_HWSURFACE) == SDL_HWSURFACE) ) { if ( (flags&(SDL_SRCCOLORKEY|SDL_SRCALPHA)) != 0 ) { flags |= SDL_HWSURFACE; } if ( (flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) { if ( ! current_video->info.blit_hw_CC ) { flags &= ~SDL_HWSURFACE; } } if ( (flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { if ( ! current_video->info.blit_hw_A ) { flags &= ~SDL_HWSURFACE; } } } else { flags &= ~SDL_HWSURFACE; } /* Allocate the surface */ surface = (SDL_Surface *)malloc(sizeof(*surface)); if ( surface == NULL ) { SDL_OutOfMemory(); return(NULL); } surface->flags = SDL_SWSURFACE; if ( (flags & SDL_HWSURFACE) == SDL_HWSURFACE ) { depth = screen->format->BitsPerPixel; Rmask = screen->format->Rmask; Gmask = screen->format->Gmask; Bmask = screen->format->Bmask; Amask = screen->format->Amask; } surface->format = SDL_AllocFormat(depth, Rmask, Gmask, Bmask, Amask); if ( surface->format == NULL ) { free(surface); return(NULL); } if ( Amask ) { surface->flags |= SDL_SRCALPHA; } surface->w = width; surface->h = height; surface->pitch = SDL_CalculatePitch(surface); surface->pixels = NULL; surface->offset = 0; surface->hwdata = NULL; surface->locked = 0; surface->map = NULL; surface->unused1 = 0; SDL_SetClipRect(surface, NULL); SDL_FormatChanged(surface); /* Get the pixels */ if ( ((flags&SDL_HWSURFACE) == SDL_SWSURFACE) || (video->AllocHWSurface(this, surface) < 0) ) { if ( surface->w && surface->h ) { surface->pixels = malloc(surface->h*surface->pitch); if ( surface->pixels == NULL ) { SDL_FreeSurface(surface); SDL_OutOfMemory(); return(NULL); } /* This is important for bitmaps */ memset(surface->pixels, 0, surface->h*surface->pitch); } } /* Allocate an empty mapping */ surface->map = SDL_AllocBlitMap(); if ( surface->map == NULL ) { SDL_FreeSurface(surface); return(NULL); } /* The surface is ready to go */ surface->refcount = 1; #ifdef CHECK_LEAKS ++surfaces_allocated; #endif return(surface); }
/* * Create an empty RGB surface of the appropriate depth using the given * enum SDL_PIXELFORMAT_* format */ SDL_Surface * SDL_CreateRGBSurfaceWithFormat(Uint32 flags, int width, int height, int depth, Uint32 format) { SDL_Surface *surface; /* The flags are no longer used, make the compiler happy */ (void)flags; /* Allocate the surface */ surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface)); if (surface == NULL) { SDL_OutOfMemory(); return NULL; } surface->format = SDL_AllocFormat(format); if (!surface->format) { SDL_FreeSurface(surface); return NULL; } surface->w = width; surface->h = height; surface->pitch = SDL_CalculatePitch(format, width); SDL_SetClipRect(surface, NULL); if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) { SDL_Palette *palette = SDL_AllocPalette((1 << surface->format->BitsPerPixel)); if (!palette) { SDL_FreeSurface(surface); return NULL; } if (palette->ncolors == 2) { /* Create a black and white bitmap palette */ palette->colors[0].r = 0xFF; palette->colors[0].g = 0xFF; palette->colors[0].b = 0xFF; palette->colors[1].r = 0x00; palette->colors[1].g = 0x00; palette->colors[1].b = 0x00; } SDL_SetSurfacePalette(surface, palette); SDL_FreePalette(palette); } /* Get the pixels */ if (surface->w && surface->h) { /* Assumptions checked in surface_size_assumptions assert above */ Sint64 size = ((Sint64)surface->h * surface->pitch); if (size < 0 || size > SDL_MAX_SINT32) { /* Overflow... */ SDL_FreeSurface(surface); SDL_OutOfMemory(); return NULL; } surface->pixels = SDL_malloc((size_t)size); if (!surface->pixels) { SDL_FreeSurface(surface); SDL_OutOfMemory(); return NULL; } /* This is important for bitmaps */ SDL_memset(surface->pixels, 0, surface->h * surface->pitch); } /* Allocate an empty mapping */ surface->map = SDL_AllocBlitMap(); if (!surface->map) { SDL_FreeSurface(surface); return NULL; } /* By default surface with an alpha mask are set up for blending */ if (surface->format->Amask) { SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); } /* The surface is ready to go */ surface->refcount = 1; return surface; }
/* * Create an empty RGB surface of the appropriate depth */ SDL_Surface * SDL_CreateRGBSurface(Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) { SDL_Surface *surface; Uint32 format; /* The flags are no longer used, make the compiler happy */ (void)flags; /* Get the pixel format */ format = SDL_MasksToPixelFormatEnum(depth, Rmask, Gmask, Bmask, Amask); if (format == SDL_PIXELFORMAT_UNKNOWN) { SDL_SetError("Unknown pixel format"); return NULL; } /* Allocate the surface */ surface = (SDL_Surface *) SDL_calloc(1, sizeof(*surface)); if (surface == NULL) { SDL_OutOfMemory(); return NULL; } surface->format = SDL_AllocFormat(format); if (!surface->format) { SDL_FreeSurface(surface); return NULL; } surface->w = width; surface->h = height; surface->pitch = SDL_CalculatePitch(surface); SDL_SetClipRect(surface, NULL); if (SDL_ISPIXELFORMAT_INDEXED(surface->format->format)) { SDL_Palette *palette = SDL_AllocPalette((1 << surface->format->BitsPerPixel)); if (!palette) { SDL_FreeSurface(surface); return NULL; } if (palette->ncolors == 2) { /* Create a black and white bitmap palette */ palette->colors[0].r = 0xFF; palette->colors[0].g = 0xFF; palette->colors[0].b = 0xFF; palette->colors[1].r = 0x00; palette->colors[1].g = 0x00; palette->colors[1].b = 0x00; } SDL_SetSurfacePalette(surface, palette); SDL_FreePalette(palette); } /* Get the pixels */ if (surface->w && surface->h) { surface->pixels = SDL_malloc(surface->h * surface->pitch); if (!surface->pixels) { SDL_FreeSurface(surface); SDL_OutOfMemory(); return NULL; } /* This is important for bitmaps */ SDL_memset(surface->pixels, 0, surface->h * surface->pitch); } /* Allocate an empty mapping */ surface->map = SDL_AllocBlitMap(); if (!surface->map) { SDL_FreeSurface(surface); return NULL; } /* By default surface with an alpha mask are set up for blending */ if (Amask) { SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND); } /* The surface is ready to go */ surface->refcount = 1; return surface; }
/* * Create an empty RGB surface of the appropriate depth */ SDL_Surface * SDL_CreateRGBSurface (Uint32 flags, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask) { SDL_Surface *surface; /* Make sure the size requested doesn't overflow our datatypes */ /* Next time I write a library like SDL, I'll use int for size. :) */ if ( width >= 16384 || height >= 65536 ) { SDL_SetError("Width or height is too large"); return(NULL); } flags &= ~SDL_HWSURFACE; /* Allocate the surface */ surface = (SDL_Surface *)SDL_malloc(sizeof(*surface)); if (!surface) { SDL_OutOfMemory(); return(NULL); } surface->flags = SDL_SWSURFACE; surface->format = SDL_AllocFormat(depth, Rmask, Gmask, Bmask, Amask); if (!surface->format) { SDL_free(surface); return(NULL); } if (Amask) surface->flags |= SDL_SRCALPHA; surface->w = width; surface->h = height; surface->pitch = SDL_CalculatePitch(surface); surface->pixels = NULL; surface->offset = 0; surface->hwdata = NULL; surface->locked = 0; surface->map = NULL; surface->unused1 = 0; SDL_SetClipRect(surface, NULL); SDL_FormatChanged(surface); /* Get the pixels */ if ( ((flags&SDL_HWSURFACE) == SDL_SWSURFACE)) { if ( surface->w && surface->h ) { surface->pixels = SDL_malloc(surface->h*surface->pitch); if (!surface->pixels) { SDL_FreeSurface(surface); SDL_OutOfMemory(); return(NULL); } /* This is important for bitmaps */ SDL_memset(surface->pixels, 0, surface->h*surface->pitch); } } /* Allocate an empty mapping */ surface->map = SDL_AllocBlitMap(); if (!surface->map) { SDL_FreeSurface(surface); return(NULL); } /* The surface is ready to go */ surface->refcount = 1; return(surface); }