package com.minelittlepony.pony.data; import java.awt.image.BufferedImage; /** * Individual trigger pixels for a pony skin. * */ @SuppressWarnings("unchecked") public enum TriggerPixels { RACE(PonyRace.HUMAN, Channel.ALL, 0, 0), TAIL(TailLengths.FULL, Channel.ALL, 1, 0), GENDER(PonyGender.MARE, Channel.ALL, 2, 0), SIZE(PonySize.NORMAL, Channel.ALL, 3, 0), GLOW(null, Channel.RAW, 0, 1), WEARABLES(PonyWearable.NONE, Channel.RAW, 1, 1); private int x; private int y; private Channel channel; ITriggerPixelMapped def; TriggerPixels(ITriggerPixelMapped def, Channel channel, int x, int y) { this.def = def; this.channel = channel; this.x = x; this.y = y; } /** * Reads this trigger pixel's value and returns the raw colour. * * @param image Image to read */ public int readColor(BufferedImage image) { return channel.readValue(x, y, image); } /** * Reads this trigger pixel's value and parses it to an Enum instance. * * @param image Image to read */ public & ITriggerPixelMapped> T readValue(BufferedImage image) { if (Channel.ALPHA.readValue(x, y, image) < 255) { return (T)def; } return ITriggerPixelMapped.getByTriggerPixel((T)def, readColor(image)); } public & ITriggerPixelMapped> boolean[] readFlags(BufferedImage image) { boolean[] out = new boolean[def.getClass().getEnumConstants().length]; readFlags(out, image); return out; } public & ITriggerPixelMapped> void readFlags(boolean[] out, BufferedImage image) { readFlag(out, Channel.RED, image); readFlag(out, Channel.GREEN, image); readFlag(out, Channel.BLUE, image); } private & ITriggerPixelMapped> void readFlag(boolean[] out, Channel channel, BufferedImage image) { if (Channel.ALPHA.readValue(x, y, image) < 255) { return; } T value = ITriggerPixelMapped.getByTriggerPixel((T)def, channel.readValue(x, y, image)); out[value.ordinal()] |= value != def; } enum Channel { RAW(-1, 0), ALL (0xffffff, 0), ALPHA(0xff, 24), RED (0xff, 16), GREEN(0xff, 8), BLUE (0xff, 0); private int mask; private int offset; Channel(int mask, int offset) { this.mask = mask; this.offset = offset; } public int readValue(int x, int y, BufferedImage image) { return (image.getRGB(x, y) >> offset) & mask; } } }