static void ANDROID_FreeHWSurface(_THIS, SDL_Surface *surface) { int i; if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return; } if( !surface->hwdata ) return; SDL_DestroyTexture((struct SDL_Texture *)surface->hwdata); DEBUGOUT("ANDROID_FreeHWSurface() surface %p w %d h %d in HwSurfaceCount %d HwSurfaceList %p", surface, surface->w, surface->h, HwSurfaceCount, HwSurfaceList); for( i = 0; i < HwSurfaceCount; i++ ) { if( HwSurfaceList[i] == surface ) { HwSurfaceCount--; memmove(HwSurfaceList + i, HwSurfaceList + i + 1, sizeof(SDL_Surface *) * (HwSurfaceCount - i) ); HwSurfaceList = SDL_realloc( HwSurfaceList, HwSurfaceCount * sizeof(SDL_Surface *) ); i = -1; DEBUGOUT("ANDROID_FreeHWSurface() in HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); break; } } if( i != -1 ) { SDL_SetError("ANDROID_FreeHWSurface: cannot find freed HW surface in HwSurfaceList array"); } }
// Queue events to main thread static int getNextEventAndLock() { int nextEvent; if( !BufferedEventsMutex ) return -1; SDL_mutexP(BufferedEventsMutex); nextEvent = BufferedEventsEnd; nextEvent++; if( nextEvent >= MAX_BUFFERED_EVENTS ) nextEvent = 0; while( nextEvent == BufferedEventsStart ) { SDL_mutexV(BufferedEventsMutex); if( SDL_ANDROID_InsideVideoThread() ) SDL_ANDROID_PumpEvents(); else SDL_Delay(100); SDL_mutexP(BufferedEventsMutex); nextEvent = BufferedEventsEnd; nextEvent++; if( nextEvent >= MAX_BUFFERED_EVENTS ) nextEvent = 0; } return nextEvent; }
void ANDROID_GL_SwapBuffers(_THIS) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_GL_SwapBuffers"); if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return; } SDL_ANDROID_CallJavaSwapBuffers(); };
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return; } if(!SDL_CurrentVideoSurface) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s without main video surface!", __PRETTY_FUNCTION__); return; } ANDROID_FlipHWSurfaceInternal(); SDL_ANDROID_CallJavaSwapBuffers(); }
static void ANDROID_UpdateRects(_THIS, int numrects, SDL_Rect *rects) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return; } if(!SDL_CurrentVideoSurface) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s without main video surface!", __PRETTY_FUNCTION__); return; } // ANDROID_FlipHWSurfaceInternal(numrects, rects); // Fails for fheroes2, I'll add a compatibility option later. ANDROID_FlipHWSurfaceInternal(0, NULL); SDL_ANDROID_CallJavaSwapBuffers(); }
/* Note: If we are terminated, this could be called in the middle of another SDL video routine -- notably UpdateRects. */ void ANDROID_VideoQuit(_THIS) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); } if( ! sdl_opengl ) { DEBUGOUT("ANDROID_VideoQuit() in HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); HwSurfaceCount = 0; if(HwSurfaceList) SDL_free(HwSurfaceList); HwSurfaceList = NULL; DEBUGOUT("ANDROID_VideoQuit() out HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); if( SDL_CurrentVideoSurface ) { if( SDL_CurrentVideoSurface->hwdata ) SDL_DestroyTexture((struct SDL_Texture *)SDL_CurrentVideoSurface->hwdata); if( SDL_CurrentVideoSurface->pixels ) SDL_free(SDL_CurrentVideoSurface->pixels); SDL_CurrentVideoSurface->pixels = NULL; } SDL_CurrentVideoSurface = NULL; if(SDL_VideoWindow) SDL_DestroyWindow(SDL_VideoWindow); SDL_VideoWindow = NULL; } SDL_ANDROID_sFakeWindowWidth = 0; SDL_ANDROID_sFakeWindowWidth = 0; int i; /* Free video mode lists */ for ( i=0; i<SDL_NUMMODES; ++i ) { if ( SDL_modelist[i] != NULL ) { SDL_free(SDL_modelist[i]); SDL_modelist[i] = NULL; } } }
static int ANDROID_FlipHWSurface(_THIS, SDL_Surface *surface) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if(!SDL_CurrentVideoSurface) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s without main video surface!", __PRETTY_FUNCTION__); return -1; } ANDROID_FlipHWSurfaceInternal(0, NULL); SDL_ANDROID_CallJavaSwapBuffers(); return(0); }
static int ANDROID_SetHWAlpha(_THIS, SDL_Surface *surface, Uint8 value) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if( !surface->hwdata ) return(-1); surface->flags |= SDL_SRCALPHA; if( value == SDL_ALPHA_OPAQUE && ! (surface->flags & SDL_SRCCOLORKEY) ) SDL_SetTextureBlendMode((struct SDL_Texture *)surface->hwdata, SDL_BLENDMODE_NONE); else SDL_SetTextureBlendMode((struct SDL_Texture *)surface->hwdata, SDL_BLENDMODE_BLEND); return SDL_SetTextureAlphaMod((struct SDL_Texture *)surface->hwdata, value); };
// We're only blitting HW surface to screen, no other options provided (and if you need them your app designed wrong) int ANDROID_HWBlit(SDL_Surface* src, SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if( dst != SDL_CurrentVideoSurface || (! src->hwdata) ) { //__android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_HWBlit(): blitting SW"); return(src->map->sw_blit(src, srcrect, dst, dstrect)); } if( src == SDL_CurrentVideoSurface ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROID_HWBlit(): reading from screen surface not supported"); return(-1); } return SDL_RenderCopy((struct SDL_Texture *)src->hwdata, srcrect, dstrect); };
static int ANDROID_FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color) { Uint8 r, g, b, a; if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if( dst != SDL_CurrentVideoSurface ) { // TODO: hack current_video->info.blit_fill = 0; SDL_FillRect( dst, rect, color ); current_video->info.blit_fill = 1; return(0); } SDL_GetRGBA(color, dst->format, &r, &g, &b, &a); SDL_SetRenderDrawColor( r, g, b, a ); return SDL_RenderFillRect(rect); };
static int ANDROID_SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key) { SDL_PixelFormat format; SDL_Surface * converted = NULL; if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if( !surface->hwdata ) return(-1); if( surface->format->Amask ) return(-1); surface->flags |= SDL_SRCCOLORKEY; ANDROID_UnlockHWSurface(this, surface); // Convert surface using colorkey SDL_SetTextureBlendMode((struct SDL_Texture *)surface->hwdata, SDL_BLENDMODE_BLEND); return 0; };
static void ANDROID_UnlockHWSurface(_THIS, SDL_Surface *surface) { SDL_PixelFormat format; Uint32 hwformat = PixelFormatEnumColorkey; int bpp; SDL_Surface * converted = NULL; if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return; } if( !surface->hwdata ) return; if( surface->format->Amask ) hwformat = PixelFormatEnumAlpha; if( surface == SDL_CurrentVideoSurface ) // Special case hwformat = PixelFormatEnum; /* Allocate the new pixel format for the screen */ SDL_memset(&format, 0, sizeof(format)); SDL_PixelFormatEnumToMasks( hwformat, &bpp, &format.Rmask, &format.Gmask, &format.Bmask, &format.Amask ); format.BytesPerPixel = SDL_ANDROID_BYTESPERPIXEL; format.BitsPerPixel = bpp; // TODO: support 24bpp and 32bpp if( format.BitsPerPixel == surface->format->BitsPerPixel && format.Rmask == surface->format->Rmask && format.Gmask == surface->format->Gmask && format.Bmask == surface->format->Bmask && format.Amask == surface->format->Amask ) { converted = surface; // No need for conversion } else { Uint16 x, y; converted = SDL_CreateRGBSurface(SDL_SWSURFACE, surface->w, surface->h, format.BitsPerPixel, format.Rmask, format.Gmask, format.Bmask, format.Amask); if( !converted ) { SDL_OutOfMemory(); return; } #define CONVERT_RGB565_RGBA5551( pixel ) (0x1 | ( (pixel & 0xFFC0) | ( (pixel & 0x1F) << 1 ) )) if( surface->flags & SDL_SRCCOLORKEY ) { DEBUGOUT("ANDROID_UnlockHWSurface() CONVERT_RGB565_RGBA5551 + colorkey"); for( y = 0; y < surface->h; y++ ) { Uint16* src = (Uint16 *)( surface->pixels + surface->pitch * y ); Uint16* dst = (Uint16 *)( converted->pixels + converted->pitch * y ); Uint16 w = surface->w; Uint16 key = surface->format->colorkey; Uint16 pixel; for( x = 0; x < w; x++, src++, dst++ ) { pixel = *src; *dst = (pixel == key) ? 0 : CONVERT_RGB565_RGBA5551( pixel ); } } } else { DEBUGOUT("ANDROID_UnlockHWSurface() CONVERT_RGB565_RGBA5551"); for( y = 0; y < surface->h; y++ ) { Uint16* src = (Uint16 *)( surface->pixels + surface->pitch * y ); Uint16* dst = (Uint16 *)( converted->pixels + converted->pitch * y ); Uint16 w = surface->w; Uint16 pixel; for( x = 0; x < w; x++, src++, dst++ ) { pixel = *src; *dst = CONVERT_RGB565_RGBA5551( pixel ); } } } } SDL_Rect rect; rect.x = 0; rect.y = 0; rect.w = surface->w; rect.h = surface->h; SDL_UpdateTexture((struct SDL_Texture *)surface->hwdata, &rect, converted->pixels, converted->pitch); if( surface == SDL_CurrentVideoSurface ) // Special case SDL_RenderCopy((struct SDL_Texture *)SDL_CurrentVideoSurface->hwdata, NULL, NULL); if( converted != surface ) SDL_FreeSurface(converted); }
static int ANDROID_LockHWSurface(_THIS, SDL_Surface *surface) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if( surface == SDL_CurrentVideoSurface ) { // Copy pixels from pixelbuffer to video surface - this is slow! Uint16 * row = NULL; int fakeH = SDL_ANDROID_sFakeWindowHeight, fakeW = SDL_ANDROID_sFakeWindowWidth; int realH = SDL_ANDROID_sWindowHeight, realW = SDL_ANDROID_sWindowWidth; int x, y; if( ! SDL_CurrentVideoSurface->pixels ) { glPixelStorei(GL_PACK_ALIGNMENT, 1); SDL_CurrentVideoSurface->pixels = SDL_malloc(SDL_ANDROID_sFakeWindowWidth * SDL_ANDROID_sFakeWindowHeight * SDL_ANDROID_BYTESPERPIXEL); if ( ! SDL_CurrentVideoSurface->pixels ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate buffer for SDL_CurrentVideoSurface"); SDL_SetError("Couldn't allocate buffer for SDL_CurrentVideoSurface"); return(-1); } } if( ! SDL_CurrentVideoSurface->hwdata ) { SDL_CurrentVideoSurface->hwdata = (struct private_hwdata *)SDL_CreateTexture(PixelFormatEnum, SDL_TEXTUREACCESS_STATIC, SDL_ANDROID_sFakeWindowWidth, SDL_ANDROID_sFakeWindowHeight); if( !SDL_CurrentVideoSurface->hwdata ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate texture for SDL_CurrentVideoSurface"); SDL_OutOfMemory(); return(-1); } if( SDL_ANDROID_SmoothVideo ) SDL_SetTextureScaleMode((SDL_Texture *)SDL_CurrentVideoSurface->hwdata, SDL_SCALEMODE_SLOW); // Register main video texture to be recreated when needed HwSurfaceCount++; HwSurfaceList = SDL_realloc( HwSurfaceList, HwSurfaceCount * sizeof(SDL_Surface *) ); HwSurfaceList[HwSurfaceCount-1] = SDL_CurrentVideoSurface; DEBUGOUT("ANDROID_SetVideoMode() HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); } row = SDL_stack_alloc(Uint16, SDL_ANDROID_sWindowWidth); for(y=0; y<fakeH; y++) { // TODO: support 24bpp and 32bpp glReadPixels(0, realH - 1 - (realH * y / fakeH), realW, 1, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, row); for(x=0; x<fakeW; x++) ((Uint16 *)SDL_CurrentVideoSurface->pixels)[ fakeW * y + x ] = row[ x * fakeW / realW ]; } SDL_stack_free(row); } if( !surface->hwdata ) return(-1); // Extra check not necessary /* if( SDL_CurrentVideoSurface->format->BitsPerPixel == surface->format->BitsPerPixel && SDL_CurrentVideoSurface->format->Rmask == surface->format->Rmask && SDL_CurrentVideoSurface->format->Gmask == surface->format->Gmask && SDL_CurrentVideoSurface->format->Bmask == surface->format->Bmask && SDL_CurrentVideoSurface->format->Amask == surface->format->Amask ) return(0); if( this->displayformatalphapixel->BitsPerPixel == surface->format->BitsPerPixel && this->displayformatalphapixel->Rmask == surface->format->Rmask && this->displayformatalphapixel->Gmask == surface->format->Gmask && this->displayformatalphapixel->Bmask == surface->format->Bmask && this->displayformatalphapixel->Amask == surface->format->Amask ) return(0); return(-1); */ return(0); }
static int ANDROID_AllocHWSurface(_THIS, SDL_Surface *surface) { if( !SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return -1; } if ( ! (surface->w && surface->h) ) return(-1); DEBUGOUT("ANDROID_AllocHWSurface() surface %p w %d h %d", surface, surface->w, surface->h); Uint32 format = PixelFormatEnumColorkey; // 1-bit alpha for color key, every surface will have colorkey so it's easier for us if( surface->format->Amask ) { SDL_PixelFormat format1; int bpp; format = PixelFormatEnumAlpha; SDL_memset(&format1, 0, sizeof(format1)); SDL_PixelFormatEnumToMasks( format, &bpp, &format1.Rmask, &format1.Gmask, &format1.Bmask, &format1.Amask ); if( surface->format->BitsPerPixel != bpp || surface->format->Rmask != format1.Rmask || surface->format->Gmask != format1.Gmask || surface->format->Bmask != format1.Bmask || surface->format->Amask != format1.Amask ) return(-1); // Do not allow alpha-surfaces with format other than RGBA4444 (it will be pain to lock/copy them) } else { // HW-accel surface should be RGB565 if( !( SDL_CurrentVideoSurface->format->BitsPerPixel == surface->format->BitsPerPixel && SDL_CurrentVideoSurface->format->Rmask == surface->format->Rmask && SDL_CurrentVideoSurface->format->Gmask == surface->format->Gmask && SDL_CurrentVideoSurface->format->Bmask == surface->format->Bmask && SDL_CurrentVideoSurface->format->Amask == surface->format->Amask ) ) return(-1); } surface->pitch = surface->w * surface->format->BytesPerPixel; surface->pixels = SDL_malloc(surface->h * surface->w * surface->format->BytesPerPixel); if ( surface->pixels == NULL ) { SDL_OutOfMemory(); return(-1); } SDL_memset(surface->pixels, 0, surface->h*surface->pitch); surface->hwdata = (struct private_hwdata *)SDL_CreateTexture(format, SDL_TEXTUREACCESS_STATIC, surface->w, surface->h); if( !surface->hwdata ) { SDL_free(surface->pixels); surface->pixels = NULL; SDL_OutOfMemory(); return(-1); } if( SDL_ANDROID_SmoothVideo ) SDL_SetTextureScaleMode((SDL_Texture *)surface->hwdata, SDL_SCALEMODE_SLOW); if( surface->format->Amask ) { SDL_SetTextureAlphaMod((struct SDL_Texture *)surface->hwdata, SDL_ALPHA_OPAQUE); SDL_SetTextureBlendMode((struct SDL_Texture *)surface->hwdata, SDL_BLENDMODE_BLEND); } surface->flags |= SDL_HWSURFACE | SDL_HWACCEL; HwSurfaceCount++; DEBUGOUT("ANDROID_AllocHWSurface() in HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); HwSurfaceList = SDL_realloc( HwSurfaceList, HwSurfaceCount * sizeof(SDL_Surface *) ); DEBUGOUT("ANDROID_AllocHWSurface() out HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); HwSurfaceList[HwSurfaceCount-1] = surface; return 0; }
SDL_Surface *ANDROID_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags) { SDL_PixelFormat format; int bpp1; __android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_SetVideoMode(): application requested mode %dx%d OpenGL %d HW %d BPP %d", width, height, flags & SDL_OPENGL, flags & SDL_HWSURFACE, SDL_ANDROID_BITSPERPIXEL); if( ! SDL_ANDROID_InsideVideoThread() ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Error: calling %s not from the main thread!", __PRETTY_FUNCTION__); return NULL; } sdl_opengl = (flags & SDL_OPENGL) ? 1 : 0; SDL_ANDROID_sFakeWindowWidth = width; SDL_ANDROID_sFakeWindowHeight = height; current->flags = (flags & SDL_FULLSCREEN) | (flags & SDL_OPENGL) | SDL_DOUBLEBUF | ( flags & SDL_HWSURFACE ); current->w = width; current->h = height; current->pitch = SDL_ANDROID_sFakeWindowWidth * SDL_ANDROID_BYTESPERPIXEL; current->pixels = NULL; current->hwdata = NULL; HwSurfaceCount = 0; HwSurfaceList = NULL; DEBUGOUT("ANDROID_SetVideoMode() HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); if( ! sdl_opengl ) { SDL_DisplayMode mode; SDL_RendererInfo SDL_VideoRendererInfo; SDL_SelectVideoDisplay(0); SDL_VideoWindow = SDL_CreateWindow("", 0, 0, width, height, SDL_WINDOW_SHOWN | SDL_WINDOW_BORDERLESS | SDL_WINDOW_OPENGL); SDL_memset(&mode, 0, sizeof(mode)); mode.format = PixelFormatEnum; SDL_SetWindowDisplayMode(SDL_VideoWindow, &mode); if (SDL_CreateRenderer(SDL_VideoWindow, -1, 0) < 0) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "SDL_SetVideoMode(): Error creating renderer"); return NULL; } SDL_GetRendererInfo(&SDL_VideoRendererInfo); current->hwdata = NULL; if( ! (flags & SDL_HWSURFACE) ) { current->pixels = SDL_malloc(width * height * SDL_ANDROID_BYTESPERPIXEL); if ( ! current->pixels ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate buffer for requested mode"); SDL_SetError("Couldn't allocate buffer for requested mode"); return(NULL); } SDL_memset(current->pixels, 0, width * height * SDL_ANDROID_BYTESPERPIXEL); current->hwdata = (struct private_hwdata *)SDL_CreateTexture(PixelFormatEnum, SDL_TEXTUREACCESS_STATIC, width, height); if( !current->hwdata ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate texture for SDL_CurrentVideoSurface"); SDL_free(current->pixels); current->pixels = NULL; SDL_OutOfMemory(); return(NULL); } if( SDL_ANDROID_SmoothVideo ) SDL_SetTextureScaleMode((SDL_Texture *)current->hwdata, SDL_SCALEMODE_SLOW); // Register main video texture to be recreated when needed HwSurfaceCount++; HwSurfaceList = SDL_realloc( HwSurfaceList, HwSurfaceCount * sizeof(SDL_Surface *) ); HwSurfaceList[HwSurfaceCount-1] = current; DEBUGOUT("ANDROID_SetVideoMode() HwSurfaceCount %d HwSurfaceList %p", HwSurfaceCount, HwSurfaceList); } glViewport(0, 0, SDL_ANDROID_sRealWindowWidth, SDL_ANDROID_sRealWindowHeight); glOrthof(0.0, (GLfloat) SDL_ANDROID_sWindowWidth, (GLfloat) SDL_ANDROID_sWindowHeight, 0.0, 0.0, 1.0); } /* Allocate the new pixel format for the screen */ SDL_memset(&format, 0, sizeof(format)); SDL_PixelFormatEnumToMasks( PixelFormatEnum, &bpp1, &format.Rmask, &format.Gmask, &format.Bmask, &format.Amask ); format.BitsPerPixel = bpp1; format.BytesPerPixel = SDL_ANDROID_BYTESPERPIXEL; if ( ! SDL_ReallocFormat(current, SDL_ANDROID_BITSPERPIXEL, format.Rmask, format.Gmask, format.Bmask, format.Amask) ) { __android_log_print(ANDROID_LOG_INFO, "libSDL", "Couldn't allocate new pixel format for requested mode"); SDL_SetError("Couldn't allocate new pixel format for requested mode"); return(NULL); } /* Set up the new mode framebuffer */ SDL_CurrentVideoSurface = current; /* We're done */ return(current); }