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/file.h" 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h" 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/charmap.h" 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/bufprint.h" 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/system.h" 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/debug.h" 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project//#include "qemu-common.h" 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** UTILITY ROUTINES 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinImage* 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_image_find_in( const char* dirname, const char* filename ) 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char buffer[1024]; 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* p = buffer; 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project char* end = p + sizeof(buffer); 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = bufprint( p, end, "%s" PATH_SEP "%s", dirname, filename ); 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (p >= end) 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SKIN_IMAGE_NONE; 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return skin_image_find_simple(buffer); 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN BACKGROUND 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_background_done( SkinBackground* background ) 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (background->image) 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_image_unref(&background->image); 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_background_init_from( SkinBackground* background, 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node, 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* basepath ) 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* img = aconfig_str(node, "image", NULL); 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = aconfig_int(node, "x", 0); 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = aconfig_int(node, "y", 0); 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->valid = 0; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (img == NULL) /* no background */ 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->image = skin_image_find_in( basepath, img ); 628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (background->image == SKIN_IMAGE_NONE) { 638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->image = NULL; 648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.pos.x = x; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.pos.y = y; 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.size.w = skin_image_w( background->image ); 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->rect.size.h = skin_image_h( background->image ); 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project background->valid = 1; 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN DISPLAY 788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_display_done( SkinDisplay* display ) 828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_done( display->qfbuff ); 848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_display_init_from( SkinDisplay* display, AConfig* node ) 888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.pos.x = aconfig_int(node, "x", 0); 908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.pos.y = aconfig_int(node, "y", 0); 918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.size.w = aconfig_int(node, "width", 0); 928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rect.size.h = aconfig_int(node, "height", 0); 938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->rotation = aconfig_unsigned(node, "rotation", SKIN_ROTATION_0); 948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project display->valid = ( display->rect.size.w > 0 && display->rect.size.h > 0 ); 968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (display->valid) { 988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRect r; 998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_rect_rotate( &r, &display->rect, -display->rotation ); 1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_init( display->qfbuff, 1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r.size.w, 1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project r.size.h, 1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 0, 1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project QFRAME_BUFFER_RGB565 ); 1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qframebuffer_fifo_add( display->qfbuff ); 1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return display->valid ? 0 : -1; 1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN BUTTON 1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct 1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AndroidKeyCode code; 1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} KeyInfo; 1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic KeyInfo _keyinfo_table[] = { 1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-up", kKeyCodeDpadUp }, 1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-down", kKeyCodeDpadDown }, 1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-left", kKeyCodeDpadLeft }, 1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-right", kKeyCodeDpadRight }, 1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "dpad-center", kKeyCodeDpadCenter }, 1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "soft-left", kKeyCodeSoftLeft }, 1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "soft-right", kKeyCodeSoftRight }, 1288b870f0a99f484e4357b2664471eab12dadec327David 'Digit' Turner { "search", kKeyCodeSearch }, 1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "volume-up", kKeyCodeVolumeUp }, 1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "volume-down", kKeyCodeVolumeDown }, 1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "power", kKeyCodePower }, 1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "home", kKeyCodeHome }, 1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "back", kKeyCodeBack }, 1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "del", kKeyCodeDel }, 1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "0", kKeyCode0 }, 1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "1", kKeyCode1 }, 1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "2", kKeyCode2 }, 1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "3", kKeyCode3 }, 1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "4", kKeyCode4 }, 1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "5", kKeyCode5 }, 1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "6", kKeyCode6 }, 1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "7", kKeyCode7 }, 1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "8", kKeyCode8 }, 1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "9", kKeyCode9 }, 1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "star", kKeyCodeStar }, 1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "pound", kKeyCodePound }, 1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "phone-dial", kKeyCodeCall }, 1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "phone-hangup", kKeyCodeEndCall }, 1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "q", kKeyCodeQ }, 1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "w", kKeyCodeW }, 1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "e", kKeyCodeE }, 1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "r", kKeyCodeR }, 1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "t", kKeyCodeT }, 1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "y", kKeyCodeY }, 1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "u", kKeyCodeU }, 1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "i", kKeyCodeI }, 1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "o", kKeyCodeO }, 1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "p", kKeyCodeP }, 1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "a", kKeyCodeA }, 1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "s", kKeyCodeS }, 1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "d", kKeyCodeD }, 1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "f", kKeyCodeF }, 1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "g", kKeyCodeG }, 1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "h", kKeyCodeH }, 1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "j", kKeyCodeJ }, 1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "k", kKeyCodeK }, 1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "l", kKeyCodeL }, 1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "DEL", kKeyCodeDel }, 1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "z", kKeyCodeZ }, 1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "x", kKeyCodeX }, 1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "c", kKeyCodeC }, 1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "v", kKeyCodeV }, 1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "b", kKeyCodeB }, 1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "n", kKeyCodeN }, 1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "m", kKeyCodeM }, 1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "COMMA", kKeyCodeComma }, 1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "PERIOD", kKeyCodePeriod }, 1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ENTER", kKeyCodeNewline }, 1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "AT", kKeyCodeAt }, 1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "SPACE", kKeyCodeSpace }, 1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "SLASH", kKeyCodeSlash }, 1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "CAP", kKeyCodeCapLeft }, 1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "SYM", kKeyCodeSym }, 1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ALT", kKeyCodeAltLeft }, 1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "ALT2", kKeyCodeAltRight }, 1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "CAP2", kKeyCodeCapRight }, 1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 0, 0 }, 1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned 1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectkeyinfo_lookup_code(const char *name) 1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project KeyInfo *ki = _keyinfo_table; 1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project while(ki->name) { 1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if(!strcmp(name, ki->name)) 1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return ki->code; 1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ki++; 1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_button_free( SkinButton* button ) 2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button) { 2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_image_unref( &button->image ); 2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(button); 2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinButton* 2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_button_create_from( AConfig* node, const char* basepath ) 2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinButton* button; 2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(button); 2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button) { 2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* img = aconfig_str(node, "image", NULL); 2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = aconfig_int(node, "x", 0); 2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = aconfig_int(node, "y", 0); 2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->name = node->name; 2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.pos.x = x; 2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.pos.y = y; 2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (img != NULL) 2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->image = skin_image_find_in( basepath, img ); 2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button->image == SKIN_IMAGE_NONE) { 2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_button_free(button); 2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.size.w = skin_image_w( button->image ); 2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->rect.size.h = skin_image_h( button->image ); 2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->keycode = keyinfo_lookup_code( button->name ); 2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button->keycode == 0) { 2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "Warning: skin file button uses unknown key name '%s'", button->name ); 2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return button; 2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN PART 2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_free( SkinPart* part ) 2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part) { 2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_background_done( part->background ); 2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_display_done( part->display ); 2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part,button) 2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_button_free(button); 2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->buttons = NULL; 2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(part); 2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinLocation* 2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_location_create_from_v2( AConfig* node, SkinPart* parts ) 2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* partname = aconfig_str(node, "name", NULL); 2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int x = aconfig_int(node, "x", 0); 2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int y = aconfig_int(node, "y", 0); 2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinRotation rot = aconfig_int(node, "rotation", SKIN_ROTATION_0); 2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation* location; 2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (partname == NULL) { 2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: ignoring part location without 'name' element" ); 2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (part = parts; part; part = part->next) 2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!strcmp(part->name, partname)) 2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part == NULL) { 2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: ignoring part location with unknown name '%s'", partname ); 2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(location); 2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->part = part; 2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = x; 2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = y; 2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = rot; 2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return location; 2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinPart* 2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_create_from_v1( AConfig* root, const char* basepath ) 2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBox box; 3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(part); 3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->name = root->name; 3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "background"); 3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_background_init_from(part->background, node, basepath); 3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "display"); 3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_display_init_from(part->display, node); 3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "button"); 3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) { 3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinButton* button = skin_button_create_from(node, basepath); 3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button != NULL) { 3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->next = part->buttons; 3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->buttons = button; 3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_init( &box ); 3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->background->valid) 3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->background->rect ); 3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->display->valid) 3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->display->rect ); 3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part, button) 3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &button->rect ); 3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_box_minmax_to_rect( &box, &part->rect ) ) { 3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_part_free(part); 3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part = NULL; 3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return part; 3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinPart* 3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_create_from_v2( AConfig* root, const char* basepath ) 3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinBox box; 3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(part); 3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->name = root->name; 3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "background"); 3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_background_init_from(part->background, node, basepath); 3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "display"); 3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) 3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_display_init_from(part->display, node); 3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(root, "buttons"); 3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node) { 3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinButton* button = skin_button_create_from(node, basepath); 3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button != NULL) { 3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project button->next = part->buttons; 3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->buttons = button; 3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_init( &box ); 3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->background->valid) 3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->background->rect ); 3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->display->valid) 3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &part->display->rect ); 3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part, button) 3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_box_minmax_update( &box, &button->rect ); 3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( !skin_box_minmax_to_rect( &box, &part->rect ) ) { 3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_part_free(part); 3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part = NULL; 3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return part; 3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN LAYOUT 3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void 4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_free( SkinLayout* layout ) 4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout) { 4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_LOCS(layout,loc) 4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(loc); 4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_END 4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->locations = NULL; 4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(layout); 4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinDisplay* 4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_get_display( SkinLayout* layout ) 4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_LOCS(layout,loc) 4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part = loc->part; 4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part->display->valid) { 4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return part->display; 4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_END 4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinRotation 4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_get_dpad_rotation( SkinLayout* layout ) 4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 42787250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner if (layout->has_dpad_rotation) 42887250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner return layout->dpad_rotation; 42987250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner 4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_LOCS(layout, loc) 4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part = loc->part; 4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_BUTTONS(part,button) 4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (button->keycode == kKeyCodeDpadUp) 4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return loc->rotation; 4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_PART_LOOP_END 4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_LAYOUT_LOOP_END 4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return SKIN_ROTATION_0; 4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_event_decode( const char* event, int *ptype, int *pcode, int *pvalue ) 4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project typedef struct { 4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* name; 4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int value; 4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } EventName; 4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project static const EventName _event_names[] = { 4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { "EV_SW", 0x05 }, 4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { NULL, 0 }, 4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* x = strchr(event, ':'); 4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const char* y = NULL; 4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project const EventName* ev = _event_names; 4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x != NULL) 4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project y = strchr(x+1, ':'); 4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (x == NULL || y == NULL) { 4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: invalid skin layout event format: '%s', should be '<TYPE>:<CODE>:<VALUE>'", event ); 4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for ( ; ev->name != NULL; ev++ ) 4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!memcmp( event, ev->name, x - event ) && ev->name[x-event] == 0) 4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!ev->name) { 4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "### WARNING: unrecognized skin layout event name: %.*s", x-event, event ); 4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptype = ev->value; 4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pcode = strtol(x+1, NULL, 0); 4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *pvalue = strtol(y+1, NULL, 0); 4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinLayout* 4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_create_from_v2( AConfig* root, SkinPart* parts ) 4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout; 4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int width, height; 4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation** ptail; 4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(layout); 4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project width = aconfig_int( root, "width", 400 ); 4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project height = aconfig_int( root, "height", 400 ); 4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find( root, "event" ); 4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node != NULL) { 4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_layout_event_decode( node->value, 4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &layout->event_type, 4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &layout->event_code, 5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project &layout->event_value ); 5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } else { 5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_type = 0x05; /* close keyboard by default */ 5038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_code = 0; 5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 1; 5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->name = root->name; 5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->color = aconfig_unsigned( root, "color", 0x808080 ) | 0xff000000; 5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &layout->locations; 5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 51187250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner node = aconfig_find( root, "dpad-rotation" ); 51287250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner if (node != NULL) { 51387250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner layout->dpad_rotation = aconfig_int( root, "dpad-rotation", 0 ); 51487250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner layout->has_dpad_rotation = 1; 51587250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner } 51687250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner 5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = root->first_child; node; node = node->next) 5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!memcmp(node->name, "part", 4)) { 5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation* location = skin_location_create_from_v2( node, parts ); 5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (location == NULL) { 5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = location; 5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &location->next; 5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout->locations == NULL) 5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project goto Fail; 5318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.w = width; 5338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.h = height; 5348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return layout; 5368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFail: 5388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_layout_free(layout); 5398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return NULL; 5408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 5418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN FILE 5438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/ 5448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 5468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_load_from_v1( SkinFile* file, AConfig* aconfig, const char* basepath ) 5478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 5488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part; 5498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout; 5508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout** ptail = &file->layouts; 5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLocation* location; 5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int nn; 5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file->parts = part = skin_part_create_from_v1( aconfig, basepath ); 5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part == NULL) 5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (nn = 0; nn < 2; nn++) 5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(layout); 5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->color = 0xff808080; 5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(location); 5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_type = 0x05; /* close keyboard by default */ 5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_code = 0; 5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 1; 5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->part = part; 5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project switch (nn) { 5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 0: 5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = 0; 5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = 0; 5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_0; 5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size = part->rect.size; 5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0 5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 1: 5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = part->rect.size.h; 5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = 0; 5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_90; 5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.w = part->rect.size.h; 5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.h = part->rect.size.w; 5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 0; 5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project case 2: 5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = part->rect.size.w; 5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = part->rect.size.h; 5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_180; 5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size = part->rect.size; 5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project default: 5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.x = 0; 5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->anchor.y = part->rect.size.w; 5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project location->rotation = SKIN_ROTATION_270; 6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.w = part->rect.size.h; 6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->size.h = part->rect.size.w; 6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->event_value = 0; 6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project break; 6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->locations = location; 6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = layout; 6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &layout->next; 6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int 6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_load_from_v2( SkinFile* file, AConfig* aconfig, const char* basepath ) 6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AConfig* node; 6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* first, load all parts */ 6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(aconfig, "parts"); 6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node == NULL) 6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart** ptail = &file->parts; 6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinPart* part = skin_part_create_from_v2( node, basepath ); 6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (part == NULL) { 6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "## WARNING: can't load part '%s' from skin\n", node->name ? "<NULL>" : node->name ); 6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project part->next = NULL; 6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = part; 6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &part->next; 6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (file->parts == NULL) 6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* then load all layouts */ 6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project node = aconfig_find(aconfig, "layouts"); 6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (node == NULL) 6448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else 6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout** ptail = &file->layouts; 6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (node = node->first_child; node != NULL; node = node->next) 6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project { 6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinLayout* layout = skin_layout_create_from_v2( node, file->parts ); 6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (layout == NULL) { 6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project dprint( "## WARNING: ignoring layout in skin file" ); 6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project continue; 6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *ptail = layout; 6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project layout->next = NULL; 6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ptail = &layout->next; 6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (file->layouts == NULL) 6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return -1; 6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return 0; 6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinFile* 6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_create_from_aconfig( AConfig* aconfig, const char* basepath ) 6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SkinFile* file; 6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project ANEW0(file); 6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if ( aconfig_find(aconfig, "parts") != NULL) { 6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_file_load_from_v2( file, aconfig, basepath ) < 0) { 6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_file_free( file ); 6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file = NULL; 6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project else { 6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (skin_file_load_from_v1( file, aconfig, basepath ) < 0) { 6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_file_free( file ); 6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file = NULL; 6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return file; 6858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid 6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_free( SkinFile* file ) 6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (file) { 6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_LAYOUTS(file,layout) 6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_layout_free(layout); 6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_END_LAYOUTS 6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file->layouts = NULL; 6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_PARTS(file,part) 6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project skin_part_free(part); 6988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project SKIN_FILE_LOOP_END_PARTS 6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project file->parts = NULL; 7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project AFREE(file); 7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 704