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);
9497d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner    display->bpp         = aconfig_int(node, "bpp", 16);
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    display->valid = ( display->rect.size.w > 0 && display->rect.size.h > 0 );
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (display->valid) {
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SkinRect  r;
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_rect_rotate( &r, &display->rect, -display->rotation );
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qframebuffer_init( display->qfbuff,
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           r.size.w,
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           r.size.h,
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                           0,
10597d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner                           display->bpp == 32 ? QFRAME_BUFFER_RGBX_8888
10697d795c955f8d261a0a5294d49ea06d5a473ed03David 'Digit' Turner                                              : QFRAME_BUFFER_RGB565 );
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        qframebuffer_fifo_add( display->qfbuff );
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return display->valid ? 0 : -1;
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN BUTTON
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char*     name;
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AndroidKeyCode  code;
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} KeyInfo;
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic KeyInfo  _keyinfo_table[] = {
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "dpad-up",      kKeyCodeDpadUp },
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "dpad-down",    kKeyCodeDpadDown },
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "dpad-left",    kKeyCodeDpadLeft },
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "dpad-right",   kKeyCodeDpadRight },
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "dpad-center",  kKeyCodeDpadCenter },
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "soft-left",    kKeyCodeSoftLeft },
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "soft-right",   kKeyCodeSoftRight },
1308b870f0a99f484e4357b2664471eab12dadec327David 'Digit' Turner    { "search",       kKeyCodeSearch },
1317e61121b1801fdc63722a402bb9839746b63ddf9soledad penades    { "camera",       kKeyCodeCamera },
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "volume-up",    kKeyCodeVolumeUp },
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "volume-down",  kKeyCodeVolumeDown },
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "power",        kKeyCodePower },
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "home",         kKeyCodeHome },
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "back",         kKeyCodeBack },
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "del",          kKeyCodeDel },
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "0",            kKeyCode0 },
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "1",            kKeyCode1 },
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "2",            kKeyCode2 },
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "3",            kKeyCode3 },
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "4",            kKeyCode4 },
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "5",            kKeyCode5 },
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "6",            kKeyCode6 },
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "7",            kKeyCode7 },
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "8",            kKeyCode8 },
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "9",            kKeyCode9 },
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "star",         kKeyCodeStar },
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "pound",        kKeyCodePound },
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "phone-dial",   kKeyCodeCall },
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "phone-hangup", kKeyCodeEndCall },
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "q",            kKeyCodeQ },
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "w",            kKeyCodeW },
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "e",            kKeyCodeE },
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "r",            kKeyCodeR },
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "t",            kKeyCodeT },
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "y",            kKeyCodeY },
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "u",            kKeyCodeU },
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "i",            kKeyCodeI },
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "o",            kKeyCodeO },
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "p",            kKeyCodeP },
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "a",            kKeyCodeA },
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "s",            kKeyCodeS },
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "d",            kKeyCodeD },
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "f",            kKeyCodeF },
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "g",            kKeyCodeG },
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "h",            kKeyCodeH },
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "j",            kKeyCodeJ },
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "k",            kKeyCodeK },
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "l",            kKeyCodeL },
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "DEL",          kKeyCodeDel },
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "z",            kKeyCodeZ },
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "x",            kKeyCodeX },
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "c",            kKeyCodeC },
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "v",            kKeyCodeV },
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "b",            kKeyCodeB },
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "n",            kKeyCodeN },
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "m",            kKeyCodeM },
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "COMMA",        kKeyCodeComma },
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "PERIOD",       kKeyCodePeriod },
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ENTER",        kKeyCodeNewline },
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "AT",           kKeyCodeAt },
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "SPACE",        kKeyCodeSpace },
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "SLASH",        kKeyCodeSlash },
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "CAP",          kKeyCodeCapLeft },
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "SYM",          kKeyCodeSym },
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ALT",          kKeyCodeAltLeft },
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "ALT2",         kKeyCodeAltRight },
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { "CAP2",         kKeyCodeCapRight },
19062ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "tv",           kKeyCodeTV },
19162ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "epg",          kKeyCodeEPG },
19262ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "dvr",          kKeyCodeDVR },
19362ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "prev",         kKeyCodePrevious },
19462ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "next",         kKeyCodeNext },
19562ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "play",         kKeyCodePlay },
19662ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "pause",        kKeyCodePause },
19762ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "stop",         kKeyCodeStop },
19862ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "rev",          kKeyCodeRewind },
19962ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "ffwd",         kKeyCodeFastForward },
20062ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "bookmarks",    kKeyCodeBookmarks },
20162ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "window",       kKeyCodeCycleWindows },
20262ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "channel-up",   kKeyCodeChannelUp },
20362ffc423bdf158d98ee2902916963c4fde7fbe47Maciek Molerus    { "channel-down", kKeyCodeChannelDown },
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    { 0, 0 },
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic unsigned
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectkeyinfo_lookup_code(const char *name)
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    KeyInfo *ki = _keyinfo_table;
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while(ki->name) {
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if(!strcmp(name, ki->name))
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return ki->code;
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ki++;
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_button_free( SkinButton*  button )
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (button) {
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_image_unref( &button->image );
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        AFREE(button);
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinButton*
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_button_create_from( AConfig*   node, const char*  basepath )
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinButton*  button;
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(button);
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (button) {
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        const char*  img = aconfig_str(node, "image", NULL);
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int          x   = aconfig_int(node, "x", 0);
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int          y   = aconfig_int(node, "y", 0);
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        button->name       = node->name;
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        button->rect.pos.x = x;
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        button->rect.pos.y = y;
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (img != NULL)
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            button->image = skin_image_find_in( basepath, img );
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (button->image == SKIN_IMAGE_NONE) {
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            skin_button_free(button);
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return NULL;
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        button->rect.size.w = skin_image_w( button->image );
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        button->rect.size.h = skin_image_h( button->image );
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        button->keycode = keyinfo_lookup_code( button->name );
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (button->keycode == 0) {
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            dprint( "Warning: skin file button uses unknown key name '%s'", button->name );
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return button;
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN PART
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_free( SkinPart*  part )
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part) {
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_background_done( part->background );
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_display_done( part->display );
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_PART_LOOP_BUTTONS(part,button)
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            skin_button_free(button);
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_PART_LOOP_END
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        part->buttons = NULL;
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        AFREE(part);
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinLocation*
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_location_create_from_v2( AConfig*  node, SkinPart*  parts )
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char*    partname = aconfig_str(node, "name", NULL);
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int            x        = aconfig_int(node, "x", 0);
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int            y        = aconfig_int(node, "y", 0);
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinRotation   rot      = aconfig_int(node, "rotation", SKIN_ROTATION_0);
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinPart*      part;
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinLocation*  location;
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (partname == NULL) {
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        dprint( "### WARNING: ignoring part location without 'name' element" );
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return NULL;
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (part = parts; part; part = part->next)
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!strcmp(part->name, partname))
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part == NULL) {
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        dprint( "### WARNING: ignoring part location with unknown name '%s'", partname );
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return NULL;
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(location);
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    location->part     = part;
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    location->anchor.x = x;
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    location->anchor.y = y;
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    location->rotation = rot;
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return location;
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinPart*
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_create_from_v1( AConfig*  root, const char*  basepath )
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinPart*  part;
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig*  node;
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinBox   box;
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(part);
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    part->name = root->name;
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(root, "background");
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node)
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_background_init_from(part->background, node, basepath);
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(root, "display");
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node)
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_display_init_from(part->display, node);
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(root, "button");
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node) {
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for (node = node->first_child; node != NULL; node = node->next)
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            SkinButton*  button = skin_button_create_from(node, basepath);
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (button != NULL) {
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                button->next  = part->buttons;
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                part->buttons = button;
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    skin_box_minmax_init( &box );
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part->background->valid)
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_box_minmax_update( &box, &part->background->rect );
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part->display->valid)
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_box_minmax_update( &box, &part->display->rect );
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_PART_LOOP_BUTTONS(part, button)
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_box_minmax_update( &box, &button->rect );
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_PART_LOOP_END
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ( !skin_box_minmax_to_rect( &box, &part->rect ) ) {
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_part_free(part);
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        part = NULL;
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return part;
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinPart*
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_part_create_from_v2( AConfig*  root, const char*  basepath )
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinPart*  part;
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig*  node;
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinBox   box;
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(part);
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    part->name = root->name;
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(root, "background");
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node)
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_background_init_from(part->background, node, basepath);
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(root, "display");
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node)
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_display_init_from(part->display, node);
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(root, "buttons");
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node) {
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for (node = node->first_child; node != NULL; node = node->next)
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            SkinButton*  button = skin_button_create_from(node, basepath);
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (button != NULL) {
3898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                button->next  = part->buttons;
3908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                part->buttons = button;
3918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    skin_box_minmax_init( &box );
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part->background->valid)
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_box_minmax_update( &box, &part->background->rect );
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part->display->valid)
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_box_minmax_update( &box, &part->display->rect );
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_PART_LOOP_BUTTONS(part, button)
4048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_box_minmax_update( &box, &button->rect );
4058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_PART_LOOP_END
4068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ( !skin_box_minmax_to_rect( &box, &part->rect ) ) {
4088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_part_free(part);
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        part = NULL;
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return part;
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN LAYOUT
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_free( SkinLayout*  layout )
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (layout) {
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_LAYOUT_LOOP_LOCS(layout,loc)
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            AFREE(loc);
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_LAYOUT_LOOP_END
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->locations = NULL;
425a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        if (layout->onion_image) {
426a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume          skin_image_unref( &layout->onion_image );
427a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        }
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        AFREE(layout);
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinDisplay*
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_get_display( SkinLayout*  layout )
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_LAYOUT_LOOP_LOCS(layout,loc)
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SkinPart*  part = loc->part;
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (part->display->valid) {
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return part->display;
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_LAYOUT_LOOP_END
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return NULL;
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinRotation
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_get_dpad_rotation( SkinLayout*  layout )
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
44787250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner    if (layout->has_dpad_rotation)
44887250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner        return layout->dpad_rotation;
44987250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_LAYOUT_LOOP_LOCS(layout, loc)
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SkinPart*  part = loc->part;
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_PART_LOOP_BUTTONS(part,button)
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (button->keycode == kKeyCodeDpadUp)
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                return loc->rotation;
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_PART_LOOP_END
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SKIN_LAYOUT_LOOP_END
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return SKIN_ROTATION_0;
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_layout_event_decode( const char*  event, int  *ptype, int  *pcode, int *pvalue )
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    typedef struct {
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        const char*  name;
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int          value;
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } EventName;
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    static const EventName  _event_names[] = {
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        { "EV_SW", 0x05 },
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        { NULL, 0 },
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    };
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char*       x = strchr(event, ':');
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const char*       y = NULL;
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const EventName*  ev = _event_names;
4788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (x != NULL)
4808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        y = strchr(x+1, ':');
4818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (x == NULL || y == NULL) {
4838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        dprint( "### WARNING: invalid skin layout event format: '%s', should be '<TYPE>:<CODE>:<VALUE>'", event );
4848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
4858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for ( ; ev->name != NULL; ev++ )
4888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!memcmp( event, ev->name, x - event ) && ev->name[x-event] == 0)
4898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
4908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!ev->name) {
4928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        dprint( "### WARNING: unrecognized skin layout event name: %.*s", x-event, event );
4938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
4948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *ptype  = ev->value;
4978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *pcode  = strtol(x+1, NULL, 0);
4988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *pvalue = strtol(y+1, NULL, 0);
4998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
5008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic SkinLayout*
503a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blumeskin_layout_create_from_v2( AConfig*  root, SkinPart*  parts, const char*  basepath )
5048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinLayout*    layout;
5068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int            width, height;
5078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinLocation** ptail;
5088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig*       node;
5098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(layout);
5118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    width  = aconfig_int( root, "width", 400 );
5138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    height = aconfig_int( root, "height", 400 );
5148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find( root, "event" );
5168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node != NULL) {
5178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        skin_layout_event_decode( node->value,
5188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                  &layout->event_type,
5198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                  &layout->event_code,
5208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                                  &layout->event_value );
5218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
5228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->event_type  = 0x05;  /* close keyboard by default */
5238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->event_code  = 0;
5248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->event_value = 1;
5258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    layout->name  = root->name;
5288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    layout->color = aconfig_unsigned( root, "color", 0x808080 ) | 0xff000000;
5298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ptail         = &layout->locations;
5308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
53187250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner    node = aconfig_find( root, "dpad-rotation" );
53287250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner    if (node != NULL) {
53387250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner        layout->dpad_rotation     = aconfig_int( root, "dpad-rotation", 0 );
53487250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner        layout->has_dpad_rotation = 1;
53587250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner    }
53687250c24aec9449eb615951cf537a2fcf709f1d8David 'Digit' Turner
537a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume    node = aconfig_find( root, "onion" );
538a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume    if (node != NULL) {
539a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        const char* img = aconfig_str(node, "image", NULL);
540a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        layout->onion_image = skin_image_find_in( basepath, img );
541a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        if (layout->onion_image == SKIN_IMAGE_NONE) {
542a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume            layout->onion_image = NULL;
543a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        }
544a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        // In layout file, alpha is specified in range 0-100. Convert to
545a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        // internal range 0-256 with default=128.
546a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        int alpha = aconfig_int( node, "alpha", 50 );
547a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        layout->onion_alpha = (256*alpha)/100;
548a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume        layout->onion_rotation = aconfig_int( node, "rotation", 0 );
549a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume    }
550a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume
5518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (node = root->first_child; node; node = node->next)
5528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
5538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (!memcmp(node->name, "part", 4)) {
5548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            SkinLocation*  location = skin_location_create_from_v2( node, parts );
5558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (location == NULL) {
5568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                continue;
5578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
5588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *ptail = location;
5598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            ptail  = &location->next;
5608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
5618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
5628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (layout->locations == NULL)
5648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        goto Fail;
5658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    layout->size.w = width;
5678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    layout->size.h = height;
5688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return layout;
5708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectFail:
5728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    skin_layout_free(layout);
5738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return NULL;
5748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
5758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/** SKIN FILE
5778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project **/
5788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
5808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_load_from_v1( SkinFile*  file, AConfig*  aconfig, const char*  basepath )
5818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
5828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinPart*      part;
5838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinLayout*    layout;
5848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinLayout**   ptail = &file->layouts;
5858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinLocation*  location;
5868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int            nn;
5878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    file->parts = part = skin_part_create_from_v1( aconfig, basepath );
5898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (part == NULL)
5908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
5918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (nn = 0; nn < 2; nn++)
5938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
5948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ANEW0(layout);
5958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->color = 0xff808080;
5978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
5988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ANEW0(location);
5998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->event_type  = 0x05;  /* close keyboard by default */
6018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->event_code  = 0;
6028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->event_value = 1;
6038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        location->part     = part;
6058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch (nn) {
6068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 0:
6078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.x = 0;
6088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.y = 0;
6098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->rotation = SKIN_ROTATION_0;
6108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->size       = part->rect.size;
6118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
6128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0
6148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 1:
6158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.x = part->rect.size.h;
6168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.y = 0;
6178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->rotation = SKIN_ROTATION_90;
6188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->size.w     = part->rect.size.h;
6198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->size.h     = part->rect.size.w;
6208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->event_value = 0;
6218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
6228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case 2:
6248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.x = part->rect.size.w;
6258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.y = part->rect.size.h;
6268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->rotation = SKIN_ROTATION_180;
6278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->size       = part->rect.size;
6288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
6298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
6308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            default:
6318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.x = 0;
6328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->anchor.y = part->rect.size.w;
6338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                location->rotation = SKIN_ROTATION_270;
6348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->size.w     = part->rect.size.h;
6358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->size.h     = part->rect.size.w;
6368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                layout->event_value = 0;
6378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
6388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
6398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        layout->locations = location;
6408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        *ptail = layout;
6428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        ptail  = &layout->next;
6438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
64459e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner    file->version = 1;
6458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
6468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
6478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
6498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_load_from_v2( SkinFile*  file, AConfig*  aconfig, const char*  basepath )
6508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
6518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig*  node;
6528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* first, load all parts */
6548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(aconfig, "parts");
6558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node == NULL)
6568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
6578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else
6588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
6598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SkinPart**  ptail = &file->parts;
6608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for (node = node->first_child; node != NULL; node = node->next)
6618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
6628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            SkinPart*  part = skin_part_create_from_v2( node, basepath );
6638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (part == NULL) {
6648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                dprint( "## WARNING: can't load part '%s' from skin\n", node->name ? "<NULL>" : node->name );
6658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                continue;
6668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            part->next = NULL;
6688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *ptail     = part;
6698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            ptail      = &part->next;
6708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
6718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
6728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (file->parts == NULL)
6748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
6758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
6768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* then load all layouts */
6778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = aconfig_find(aconfig, "layouts");
6788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node == NULL)
6798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
6808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else
6818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
6828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SkinLayout**  ptail = &file->layouts;
6838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for (node = node->first_child; node != NULL; node = node->next)
6848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
685a95a4dc1d37f9fa2f133e750312ee5c3440c4710Arthur Blume            SkinLayout*  layout = skin_layout_create_from_v2( node, file->parts, basepath );
6868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (layout == NULL) {
6878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                dprint( "## WARNING: ignoring layout in skin file" );
6888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                continue;
6898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
6908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            *ptail = layout;
6918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            layout->next = NULL;
6928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            ptail        = &layout->next;
6938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
6948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
6958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (file->layouts == NULL)
6968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
6978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
69859e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner    file->version = 2;
6998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
7008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSkinFile*
7038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_create_from_aconfig( AConfig*   aconfig, const char*  basepath )
7048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    SkinFile*  file;
7068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    ANEW0(file);
70859e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner
7098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ( aconfig_find(aconfig, "parts") != NULL) {
7108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (skin_file_load_from_v2( file, aconfig, basepath ) < 0) {
71159e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner            goto BAD_FILE;
71259e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner        }
71359e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner        file->version = aconfig_int(aconfig, "version", 2);
71459e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner        /* The file version must be 1 or higher */
71559e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner        if (file->version <= 0) {
71659e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner            dprint( "## WARNING: invalid skin version: %d", file->version);
71759e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner            goto BAD_FILE;
7188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
7198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
7208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else {
7218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (skin_file_load_from_v1( file, aconfig, basepath ) < 0) {
72259e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner            goto BAD_FILE;
7238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
72459e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner        file->version = 1;
7258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
7268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return file;
72759e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner
72859e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' TurnerBAD_FILE:
72959e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner    skin_file_free( file );
73059e8e1969c6543cc9375b1a4372ef2e3e8afa183David 'Digit' Turner    return NULL;
7318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
7328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
7348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectskin_file_free( SkinFile*  file )
7358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
7368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (file) {
7378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_FILE_LOOP_LAYOUTS(file,layout)
7388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            skin_layout_free(layout);
7398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_FILE_LOOP_END_LAYOUTS
7408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        file->layouts = NULL;
7418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_FILE_LOOP_PARTS(file,part)
7438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            skin_part_free(part);
7448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        SKIN_FILE_LOOP_END_PARTS
7458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        file->parts = NULL;
7468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
7478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        AFREE(file);
7488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
7498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
750