package com.jotuntech.sketcher.common; import java.awt.Point; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; public class BitmapUndoData extends HashMap implements UndoData { protected Iterator> tileIterator = null; protected static DiffPacker packer; protected static DiffUnpacker unpacker; public void reset() { tileIterator = null; } public byte[] encode() { if(tileIterator == null) { tileIterator = entrySet().iterator(); } if(tileIterator.hasNext()) { Entry e = tileIterator.next(); Point p = e.getKey(); BitmapTileDiff btd = e.getValue(); byte[] encoded = new byte[BitmapTile.SIZE * BitmapTile.SIZE * 8 + 2]; int offset = 0; encoded[offset++] = (byte) p.x; encoded[offset++] = (byte) p.y; if(packer == null) { packer = new DiffPacker(); } packer.pack(btd.diffAlpha, btd.diffRed, btd.diffGreen, btd.diffBlue, encoded, offset, encoded.length - offset); return encoded; } else { tileIterator = null; return null; } } public void decode(byte[] in) { int offset = 0; int x = 0xFF & in[offset++]; int y = 0xFF & in[offset++]; Point p = new Point(x, y); BitmapTileDiff btd = new BitmapTileDiff(); if(unpacker == null) { unpacker = new DiffUnpacker(); } unpacker.unpack(in, offset, in.length - offset, btd.diffAlpha, btd.diffRed, btd.diffGreen, btd.diffBlue); put(p, btd); } }