Rev 3408 |
View as "text/plain" |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Copyright (C) 2011.
*
* 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 java.util.ArrayList;
import java.util.List;
import uk.me.parabola.imgfmt.app.ImgFileWriter;
import uk.me.parabola.imgfmt.app.lbl.Zip;
import uk.me.parabola.imgfmt.app.srt.SortKey;
/**
* Section containing zip codes.
*
* We need: map number, zip index in map, pointer into MDR 15 for the string name.
*
* @author WanMil
*/
public class Mdr6
extends MdrMapSection
{
private final List<Mdr6Record
> zips =
new ArrayList<>();
public Mdr6
(MdrConfig config
) {
setConfig
(config
);
}
public void addZip
(int mapIndex, Zip zip,
int strOff
) {
Mdr6Record record =
new Mdr6Record
(zip
);
record.
setMapIndex(mapIndex
);
record.
setStringOffset(strOff
);
zips.
add(record
);
}
public void writeSectData
(ImgFileWriter writer
) {
int zipSize = getSizes
().
getZipSize();
List<SortKey<Mdr6Record
>> sortKeys = MdrUtils.
sortList(getConfig
().
getSort(), zips
);
boolean hasString = hasFlag
(0x4
);
int record =
1;
for (SortKey<Mdr6Record
> key : sortKeys
) {
Mdr6Record z = key.
getObject();
addIndexPointer
(z.
getMapIndex(), record++
);
putMapIndex
(writer, z.
getMapIndex());
putN
(writer, zipSize, z.
getZipIndex());
if (hasString
)
putStringOffset
(writer, z.
getStringOffset());
}
}
/**
* Enough bytes to represent the map number
* and the zip index and the string offset.
* @return The size of a record in this section.
*/
public int getItemSize
() {
PointerSizes sizes = getSizes
();
int size = sizes.
getMapSize() + sizes.
getZipSize();
if (hasFlag
(0x4
))
size += sizes.
getStrOffSize();
return size
;
}
protected int numberOfItems
() {
return zips.
size();
}
/**
* Known structure:
* bits 0-1: size of local zip index - 1 (all values appear to work)
* bits 2: if MDR 15 available
* @return The value to be placed in the header.
*/
public int getExtraValue
() {
return ((getSizes
().
getZipSize()-
1)&0x03
) |
(isForDevice
() ? 0 : 0x04
);
}
public void relabelMaps
(Mdr1 maps
) {
relabel
(maps, zips
);
}
}