QuantizeSpecConverter.java 5.71 KB
/*
 * Decompiled with CFR 0_118.
 * 
 * Could not load the following classes:
 *  com.scene7.is.sleng.QuantizeColorDitherEnum
 *  com.scene7.is.sleng.QuantizeColorPaletteTypeEnum
 *  com.scene7.is.sleng.QuantizeColorSet
 *  com.scene7.is.sleng.QuantizeSpec
 *  com.scene7.is.sleng.QuantizeSpec$Builder
 *  com.scene7.is.util.Converter
 *  com.scene7.is.util.text.Parser
 *  com.scene7.is.util.text.ParserUtil
 *  com.scene7.is.util.text.ParsingException
 *  com.scene7.is.util.text.parsers.EnumParser
 *  com.scene7.is.util.text.parsers.IntegerParser
 *  org.apache.commons.beanutils.ConversionException
 *  org.apache.commons.collections.primitives.ArrayByteList
 *  org.jetbrains.annotations.NotNull
 */
package com.scene7.is.ps.provider.parsers;

import com.scene7.is.sleng.QuantizeColorDitherEnum;
import com.scene7.is.sleng.QuantizeColorPaletteTypeEnum;
import com.scene7.is.sleng.QuantizeColorSet;
import com.scene7.is.sleng.QuantizeSpec;
import com.scene7.is.util.Converter;
import com.scene7.is.util.text.Parser;
import com.scene7.is.util.text.ParserUtil;
import com.scene7.is.util.text.ParsingException;
import com.scene7.is.util.text.parsers.EnumParser;
import com.scene7.is.util.text.parsers.IntegerParser;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.ConversionException;
import org.apache.commons.collections.primitives.ArrayByteList;
import org.jetbrains.annotations.NotNull;

public class QuantizeSpecConverter
extends Converter<String, QuantizeSpec> {
    private static final QuantizeSpecConverter CONVERTER_INSTANCE = new QuantizeSpecConverter();
    private static final Parser<QuantizeSpec> PARSER_INSTANCE = ParserUtil.parser((Converter)CONVERTER_INSTANCE);
    private static final Parser<QuantizeColorPaletteTypeEnum> PALETTE_TYPE_PARSER = ParserUtil.trimFilter((Parser)EnumParser.enumParser(QuantizeColorPaletteTypeEnum.class, (boolean)false, (Map)QuantizeColorPaletteTypeEnum.VALUE_MAP));
    private static final Parser<QuantizeColorDitherEnum> DITHER_PARSER = ParserUtil.trimFilter((Parser)EnumParser.enumParser(QuantizeColorDitherEnum.class, (boolean)false, (Map)QuantizeColorDitherEnum.VALUE_MAP));
    private static final Parser<Integer> COLOR_COUNT_PARSER = ParserUtil.trimFilter((Parser)IntegerParser.integerParser((int)2, (int)256));

    public static Converter<String, QuantizeSpec> quantizeConverter() {
        return CONVERTER_INSTANCE;
    }

    public static Parser<QuantizeSpec> quantizeParser() {
        return PARSER_INSTANCE;
    }

    @NotNull
    public QuantizeSpec convert(@NotNull String value) throws ConversionException {
        try {
            String[] elements = value.split(",");
            QuantizeSpec.Builder builder = QuantizeSpec.builder();
            builder.setPaletteType((QuantizeColorPaletteTypeEnum)PALETTE_TYPE_PARSER.parse(elements[0]));
            if (elements.length < 2) {
                return builder.getProduct();
            }
            builder.setDither((QuantizeColorDitherEnum)DITHER_PARSER.parse(elements[1]));
            if (elements.length < 3) {
                return builder.getProduct();
            }
            builder.setColorCount(((Integer)COLOR_COUNT_PARSER.parse(elements[2])).intValue());
            if (elements.length < 4) {
                return builder.getProduct();
            }
            ArrayList<Integer> quantizationTable = new ArrayList<Integer>(elements.length - 3);
            for (int i = 3; i < elements.length; ++i) {
                quantizationTable.add(QuantizeSpecConverter.parseColorValue(elements[i].trim()));
            }
            QuantizeColorSet colorSet = new QuantizeColorSet(QuantizeSpecConverter.toByteArray(quantizationTable));
            builder.setQuantizationTable(colorSet);
            return builder.getProduct();
        }
        catch (ParsingException e) {
            throw new ConversionException((Throwable)new ParsingException(4, "Error parsing quantize color: " + value + ": " + e.getMessage(), (Throwable)e));
        }
    }

    @NotNull
    public String revert(@NotNull QuantizeSpec src) {
        StringBuilder builder = new StringBuilder().append((Object)src.paletteType).append(',').append((Object)src.dither);
        if (src.colorCount > 0) {
            assert (src.colorCount >= 1 && src.colorCount <= 256);
            builder.append(',').append(src.colorCount);
            if (src.quantizeTable.length() > 0) {
                builder.append(',').append((Object)src.quantizeTable);
            }
        } else assert (src.quantizeTable.length() == 0);
        return builder.toString().toLowerCase();
    }

    private QuantizeSpecConverter() {
        super(String.class, QuantizeSpec.class);
    }

    private static byte[] toByteArray(List<Integer> colors) {
        ArrayByteList result = new ArrayByteList(colors.size() * 3);
        Iterator<Integer> i$ = colors.iterator();
        while (i$.hasNext()) {
            int color = i$.next();
            result.add((byte)((color & 16711680) >> 16));
            result.add((byte)((color & 65280) >> 8));
            result.add((byte)(color & 255));
        }
        return result.toArray();
    }

    @NotNull
    private static Integer parseColorValue(@NotNull String value) throws ParsingException {
        try {
            if (value.length() != 6) {
                throw new ParsingException(4, "Invalid color value (ust be hex6): " + value, null);
            }
            int result = Integer.parseInt(value, 16);
            if (result < 0 || result > 16777215) {
                throw new ParsingException(6, value, null);
            }
            return result;
        }
        catch (NumberFormatException e) {
            throw new ParsingException(4, e.getMessage(), (Throwable)e);
        }
    }
}