18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms. 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful, 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details. 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/ 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/surface.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/skin/argb.h" 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <SDL.h> 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define DEBUG 1 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if DEBUG 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) VERBOSE_PRINT(surface,__VA_ARGS__) 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define D(...) ((void)0) 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct SkinSurface { 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int refcount; 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* pixels; 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* surface; 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurfaceDoneFunc done_func; 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* done_user; 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_free( SkinSurface* s ) 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s->done_func) { 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->done_func( s->done_user ); 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->done_func = NULL; 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s->surface) { 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_FreeSurface(s->surface); 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->surface = NULL; 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(s); 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern SkinSurface* 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_ref( SkinSurface* surface ) 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (surface) 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project surface->refcount += 1; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return surface; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_unrefp( SkinSurface* *psurface ) 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurface* surf = *psurface; 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (surf) { 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (--surf->refcount <= 0) 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_surface_free(surf); 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *psurface = NULL; 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_set_done( SkinSurface* s, SkinSurfaceDoneFunc done_func, void* done_user ) 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->done_func = done_func; 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->done_user = done_user; 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if SDL_BYTEORDER == SDL_BIG_ENDIAN 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_R_MASK 0xff000000 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_G_MASK 0x00ff0000 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_B_MASK 0x0000ff00 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_A_MASK 0x000000ff 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_R_MASK 0x000000ff 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_G_MASK 0x0000ff00 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_B_MASK 0x00ff0000 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project# define ARGB32_A_MASK 0xff000000 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SDL_Surface* 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_sdl_surface_create_rgb( int width, 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int height, 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int depth, 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int flags ) 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Uint32 rmask, gmask, bmask, amask; 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (depth == 8) { 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rmask = gmask = bmask = 0; 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amask = 0xff; 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (depth == 32) { 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rmask = ARGB32_R_MASK; 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gmask = ARGB32_G_MASK; 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bmask = ARGB32_B_MASK; 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amask = ARGB32_A_MASK; 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SDL_CreateRGBSurface( flags, width, height, depth, 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rmask, gmask, bmask, amask ); 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SDL_Surface* 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_sdl_surface_create_rgb_from( int width, 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int height, 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pitch, 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* pixels, 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int depth ) 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project Uint32 rmask, gmask, bmask, amask; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (depth == 8) { 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rmask = gmask = bmask = 0; 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amask = 0xff; 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else if (depth == 32) { 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rmask = ARGB32_R_MASK; 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project gmask = ARGB32_G_MASK; 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project bmask = ARGB32_B_MASK; 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project amask = ARGB32_A_MASK; 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else 1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SDL_CreateRGBSurfaceFrom( pixels, width, height, pitch, depth, 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project rmask, gmask, bmask, amask ); 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinSurface* 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_skin_surface_create( SDL_Surface* surface, 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void* pixels ) 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurface* s = malloc(sizeof(*s)); 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s != NULL) { 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->refcount = 1; 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->pixels = pixels; 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->surface = surface; 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->done_func = NULL; 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s->done_user = NULL; 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_FreeSurface(surface); 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project free(pixels); 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "not enough memory to allocate new skin surface !" ); 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return s; 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinSurface* 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_create_fast( int w, int h ) 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* surface; 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project surface = _sdl_surface_create_rgb( w, h, 32, SDL_HWSURFACE ); 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (surface == NULL) { 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project surface = _sdl_surface_create_rgb( w, h, 32, SDL_SWSURFACE ); 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (surface == NULL) { 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "could not create fast %dx%d ARGB32 surface: %s", 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w, h, SDL_GetError() ); 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _skin_surface_create( surface, NULL ); 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinSurface* 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_create_slow( int w, int h ) 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* surface; 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project surface = _sdl_surface_create_rgb( w, h, 32, SDL_SWSURFACE ); 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (surface == NULL) { 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "could not create slow %dx%d ARGB32 surface: %s", 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w, h, SDL_GetError() ); 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _skin_surface_create( surface, NULL ); 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinSurface* 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_create_argb32_from( 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int w, 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h, 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pitch, 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* pixels, 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int do_copy ) 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* surface; 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* pixcopy = NULL; 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (do_copy) { 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project size_t size = h*pitch; 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pixcopy = malloc( size ); 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (pixcopy == NULL && size > 0) { 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "not enough memory to create %dx%d ARGB32 surface", 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w, h ); 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( pixcopy, pixels, size ); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project surface = _sdl_surface_create_rgb_from( w, h, pitch, 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pixcopy ? pixcopy : pixels, 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 32 ); 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (surface == NULL) { 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "could not create %dx%d slow ARGB32 surface: %s", 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w, h, SDL_GetError() ); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return _skin_surface_create( surface, pixcopy ); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern int 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_lock( SkinSurface* s, SkinSurfacePixels *pix ) 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!s || !s->surface) { 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "error: trying to lock stale surface %p", s ); 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( SDL_LockSurface( s->surface ) != 0 ) { 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project D( "could not lock surface %p: %s", s, SDL_GetError() ); 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix->w = s->surface->w; 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix->h = s->surface->h; 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix->pitch = s->surface->pitch; 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project pix->pixels = s->surface->pixels; 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* unlock a slow surface that was previously locked */ 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_unlock( SkinSurface* s ) 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s && s->surface) 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_UnlockSurface( s->surface ); 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic uint32_t 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_map_argb( SkinSurface* s, uint32_t c ) 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (s && s->surface) { 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SDL_MapRGBA( s->surface->format, 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((c) >> 16) & 255, 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((c) >> 8) & 255, 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((c) & 255), 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ((c) >> 24) & 255 ); 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0x00000000; 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct { 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x; 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y; 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int w; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx; 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy; 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* dst_line; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int dst_pitch; 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* dst_lock; 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* src_line; 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int src_pitch; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_Surface* src_lock; 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t src_color; 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} SkinBlit; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_blit_init_fill( SkinBlit* blit, 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurface* dst, 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRect* dst_rect, 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t color ) 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = dst_rect->pos.x; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = dst_rect->pos.y; 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int w = dst_rect->size.w; 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h = dst_rect->size.h; 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int delta; 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x < 0) { 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w += x; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x = 0; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delta = (x + w) - dst->surface->w; 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delta > 0) 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w -= delta; 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (y < 0) { 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project h += y; 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = 0; 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delta = (y + h) - dst->surface->h; 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delta > 0) 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project h -= delta; 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (w <= 0 || h <= 0) 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->x = x; 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->y = y; 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->w = w; 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->h = h; 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !SDL_LockSurface(dst->surface) ) 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->dst_lock = dst->surface; 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->dst_pitch = dst->surface->pitch; 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->dst_line = dst->surface->pixels + y*blit->dst_pitch; 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->src_lock = NULL; 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->src_color = color; 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 1; 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_blit_init_blit( SkinBlit* blit, 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurface* dst, 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPos* dst_pos, 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurface* src, 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRect* src_rect ) 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = dst_pos->x; 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = dst_pos->y; 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sx = src_rect->pos.x; 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int sy = src_rect->pos.y; 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int w = src_rect->size.w; 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int h = src_rect->size.h; 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int delta; 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x < 0) { 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w += x; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx -= x; 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x = 0; 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sx < 0) { 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w += sx; 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project x -= sx; 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sx = 0; 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delta = (x + w) - dst->surface->w; 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delta > 0) 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w -= delta; 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delta = (sx + w) - src->surface->w; 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delta > 0) 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project w -= delta; 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (y < 0) { 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project h += y; 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy += y; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = 0; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (sy < 0) { 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project h += sy; 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y -= sy; 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project sy = 0; 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delta = (y + h) - dst->surface->h; 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (delta > 0) 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project h -= delta; 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project delta = (sy + h) - src->surface->h; 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (w <= 0 || h <= 0) 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->x = x; 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->y = y; 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->w = w; 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->h = h; 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->sx = sx; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->sy = sy; 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !SDL_LockSurface(dst->surface) ) 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->dst_lock = dst->surface; 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->dst_pitch = dst->surface->pitch; 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->dst_line = (uint8_t*) dst->surface->pixels + y*blit->dst_pitch; 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !SDL_LockSurface(src->surface) ) { 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_UnlockSurface(dst->surface); 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->src_lock = src->surface; 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->src_pitch = src->surface->pitch; 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project blit->src_line = (uint8_t*) src->surface->pixels + sy*blit->src_pitch; 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 1; 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_blit_done( SkinBlit* blit ) 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (blit->src_lock) 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_UnlockSurface( blit->src_lock ); 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (blit->dst_lock) 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SDL_UnlockSurface( blit->dst_lock ); 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DONE; 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*SkinLineFillFunc)( uint32_t* dst, uint32_t color, int len ); 4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*SkinLineBlitFunc)( uint32_t* dst, const uint32_t* src, int len ); 4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_line_fill_copy( uint32_t* dst, uint32_t color, int len ) 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* end = dst + len; 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (dst + 4 <= end) { 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst[0] = dst[1] = dst[2] = dst[3] = color; 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 4; 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while (dst < end) { 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst[0] = color; 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dst += 1; 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_line_fill_srcover( uint32_t* dst, uint32_t color, int len ) 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* end = dst + len; 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t alpha = (color >> 24); 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (alpha == 255) 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_line_fill_copy(dst, color, len); 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(src_c); 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 255 - alpha; 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha += (alpha >> 7); 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_UNPACK(src_c,color); 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < end; dst++ ) 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(dst_c); 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(dst_c,dst); 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_MULSHIFT(dst_c,dst_c,alpha,8); 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(dst_c,src_c); 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(dst_c,dst); 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_line_fill_dstover( uint32_t* dst, uint32_t color, int len ) 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* end = dst + len; 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(src_c); 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_UNPACK(src_c,color); 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < end; dst++ ) 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(dst_c); 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(val); 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t alpha; 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(dst_c,dst); 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 256 - (dst[0] >> 24); 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_MULSHIFT(val,src_c,alpha,8); 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(val,dst_c); 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(val,dst); 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_fill( SkinSurface* dst, 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRect* rect, 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t argb_premul, 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBlitOp blitop ) 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLineFillFunc fill; 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBlit blit[1]; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (blitop) { 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_BLIT_COPY: fill = skin_line_fill_copy; break; 5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_BLIT_SRCOVER: fill = skin_line_fill_srcover; break; 5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_BLIT_DSTOVER: fill = skin_line_fill_dstover; break; 5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return; 5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( skin_blit_init_fill( blit, dst, rect, argb_premul ) ) { 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* line = blit->dst_line; 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pitch = blit->dst_pitch; 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* end = line + pitch*blit->h; 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; line != end; line += pitch ) 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project fill( (uint32_t*)line + blit->x, argb_premul, blit->w ); 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_line_blit_copy( uint32_t* dst, const uint32_t* src, int len ) 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project memcpy( (char*)dst, (const char*)src, len*4 ); 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_line_blit_srcover( uint32_t* dst, const uint32_t* src, int len ) 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* end = dst + len; 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < end; dst++ ) { 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(d); 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(v); 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t alpha; 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (src[0] >> 24); 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (alpha > 0) { 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(d,dst); 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 256 - alpha; 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_MULSHIFT(v,d,alpha,8); 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(v,d); 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(v,dst); 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_line_blit_dstover( uint32_t* dst, const uint32_t* src, int len ) 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t* end = dst + len; 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL_ZERO(); 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; dst < end; dst++ ) { 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(s); 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_DECL(v); 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint32_t alpha; 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = (dst[0] >> 24); 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (alpha < 255) { 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_READ(s,src); 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project alpha = 256 - alpha; 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_MULSHIFT(v,s,alpha,8); 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_ADD(v,s); 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ARGB_WRITE(v,dst); 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectextern void 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_surface_blit( SkinSurface* dst, 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPos* dst_pos, 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinSurface* src, 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRect* src_rect, 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBlitOp blitop ) 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLineBlitFunc func; 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBlit blit[1]; 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (blitop) { 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_BLIT_COPY: func = skin_line_blit_copy; break; 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_BLIT_SRCOVER: func = skin_line_blit_srcover; break; 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case SKIN_BLIT_DSTOVER: func = skin_line_blit_dstover; break; 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: return; 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( skin_blit_init_blit( blit, dst, dst_pos, src, src_rect ) ) { 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* line = blit->dst_line; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* sline = blit->src_line; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int pitch = blit->dst_pitch; 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int spitch = blit->src_pitch; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project uint8_t* end = line + pitch*blit->h; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; line != end; line += pitch, sline += spitch ) 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project func( (uint32_t*)line + blit->x, (uint32_t*)sline + blit->sx, blit->w ); 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_blit_done(blit); 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 610