14
14
* Author: Steve Ratcliffe
15
15
* Create date: 03-Dec-2006
16
* Change: Thomas Lußnig <gps@suche.org>
17
18
package uk.me.parabola.imgfmt.app.typ;
19
import uk.me.parabola.imgfmt.app.BufferedReadStrategy;
20
import uk.me.parabola.imgfmt.app.BufferedWriteStrategy;
20
import java.io.BufferedReader;
21
import java.io.IOException;
22
import java.io.StringReader;
23
import java.util.Collections;
24
import java.util.HashMap;
25
import java.util.LinkedList;
26
import java.util.List;
29
import uk.me.parabola.imgfmt.app.BufferedImgFileReader;
30
import uk.me.parabola.imgfmt.app.BufferedImgFileWriter;
21
31
import uk.me.parabola.imgfmt.app.ImgFile;
32
import uk.me.parabola.imgfmt.app.Writeable;
22
33
import uk.me.parabola.imgfmt.fs.ImgChannel;
23
34
import uk.me.parabola.log.Logger;
25
import java.io.IOException;
28
* The TYP file. I know next to nothing about this file, so the code will be
29
* very experimental for a while and indeed will be mostly to investigate
32
* @author Steve Ratcliffe
39
* @author Thomas Lußnig
34
41
public class TYPFile extends ImgFile {
35
42
private static final Logger log = Logger.getLogger(TYPFile.class);
37
44
private final TYPHeader header = new TYPHeader();
46
private final List<BitmapImage> images = new LinkedList<BitmapImage>();
47
private final List<PointInfo> pointInfo = new LinkedList<PointInfo>();
48
private final List<DrawOrder> drawOrder = new LinkedList<DrawOrder>();
39
50
public TYPFile(ImgChannel chan, boolean write) {
42
setWriter(new BufferedWriteStrategy(chan));
53
setWriter(new BufferedImgFileWriter(chan));
43
54
position(TYPHeader.HEADER_LEN);
45
setReader(new BufferedReadStrategy(chan));
56
setReader(new BufferedImgFileReader(chan));
46
57
header.readHeader(getReader());
50
public void sync() throws IOException {
61
public void setCodePage(char code) {
62
header.setCodePage(code);
65
public void setFamilyId(char code) {
66
header.setFamilyId(code);
69
public void setProductId(char code) {
70
header.setProductId(code);
74
// HEADER_LEN => 1. Image
75
Collections.sort(images, BitmapImage.comperator());
77
getWriter().position(TYPHeader.HEADER_LEN);
79
int pos = getWriter().position();
80
header.getPointData().setPosition(pos);
82
for (Writeable w : images)
84
int len = getWriter().position() - pos;
85
header.getPointData().setSize(len);
88
header.getPointIndex().setItemSize((char) 3);
89
pos = getWriter().position();
90
for (PointInfo w : pointInfo)
91
w.write(getWriter(), header.getPointData().getSize());
92
header.getPointIndex().setSize(getWriter().position() - pos);
94
pos = getWriter().position();
95
for (Writeable w : drawOrder)
97
header.getShapeStacking().setSize(getWriter().position() - pos);
101
public void writePost() {
51
102
log.debug("syncing TYP file");
53
104
getHeader().writeHeader(getWriter());
b'\\ No newline at end of file'
107
public static BitmapImage parseXpm(int type, int subtype, int day, String xpm) {
109
BufferedReader br = new BufferedReader(new StringReader(xpm));
110
String[] header = br.readLine().split(" ");
112
int w = Integer.parseInt(header[0]);
113
int h = Integer.parseInt(header[1]);
114
int c = Integer.parseInt(header[2]);
115
int cpp = Integer.parseInt(header[3]);
117
Map<String, Rgb> colors = new HashMap<String, Rgb>();
118
for (int i = 0; i < c; i++) {
119
String l = br.readLine();
120
String[] ci = l.split("\t");
121
int r = Integer.parseInt(ci[1].substring(3, 5), 16);
122
int g = Integer.parseInt(ci[1].substring(5, 7), 16);
123
int b = Integer.parseInt(ci[1].substring(7, 9), 16);
124
colors.put(ci[0], new Rgb(r, g, b, (byte) i));
127
StringBuffer sb = new StringBuffer();
128
for (int i = 0; i < h; i++) sb.append(br.readLine());
129
return new BitmapImage((byte) type, (byte) subtype, (byte) day, w, colors, cpp,
131
} catch (IOException e) {
132
log.error("failed to parse bitmap", e);
137
public void createDrawOrder(byte typ, byte sub) {
138
drawOrder.add(new DrawOrder((char) (typ | sub << 8), (char) 0, (byte) 0));
141
public List<BitmapImage> getImages() {
145
public List<PointInfo> getPointInfo() {
149
public List<DrawOrder> getDrawOrder() {