    001    /*
    002     * The FML Forge Mod Loader suite.
    003     * Copyright (C) 2012 cpw
    004     *
    005     * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free
    006     * Software Foundation; either version 2.1 of the License, or any later version.
    007     *
    008     * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
    009     * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
    010     *
    011     * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51
    012     * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    013     */
    014
    015    package cpw.mods.fml.client;
    016
    017    import java.util.BitSet;
    018    import java.util.HashMap;
    019    import java.util.logging.Level;
    020
    021    import cpw.mods.fml.common.FMLCommonHandler;
    022    import cpw.mods.fml.common.FMLLog;
    023
    024    /**
    025     * @author cpw
    026     *
    027     */
    028    public class SpriteHelper
    029    {
    030        private static HashMap<String, BitSet> spriteInfo = new HashMap<String, BitSet>();
    031
    032        private static void initMCSpriteMaps() {
    033            BitSet slots =
    034                    SpriteHelper.toBitSet(
    035                    "0000000000000000" +
    036                    "0000000000110000" +
    037                    "0000000000100000" +
    038                    "0000000001100000" +
    039                    "0000000000000000" +
    040                    "0000000000000000" +
    041                    "0000000000000000" +
    042                    "0000000000000000" +
    043                    "0000000000000000" +
    044                    "0000000000000000" +
    045                    "0000000000000000" +
    046                    "0000000000011111" +
    047                    "0000000000000000" +
    048                    "0000000001111100" +
    049                    "0000000001111000" +
    050                    "0000000000000000");
    051            spriteInfo.put("/terrain.png", slots);
    052
    053            slots = SpriteHelper.toBitSet(
    054                    "0000000000000000" +
    055                    "0000000000000000" +
    056                    "0000000000000000" +
    057                    "0000000000000000" +
    058                    "0000000000000000" +
    059                    "0000000000000000" +
    060                    "0000000000000000" +
    061                    "0000000000000000" +
    062                    "0000000000000000" +
    063                    "0111110000000000" +
    064                    "1111111010000000" +
    065                    "0111111110000000" +
    066                    "0111111111111001" +
    067                    "1111111111111111" +
    068                    "0000011111111111" +
    069                    "0000000000000000");
    070            spriteInfo.put("/gui/items.png", slots);
    071        }
    072        /**
    073         * Register a sprite map for ModTextureStatic, to allow for other mods to override
    074         * your sprite page.
    075         *
    076         *
    077         */
    078        public static void registerSpriteMapForFile(String file, String spriteMap) {
    079            if (spriteInfo.size() == 0) {
    080                initMCSpriteMaps();
    081            }
    082            if (spriteInfo.containsKey(file)) {
    083                FMLCommonHandler.instance().getFMLLogger().finer(String.format("Duplicate attempt to register a sprite file %s for overriding -- ignoring",file));
    084                return;
    085            }
    086            spriteInfo.put(file, toBitSet(spriteMap));
    087        }
    088
    089        public static int getUniqueSpriteIndex(String path)
    090        {
    091            if (!spriteInfo.containsKey("/terrain.png"))
    092            {
    093                initMCSpriteMaps();
    094            }
    095
    096            BitSet slots = spriteInfo.get(path);
    097
    098            if (slots == null)
    099            {
    100                Exception ex = new Exception(String.format("Invalid getUniqueSpriteIndex call for texture: %s", path));
    101                FMLLog.log(Level.SEVERE, ex, "A critical error has been detected with sprite overrides");
    102                FMLCommonHandler.instance().raiseException(ex,"Invalid request to getUniqueSpriteIndex",true);
    103            }
    104
    105            int ret = getFreeSlot(slots);
    106
    107            if (ret == -1)
    108            {
    109                Exception ex = new Exception(String.format("No more sprite indicies left for: %s", path));
    110                FMLLog.log(Level.SEVERE, ex, "There are no sprite indicies left for %s", path);
    111                FMLCommonHandler.instance().raiseException(ex,"No more sprite indicies left", true);
    112            }
    113            return ret;
    114        }
    115
    116        public static BitSet toBitSet(String data)
    117        {
    118            BitSet ret = new BitSet(data.length());
    119            for (int x = 0; x < data.length(); x++)
    120            {
    121                ret.set(x, data.charAt(x) == '1');
    122            }
    123            return ret;
    124        }
    125
    126        public static int getFreeSlot(BitSet slots)
    127        {
    128            int next=slots.nextSetBit(0);
    129            slots.clear(next);
    130            return next;
    131        }
    132
    133        public static int freeSlotCount(String textureToOverride)
    134        {
    135            return spriteInfo.get(textureToOverride).cardinality();
    136        }
    137
    138    }