private void validateTileSizeForDimensions(WmfHeader header) { if (header.width % header.tileSize != 0 || header.height % header.tileSize != 0) { throw new Exception("Map dimensions do not fit the tilesize"); } }
private void readWmfValue(EndianBinaryReader reader, WmfHeader header, WmfFile file, uint xLocation, uint yLocation) { float value = readValueFromReader(reader, header, xLocation, yLocation); if (header.auxDataSize > 0) { byte waterTypeId = reader.ReadByte(); ushort waterBodyIndex = reader.ReadUInt16(); file.addPixel(new WmfPixelInfo(xLocation, yLocation, value, waterTypeId, waterBodyIndex)); } else { file.addPixel(new WmfPixelInfo(xLocation, yLocation, value)); } }
private float readValueFromReader(EndianBinaryReader reader, WmfHeader header, uint xLocation, uint yLocation) { float value; if (header.floatingPointFlag) { float readSingleValue = reader.ReadSingle(); debugLine("v: " + readSingleValue); value = header.verticalScale * readSingleValue + header.verticalOffset; debugLine("cv: " + value); } else { switch (header.waterLevelDataSize) { case 2: ushort readShortValue = reader.ReadUInt16(); debugLine("v: " + readShortValue); value = header.verticalScale * readShortValue + header.verticalOffset; debugLine("cv: " + value); break; default: throw new Exception("Invalid pixel data at x: " + xLocation + ", y: " + yLocation); } } return value; }
private void readTiledData(EndianBinaryReader reader, WmfHeader header, WmfFile file) { validateTileSizeForDimensions(header); uint horizontalTiles = header.width / header.tileSize; uint verticalTiles = header.height / header.tileSize; for (int y = 0; y < verticalTiles; y++) { for (int x = 0; x < horizontalTiles; x++) { readTile(x, y, header, reader, file); } } }
private void readTile(int x, int y, WmfHeader header, EndianBinaryReader reader, WmfFile file) { for (int j = 1; j <= header.tileSize; j++) { for (int i = 1; i <= header.tileSize; i++) { uint xLocation = (uint)((x * header.tileSize) + i); uint yLocation = (uint)((y * header.tileSize) + j); readWmfValue(reader, header, file, xLocation, yLocation); } } }
private void readConventionalData(EndianBinaryReader reader, WmfHeader header, WmfFile file) { uint totalPixels = header.width * header.height; uint xLocation = 1; uint yLocation = 1; for (int i = 0; i < totalPixels; i++) { readWmfValue(reader, header, file, xLocation, yLocation); xLocation++; if (xLocation > header.width) { xLocation = 1; yLocation++; } } debugLine("pixel count: " + file.pixels.Count()); }