1/* Copyright (C) 2007-2008 The Android Open Source Project 2** 3** This software is licensed under the terms of the GNU General Public 4** License version 2, as published by the Free Software Foundation, and 5** may be copied, distributed, and modified under those terms. 6** 7** This program is distributed in the hope that it will be useful, 8** but WITHOUT ANY WARRANTY; without even the implied warranty of 9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10** GNU General Public License for more details. 11*/ 12#ifndef _ANDROID_SKIN_IMAGE_H 13#define _ANDROID_SKIN_IMAGE_H 14 15#include "android/android.h" 16#include <SDL.h> 17#include "android/skin/rect.h" 18 19/* helper functions */ 20 21extern SDL_Surface* sdl_surface_from_argb32( void* base, int w, int h ); 22 23/* skin image file objects */ 24 25/* opaque skin image type. all skin images are placed in a simple MRU cache 26 * to limit the emulator's memory usage, with the exception of 'clones' created 27 * with skin_image_clone() or skin_image_clone_blend() 28 */ 29typedef struct SkinImage SkinImage; 30 31/* a descriptor for a given skin image */ 32typedef struct SkinImageDesc { 33 const char* path; /* image file path (must be .png) */ 34 AndroidRotation rotation; /* rotation */ 35 int blend; /* blending, 0..256 value */ 36} SkinImageDesc; 37 38#define SKIN_BLEND_NONE 0 39#define SKIN_BLEND_HALF 128 40#define SKIN_BLEND_FULL 256 41 42/* a special value returned when an image cannot be properly loaded */ 43extern SkinImage* SKIN_IMAGE_NONE; 44 45/* return the SDL_Surface* pointer of a given skin image */ 46extern SDL_Surface* skin_image_surface( SkinImage* image ); 47extern int skin_image_w ( SkinImage* image ); 48extern int skin_image_h ( SkinImage* image ); 49extern int skin_image_org_w ( SkinImage* image ); 50extern int skin_image_org_h ( SkinImage* image ); 51 52/* get an image from the cache (load it from the file if necessary). 53 * returns SKIN_IMAGE_NONE in case of error. cannot return NULL 54 * this function also increments the reference count of the skin image, 55 * use "skin_image_unref()" when you don't need it anymore 56 */ 57extern SkinImage* skin_image_find( SkinImageDesc* desc ); 58 59extern SkinImage* skin_image_find_simple( const char* path ); 60 61/* increment the reference count of a given skin image, 62 * don't do anything if 'image' is NULL */ 63extern SkinImage* skin_image_ref( SkinImage* image ); 64 65/* decrement the reference count of a given skin image. if 66 * the count reaches 0, the image becomes eligible for cache flushing. 67 * unless it was created through a skin_image_clone... function, where 68 * it is immediately discarded... 69 */ 70extern void skin_image_unref( SkinImage** pimage ); 71 72/* get the rotation of a given image. this decrements the reference count 73 * of the source after returning the target, whose reference count is incremented 74 */ 75extern SkinImage* skin_image_rotate( SkinImage* source, SkinRotation rotation ); 76 77/* create a skin image clone. the clone is not part of the cache and will 78 * be destroyed immediately when its reference count reaches 0. this is useful 79 * if you need to modify the content of the clone (e.g. blending) 80 */ 81extern SkinImage* skin_image_clone( SkinImage* source ); 82 83/* create a skin image clone, the clone is a rotated version of a source image 84 */ 85extern SkinImage* skin_image_clone_full( SkinImage* source, 86 SkinRotation rotation, 87 int blend ); 88 89/* apply blending to a source skin image and copy the result to a target clone image */ 90extern void skin_image_blend_clone( SkinImage* clone, SkinImage* source, int blend ); 91 92#endif /* _ANDROID_SKIN_IMAGE_H */ 93