Subversion Repositories mkgmap

Rev

Rev 1870 | 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);
        }
}