Rev 3408 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Copyright (C) 2009.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 or
* 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.
*/
package uk.me.parabola.imgfmt.app.mdr;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.Section;
/**
* A header for the map index, pointed to from MDR 1.
* There is one of these for each map.
*
* @author Steve Ratcliffe
*/
public class Mdr1SubHeader {
// The number of subsections, this starts at 1. Larger numbers are possible
// for larger MDR header sizes.
private static final int MAX_SECTION = 9;
// Each sub header requires 8 bytes apart from sub2 which only needs 4.
private static final int HEADER_SIZE = 70;
private final Section[] sections = new Section[MAX_SECTION+1];
public Mdr1SubHeader() {
// Initialise the sections.
for (int n = 1; n <= MAX_SECTION; n++) {
Section prev = sections[n - 1];
sections[n] = new Section(prev);
}
sections[1].setPosition(HEADER_SIZE);
}
protected void writeFileHeader(ImgFileWriter writer) {
writer.putChar((char) HEADER_SIZE);
for (int n = 1; n <= MAX_SECTION; n++) {
Section section = sections[n];
// The second subsection does not have a length, because it always
// has the same length as subsection 1.
if (n == 2)
writer.putInt(section.getPosition());
else {
//section.writeSectionInfo(writer);
writer.putInt(section.getPosition());
int size = section.getSize();
if (size == 0)
writer.putInt(0);
else
writer.putInt(size / section.getItemSize());
}
}
}
public void setEndSubsection(int sub, int pos) {
sections[sub].setSize(pos - sections[sub].getPosition());
}
public long getHeaderLen() {
return HEADER_SIZE;
}
public void setItemSize(int sectionNumber, int itemSize) {
sections[sectionNumber].setItemSize((char) itemSize);
}
}