Rev 283 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Copyright (C) 2007 Steve Ratcliffe
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program 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 General Public License for more details.
*
*
* Author: Steve Ratcliffe
* Create date: Dec 18, 2007
*/
package test.display;
import uk.me.parabola.imgfmt.app.ImgFileReader;
import java.io.PrintStream;
import java.util.List;
import java.util.ArrayList;
/**
* For displaying polygons in a typ file.
*
* @author Steve Ratcliffe
*/
public class PolygonDisplayer
extends TypSectionDisplayer
{
private final ImgFileReader reader
;
private final PrintStream out
;
private final List<Integer> offsets =
new ArrayList<Integer>();
public PolygonDisplayer
(ImgFileReader reader,
PrintStream outStream
) {
this.
reader = reader
;
this.
out = outStream
;
}
public void print
() {
printPolygonDefs
();
}
private void printPolygonDefs
() {
reader.
position(0x47
); // sect4
int start = reader.
getInt();
int itemsize = reader.
getChar();
int size = reader.
getInt();
reader.
position(0x27
); // sect1
reader.
getInt();
printTypes
(start, itemsize, size
);
reader.
position(0x27
);
int stylestart = reader.
getInt();
size = reader.
getInt();
printStyles
(stylestart, size
);
}
private void printStyles
(int start,
int size
) {
Displayer d =
new Displayer
(reader
);
d.
setTitle("Polygon styles");
d.
setSectStart(start
);
for (int i =
0; i
< offsets.
size(); i++
) {
int off = start + offsets.
get(i
);
int end = start +
((i
< offsets.
size() -
1) ? offsets.
get(i +
1) : size
);
reader.
position(off
);
int flagAndScheme = d.
byteValue("Color scheme: 0x%x");
int colorscheme = flagAndScheme
& 0xf
;
int flags = flagAndScheme
& 0xf0
;
printColourScheme
(d, colorscheme
);
if ((colorscheme
& 0x8
) !=
0)
printBitmap
(d
);
if ((flags
& 0x10
) !=
0) // Has text
printLabels
(d
);
if ((flags
& 0x20
) !=
0) // Font info
printFontInfo
(d
);
d.
rawValue((int) (end - reader.
position()));
d.
gap();
}
d.
print(out
);
}
private void printBitmap
(Displayer d
) {
d.
rawValue(128,
"Pixmap");
}
private void printTypes
(int start,
int itemsize,
int size
) {
Displayer d =
new Displayer
(reader
);
d.
setTitle("Polygon types");
d.
setSectStart(start
);
reader.
position(start
);
long end = start+size
;
for (long pos = start
; pos
< end
; pos += itemsize
) {
DisplayItem item = d.
item();
int typ_id = reader.
getChar();
item.
setBytes((char) typ_id
);
item.
addText("type %x",
(typ_id
>> 5));
// Get the offset into the shape style section.
item = d.
intItem(itemsize -
2);
int off = item.
getValue();
item.
addText("Style at offset %04x", off
);
offsets.
add(off
);
}
d.
print(out
);
}
}