/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * 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 Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * 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 A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.jpexs.decompiler.flash.types.gfx; import java.io.IOException; import java.io.OutputStream; /** * * @author JPEXS */ public class GFxOutputStream extends OutputStream { public static final int MaxUInt6 = (1 << 6) - 1; public static final int MaxUInt7 = (1 << 7) - 1; public static final int MaxUInt14 = (1 << 14) - 1; public static final int MaxUInt22 = (1 << 22) - 1; public static final int MaxUInt30 = (1 << 30) - 1; public static final int MinSInt5 = -(1 << 4); public static final int MaxSInt5 = (1 << 4) - 1; public static final int MinSInt6 = -(1 << 5); public static final int MaxSInt6 = (1 << 5) - 1; public static final int MinSInt7 = -(1 << 6); public static final int MaxSInt7 = (1 << 6) - 1; public static final int MinSInt8 = -(1 << 7); public static final int MaxSInt8 = (1 << 7) - 1; public static final int MinSInt9 = -(1 << 8); public static final int MaxSInt9 = (1 << 8) - 1; public static final int MinSInt10 = -(1 << 9); public static final int MaxSInt10 = (1 << 9) - 1; public static final int MinSInt11 = -(1 << 10); public static final int MaxSInt11 = (1 << 10) - 1; public static final int MinSInt12 = -(1 << 11); public static final int MaxSInt12 = (1 << 11) - 1; public static final int MinSInt13 = -(1 << 12); public static final int MaxSInt13 = (1 << 12) - 1; public static final int MinSInt14 = -(1 << 13); public static final int MaxSInt14 = (1 << 13) - 1; public static final int MinSInt15 = -(1 << 14); public static final int MaxSInt15 = (1 << 14) - 1; public static final int MinSInt17 = -(1 << 16); public static final int MaxSInt17 = (1 << 16) - 1; public static final int MinSInt18 = -(1 << 17); public static final int MaxSInt18 = (1 << 17) - 1; public static final int MinSInt19 = -(1 << 18); public static final int MaxSInt19 = (1 << 18) - 1; public static final int MinSInt20 = -(1 << 19); public static final int MaxSInt20 = (1 << 19) - 1; public static final int MinSInt22 = -(1 << 21); public static final int MaxSInt22 = (1 << 21) - 1; private final OutputStream os; private long pos = 0; public GFxOutputStream(OutputStream os) { this.os = os; } public long getPos() { return pos; } @Override public void write(int b) throws IOException { os.write(b); pos++; } /** * Writes SI32 (Signed 32bit integer) value to the stream * * @param value SI32 value * @throws IOException */ public void writeSI32(long value) throws IOException { writeUI32(value); } /** * Writes SI16 (Signed 16bit integer) value to the stream * * @param value SI16 value * @throws IOException */ public void writeSI16(int value) throws IOException { writeUI16(value); } /** * Writes SI8 (Signed 8bit integer) value to the stream * * @param value SI8 value * @throws IOException */ public void writeSI8(int value) throws IOException { writeUI8(value); } /** * Writes UI32 (Unsigned 32bit integer) value to the stream * * @param value UI32 value * @throws IOException */ public void writeUI32(long value) throws IOException { write((int) (value & 0xff)); write((int) ((value >> 8) & 0xff)); write((int) ((value >> 16) & 0xff)); write((int) ((value >> 24) & 0xff)); } /** * Writes UI16 (Unsigned 16bit integer) value to the stream * * @param value UI16 value * @throws IOException */ public void writeUI16(int value) throws IOException { write((int) (value & 0xff)); write((int) ((value >> 8) & 0xff)); } /** * Writes UI8 (Unsigned 8bit integer) value to the stream * * @param val UI8 value to write * @throws IOException */ public void writeUI8(int val) throws IOException { write(val & 0xff); } /** * Writes FLOAT (single precision floating point value) value to the stream * * @param value FLOAT value * @throws IOException */ public void writeFLOAT(float value) throws IOException { writeUI32(Float.floatToIntBits(value)); } public void writeSI15(int v) throws IOException { if (v >= MinSInt7 && v <= MaxSInt7) { writeUI8(v << 1); return; } writeUI8((v << 1) | 1); writeUI8(v >> 7); } public void writeUI15(int v) throws IOException { if (v <= MaxUInt7) { writeUI8(v << 1); return; } writeUI8((v << 1) | 1); writeUI8(v >> 7); } public void writeUI30(int v) throws IOException { if (v <= MaxUInt6) { writeUI8(v << 2); return; } if (v <= MaxUInt14) { writeUI8((v << 2) | 1); writeUI8(v >> 6); return; } if (v <= MaxUInt22) { writeUI8((v << 2) | 2); writeUI8(v >> 6); writeUI8(v >> 14); return; } writeUI8((v << 2) | 3); writeUI8(v >> 6); writeUI8(v >> 14); writeUI8(v >> 22); } }