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 }