diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/ShortestFloatFormatter.java b/src/main/java/com/kamesuta/mc/bnnwidget/ShortestFloatFormatter.java new file mode 100644 index 00000000..d605a626 --- /dev/null +++ b/src/main/java/com/kamesuta/mc/bnnwidget/ShortestFloatFormatter.java @@ -0,0 +1,35 @@ +package com.kamesuta.mc.bnnwidget; + +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; + +public class ShortestFloatFormatter { + private static final DecimalFormat signformat; + + static { + final DecimalFormat format = new DecimalFormat(".##"); + final DecimalFormatSymbols custom = new DecimalFormatSymbols(); + custom.setDecimalSeparator('.'); + format.setDecimalFormatSymbols(custom); + signformat = format; + } + + public static String format(final float f) { + if (f==0) + return "0"; + + final String str = signformat.format(f); + + final String cut = ".0"; + + int end = str.length(); + int last = cut.length(); + + while (end!=0&&last!=0) + if (cut.charAt(last-1)==str.charAt(end-1)) + end--; + else + last--; + return str.substring(0, end); + } +} diff --git a/src/main/java/com/kamesuta/mc/bnnwidget/component/MNumber.java b/src/main/java/com/kamesuta/mc/bnnwidget/component/MNumber.java index 62fb5d1f..3c90209c 100644 --- a/src/main/java/com/kamesuta/mc/bnnwidget/component/MNumber.java +++ b/src/main/java/com/kamesuta/mc/bnnwidget/component/MNumber.java @@ -1,17 +1,15 @@ package com.kamesuta.mc.bnnwidget.component; -import java.text.DecimalFormat; - import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import com.kamesuta.mc.bnnwidget.ShortestFloatFormatter; import com.kamesuta.mc.bnnwidget.WEvent; import com.kamesuta.mc.bnnwidget.WPanel; import com.kamesuta.mc.bnnwidget.position.Area; import com.kamesuta.mc.bnnwidget.position.Coord; import com.kamesuta.mc.bnnwidget.position.Point; import com.kamesuta.mc.bnnwidget.position.R; -import com.kamesuta.mc.signpic.image.meta.ImageMeta.MetaParser; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.resources.I18n; @@ -54,7 +52,7 @@ else if (GuiScreen.isCtrlKeyDown()) f = .01f; else f = 1f; - MNumber.this.field.setText(format(NumberUtils.toFloat(MNumber.this.field.getText())-f)); + MNumber.this.field.setText(ShortestFloatFormatter.format(NumberUtils.toFloat(MNumber.this.field.getText())-f)); return true; } @@ -66,12 +64,12 @@ else if (GuiScreen.isCtrlKeyDown()) f = .01f; else f = 1f; - MNumber.this.field.setText(format(NumberUtils.toFloat(MNumber.this.field.getText())+f)); + MNumber.this.field.setText(ShortestFloatFormatter.format(NumberUtils.toFloat(MNumber.this.field.getText())+f)); return true; } public MNumber setNumber(final float f) { - this.field.setText(Float.isNaN(f) ? "" : MetaParser.format(f)); + this.field.setText(Float.isNaN(f) ? "" : ShortestFloatFormatter.format(f)); return this; } @@ -95,25 +93,4 @@ public MNumber setUnknownLabel(final String s) { protected void onNumberChanged(final String oldText, final String newText) { } - - private static final DecimalFormat signformat = new DecimalFormat(".##"); - - public static String format(final float f) { - if (f==0) - return "0"; - - final String str = signformat.format(f); - - final String cut = ".0"; - - int end = str.length(); - int last = cut.length(); - - while (end!=0&&last!=0) - if (cut.charAt(last-1)==str.charAt(end-1)) - end--; - else - last--; - return str.substring(0, end); - } } diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java b/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java index fa4149e2..f0fc34c4 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/EntryId.java @@ -63,10 +63,14 @@ public static EntryId fromStrings(final String[] strings) { } public static EntryId fromTile(final TileEntitySign tile) { + if (tile==null) + return blank; return fromStrings(tile.signText); } public static EntryId fromChats(final IChatComponent[] chats) { + if (chats==null) + return blank; final StringBuilder stb = new StringBuilder(); for (final IChatComponent chat : chats) if (chat!=null) @@ -75,6 +79,8 @@ public static EntryId fromChats(final IChatComponent[] chats) { } public static EntryId fromItemStack(final ItemStack itemStack) { + if (itemStack==null) + return blank; final String name = itemStack.getDisplayName(); final int index = StringUtils.lastIndexOf(name, "}"); return from(StringUtils.substring(itemStack.getDisplayName(), 0, index!=StringUtils.INDEX_NOT_FOUND ? index+1 : 0)); diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java b/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java index e3b7791d..7dd6c7dd 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/EntryManager.java @@ -9,7 +9,7 @@ public class EntryManager implements ITickEntry { public static final EntryManager instance = new EntryManager(); - private final Map> registry = Maps.newHashMap(); + private final Map> registry = Maps.newConcurrentMap(); protected Entry get(final EntryId id) { final EntrySlot entries = this.registry.get(id); @@ -29,9 +29,8 @@ public void onTick() { final Map.Entry> entry = itr.next(); final EntrySlot collectableSignEntry = entry.getValue(); - if (collectableSignEntry.shouldCollect()) { + if (collectableSignEntry.shouldCollect()) itr.remove(); - } } } } diff --git a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java index d477eae4..8641bd5b 100644 --- a/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java +++ b/src/main/java/com/kamesuta/mc/signpic/entry/content/ContentManager.java @@ -1,13 +1,14 @@ package com.kamesuta.mc.signpic.entry.content; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.Map.Entry; +import java.util.Queue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import com.google.common.collect.Maps; +import com.google.common.collect.Queues; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.kamesuta.mc.signpic.Config; import com.kamesuta.mc.signpic.CoreEvent; @@ -23,9 +24,9 @@ public class ContentManager implements ITickEntry { public final ExecutorService threadpool = Executors.newFixedThreadPool(Config.instance.contentLoadThreads, new ThreadFactoryBuilder().setNameFormat("signpic-content-%d").build()); - private final HashMap registry = new HashMap(); - private final Deque loadqueue = new ArrayDeque(); - private final Deque divisionqueue = new ArrayDeque(); + private final Map registry = Maps.newConcurrentMap(); + private final Queue loadqueue = Queues.newConcurrentLinkedQueue(); + private final Queue divisionqueue = Queues.newConcurrentLinkedQueue(); private int loadtick = 0; private int divisiontick = 0; @@ -46,9 +47,7 @@ public void run() { } public void enqueueDivision(final IDivisionProcessable divisionProcessable) { - synchronized (this.divisionqueue) { - this.divisionqueue.offer(divisionProcessable); - } + this.divisionqueue.offer(divisionProcessable); } protected Content get(final ContentId id) { @@ -82,9 +81,7 @@ public void onTick() { if ((divisionprocess = this.divisionqueue.peek())!=null) try { if (divisionprocess.onDivisionProcess()) - synchronized (this.divisionqueue) { - this.divisionqueue.poll(); - } + this.divisionqueue.poll(); } catch (final Exception e) { e.printStackTrace(); } diff --git a/src/main/java/com/kamesuta/mc/signpic/gui/GuiImage.java b/src/main/java/com/kamesuta/mc/signpic/gui/GuiImage.java index 073a3cf7..2147b16c 100644 --- a/src/main/java/com/kamesuta/mc/signpic/gui/GuiImage.java +++ b/src/main/java/com/kamesuta/mc/signpic/gui/GuiImage.java @@ -93,7 +93,7 @@ public void draw(final WEvent ev, final Area pgp, final Point p, final float fra add(new WPanel(new R()) { @Override protected void initWidget() { - final VCommon var = V.range(V.a(.5f), V.a(.8f), V.p(.5f)); + final VCommon var = V.a(.8f); add(new UpdateLogo(new R(Coord.width(var), Coord.height(var), Coord.pleft(.5f), Coord.ptop(.5f)).child(Coord.pleft(-.5f), Coord.ptop(-.5f)))); add(new MScaledLabel(new R(Coord.pleft(.5f), Coord.top(0), Coord.pheight(.4f), Coord.width(2)).child(Coord.pleft(-.5f))).setText(I18n.format("signpic.advmsg.format.unsupported")).setColor(0xff9900).setShadow(true)); if (Informations.instance.isUpdateRequired()) diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java index b1962ad6..3084c152 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageMeta.java @@ -1,6 +1,5 @@ package com.kamesuta.mc.signpic.image.meta; -import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -77,27 +76,6 @@ public String toString() { } public static abstract class MetaParser { - private static final DecimalFormat signformat = new DecimalFormat(".##"); - - public static String format(final float f) { - if (f==0) - return "0"; - - final String str = signformat.format(f); - - final String cut = ".0"; - - int end = str.length(); - int last = cut.length(); - - while (end!=0&&last!=0) - if (cut.charAt(last-1)==str.charAt(end-1)) - end--; - else - last--; - return str.substring(0, end); - } - public abstract boolean parse(String src, String key, String value); public abstract MetaParser reset(); diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageOffset.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageOffset.java index 5754d653..ee2c7f9e 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageOffset.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageOffset.java @@ -3,6 +3,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import com.kamesuta.mc.bnnwidget.ShortestFloatFormatter; + public class ImageOffset extends ImageMeta.MetaParser { public static final float defaultOffset = 0.5f; @@ -56,24 +58,24 @@ public String compose() { if (this.x!=0) if (this.x<0) if (this.x==-defaultOffset) stb.append("L"); - else stb.append("L").append(format(-this.x)); + else stb.append("L").append(ShortestFloatFormatter.format(-this.x)); else if (this.x==defaultOffset) stb.append("R"); - else stb.append("R").append(format(this.x)); + else stb.append("R").append(ShortestFloatFormatter.format(this.x)); if (this.y!=0) if (this.y<0) if (this.y==-defaultOffset) stb.append("D"); - else stb.append("D").append(format(-this.y)); + else stb.append("D").append(ShortestFloatFormatter.format(-this.y)); else if (this.y==defaultOffset) stb.append("U"); - else stb.append("U").append(format(this.y)); + else stb.append("U").append(ShortestFloatFormatter.format(this.y)); if (this.z!=0) if (this.z<0) if (this.z==-defaultOffset) stb.append("B"); - else stb.append("B").append(format(-this.z)); + else stb.append("B").append(ShortestFloatFormatter.format(-this.z)); else if (this.z==defaultOffset) stb.append("F"); - else stb.append("F").append(format(this.z)); + else stb.append("F").append(ShortestFloatFormatter.format(this.z)); return stb.toString(); /* @formatter:on */ } diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageRotation.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageRotation.java index 92cfad0c..a420c1c5 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageRotation.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageRotation.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import com.kamesuta.mc.bnnwidget.ShortestFloatFormatter; import com.kamesuta.mc.signpic.render.OpenGL; public class ImageRotation extends ImageMeta.MetaParser { @@ -71,7 +72,7 @@ public String compose() { else if (rotate==defaultOffset) return this.type.name(); else - return this.type.name()+format(rotate); + return this.type.name()+ShortestFloatFormatter.format(rotate); } } diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java index 94a1315a..bd9217d6 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageSize.java @@ -3,6 +3,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import com.kamesuta.mc.bnnwidget.ShortestFloatFormatter; import com.kamesuta.mc.bnnwidget.position.Area; public class ImageSize extends ImageMeta.MetaParser implements Cloneable { @@ -140,7 +141,7 @@ else if (StringUtils.equals(key, "x")) @Override public String compose() { - return (vaildWidth() ? format(this.width) : "")+(vaildHeight() ? "x"+format(this.height) : ""); + return (vaildWidth() ? ShortestFloatFormatter.format(this.width) : "")+(vaildHeight() ? "x"+ShortestFloatFormatter.format(this.height) : ""); } @Override diff --git a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageTextureMap.java b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageTextureMap.java index 9253ec04..65dbeea1 100644 --- a/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageTextureMap.java +++ b/src/main/java/com/kamesuta/mc/signpic/image/meta/ImageTextureMap.java @@ -3,6 +3,8 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; +import com.kamesuta.mc.bnnwidget.ShortestFloatFormatter; + public class ImageTextureMap extends ImageMeta.MetaParser { public static final float defaultUV = 0f; // Width Height @@ -58,19 +60,19 @@ public boolean parse(final String src, final String key, final String value) { public String compose() { final StringBuilder stb = new StringBuilder(); if (this.u!=defaultUV) - stb.append("u").append(format(this.u)); + stb.append("u").append(ShortestFloatFormatter.format(this.u)); if (this.v!=defaultUV) - stb.append("v").append(format(this.v)); + stb.append("v").append(ShortestFloatFormatter.format(this.v)); if (this.w!=defaultWH) - stb.append("w").append(format(this.w)); + stb.append("w").append(ShortestFloatFormatter.format(this.w)); if (this.h!=defaultWH) - stb.append("h").append(format(this.h)); + stb.append("h").append(ShortestFloatFormatter.format(this.h)); if (this.c!=defaultCS) - stb.append("c").append(format(this.c)); + stb.append("c").append(ShortestFloatFormatter.format(this.c)); if (this.s!=defaultCS) - stb.append("s").append(format(this.s)); + stb.append("s").append(ShortestFloatFormatter.format(this.s)); if (this.o!=defaultOpacity) - stb.append("o").append(format(this.o)); + stb.append("o").append(ShortestFloatFormatter.format(this.o)); if (this.r!=defaultRepeat) stb.append("r"); if (this.m!=defaultMipMap)