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
015package cpw.mods.fml.client;
016
017import java.util.BitSet;
018import java.util.HashMap;
019import java.util.logging.Level;
020
021import cpw.mods.fml.common.FMLCommonHandler;
022import cpw.mods.fml.common.FMLLog;
023
024/**
025 * @author cpw
026 *
027 */
028public 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            FMLLog.log("fml.TextureManager", Level.FINE, "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("fml.TextureManager", 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("fml.TextureManager", 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}