From: <js...@us...> - 2010-11-24 02:17:26
|
Revision: 6459 http://exult.svn.sourceforge.net/exult/?rev=6459&view=rev Author: jsf Date: 2010-11-24 02:17:20 +0000 (Wed, 24 Nov 2010) Log Message: ----------- Cache raw shape data from file. Modified Paths: -------------- ExultAndroid/src/com/exult/android/EUtil.java ExultAndroid/src/com/exult/android/Shape.java ExultAndroid/src/com/exult/android/ShapeFrame.java Modified: ExultAndroid/src/com/exult/android/EUtil.java =================================================================== --- ExultAndroid/src/com/exult/android/EUtil.java 2010-11-24 01:22:09 UTC (rev 6458) +++ ExultAndroid/src/com/exult/android/EUtil.java 2010-11-24 02:17:20 UTC (rev 6459) @@ -19,6 +19,10 @@ public static final int Read2(byte buf[], int ind) { return ((int)buf[ind]&0xff) | ((int)buf[ind+1]&0xff)<<8; } + public static final int Read4(byte buf[], int ind) { + return (((int)buf[ind]&0xff) | (((int)buf[ind+1]&0xff)<<8) | + (((int)buf[ind+2]&0xff)<<16) | (((int)buf[ind+3]&0xff)<<24)); + } public static final int Write2(byte buf[], int ind, short v) { buf[ind] = (byte)(v&0xff); buf[ind+1] = (byte)((v>>8)&0xff); Modified: ExultAndroid/src/com/exult/android/Shape.java =================================================================== --- ExultAndroid/src/com/exult/android/Shape.java 2010-11-24 01:22:09 UTC (rev 6458) +++ ExultAndroid/src/com/exult/android/Shape.java 2010-11-24 02:17:20 UTC (rev 6459) @@ -1,8 +1,10 @@ package com.exult.android; import java.io.RandomAccessFile; import java.io.IOException; +import java.lang.ref.WeakReference; public class Shape { + private WeakReference raw; // Entire shape from file. private ShapeFrame frames[]; // List of ->'s to frames. private int numFrames; // # of frames (not counting reflects). private boolean modified; @@ -76,7 +78,14 @@ ShapeFrame frame = new ShapeFrame(); int nframes; try { - nframes = frame.read(shpfile, shapeoff, shapelen, frnum); + byte data[]; + if (raw == null || (data = (byte[])raw.get()) == null) { + data = new byte[shapelen]; + raw = new WeakReference(data); + shpfile.seek(shapeoff); + shpfile.read(data); + } + nframes = frame.read(data, shapelen, frnum); } catch (IOException e) { return null; } @@ -119,13 +128,16 @@ void load(RandomAccessFile shapeSource) throws IOException { ShapeFrame frame = new ShapeFrame(); int shapelen = EUtil.Read4(shapeSource); + byte data[] = new byte[shapelen]; + shapeSource.seek(0); + shapeSource.read(data); // Read frame 0 & get frame count. - createFramesList(frame.read(shapeSource, 0, shapelen, 0)); + createFramesList(frame.read(data, shapelen, 0)); storeFrame(frame, 0); // Get the rest. for (int i = 1; i < frames.length; i++) { frame = new ShapeFrame(); - frame.read(shapeSource, 0, shapelen, i); + frame.read(data, shapelen, i); storeFrame(frame, i); } } Modified: ExultAndroid/src/com/exult/android/ShapeFrame.java =================================================================== --- ExultAndroid/src/com/exult/android/ShapeFrame.java 2010-11-24 01:22:09 UTC (rev 6458) +++ ExultAndroid/src/com/exult/android/ShapeFrame.java 2010-11-24 02:17:20 UTC (rev 6459) @@ -104,77 +104,68 @@ */ public int read ( - RandomAccessFile shapes, // Shapes data source to read. - int shapeoff, // Offset of shape in file. + byte shapes[], // Data for this entire shape. int shapelen, // Length expected for detecting RLE. int frnum // Frame #. - ) throws IOException - { + ) { int framenum = frnum; rle = false; - if (shapelen == 0 && shapeoff == 0) + if (shapelen == 0) return 0; - // Get to actual shape. - shapes.seek(shapeoff); - int dlen = EUtil.Read4(shapes); - int hdrlen = EUtil.Read4(shapes); - if (dlen == shapelen) - { + int dlen = EUtil.Read4(shapes, 0); + int hdrlen = EUtil.Read4(shapes, 4); + if (dlen == shapelen) { rle = true; // It's run-length-encoded. - // Figure # frames. + // Figure # frames. int nframes = (hdrlen - 4)/4; if (framenum >= nframes)// Bug out if bad frame #. return (nframes); - // Get frame offset, lengeth. + // Get frame offset, lengeth. int frameoff, framelen; - if (framenum == 0) - { + if (framenum == 0) { frameoff = hdrlen; - framelen = nframes > 1 ? EUtil.Read4(shapes) - frameoff : - dlen - frameoff; - } - else - { - shapes.skipBytes((framenum - 1) * 4); - frameoff = EUtil.Read4(shapes); - // Last frame? + framelen = nframes > 1 ? EUtil.Read4(shapes, 8) - frameoff : + dlen - frameoff; + } else { + int from = 8 + (framenum - 1) * 4; + frameoff = EUtil.Read4(shapes, from); + // Last frame? if (framenum == nframes - 1) framelen = dlen - frameoff; else - framelen = EUtil.Read4(shapes) - frameoff; - } - // Get compressed data. - getRleShape(shapes, shapeoff + frameoff, framelen); - // Return # frames. - return (nframes); + framelen = EUtil.Read4(shapes, from + 4) - frameoff; } + // Get compressed data. + getRleShape(shapes, frameoff, framelen); + // Return # frames. + return (nframes); + } framenum &= 31; // !!!Guessing here. xleft = yabove = EConst.c_tilesize; // Just an 8x8 bitmap. xright= ybelow = -1; - shapes.seek(shapeoff + framenum*EConst.c_num_tile_bytes); data = new byte[EConst.c_num_tile_bytes]; // Read in 8x8 pixels. datalen = EConst.c_num_tile_bytes; - shapes.read(data); + System.arraycopy(shapes, framenum*EConst.c_num_tile_bytes, data, 0, datalen); return (shapelen/EConst.c_num_tile_bytes); // That's how many frames. - } +} + /* * Read RLE shape. */ private void getRleShape ( - RandomAccessFile shapes, // Shapes data source to read. - int filepos, // Position in file. + byte shapes[], // Data read from entire shape. + int framePos, // Position in data. int len // Length of entire frame data. - ) throws IOException { - shapes.seek(filepos); // Get to extents. - xright = (short)EUtil.Read2(shapes); - xleft = (short)EUtil.Read2(shapes); - yabove = (short)EUtil.Read2(shapes); - ybelow = (short)EUtil.Read2(shapes); + ) { + xright = (short)EUtil.Read2(shapes, framePos); + xleft = (short)EUtil.Read2(shapes, framePos+2); + yabove = (short)EUtil.Read2(shapes, framePos+4); + ybelow = (short)EUtil.Read2(shapes, framePos+6); len -= 8; // Subtract what we just read. data = new byte[len + 2]; // Allocate and read data. datalen = len+2; - shapes.read(data, 0, len); + System.arraycopy(shapes, framePos+8, data, 0, len); data[len] = 0; // 0-delimit. data[len + 1] = 0; rle = true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |