Subversion Repositories display

Rev

Rev 531 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2007 Steve Ratcliffe
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License 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.
 *
 *
 * Author: Steve Ratcliffe
 * Create date: Dec 18, 2007
 */

package test.display;

import uk.me.parabola.imgfmt.app.ImgFileReader;

import java.io.PrintStream;
import java.util.List;
import java.util.ArrayList;

/**
 * For displaying polygons in a typ file.
 *
 * @author Steve Ratcliffe
 */

public class PolygonDisplayer extends TypSectionDisplayer {
        private final ImgFileReader reader;
        private final PrintStream out;

        private final List<Integer> offsets = new ArrayList<Integer>();

        public PolygonDisplayer(ImgFileReader reader, PrintStream outStream) {
                this.reader = reader;
                this.out = outStream;
        }

        public void print() {
                printPolygonDefs();
        }

        private void printPolygonDefs() {
                reader.position(0x47); // sect4
                int start = reader.get4();
                int itemsize = reader.get2u();
                int size = reader.get4();

                reader.position(0x27); // sect1
                reader.get4();

                printTypes(start, itemsize, size);

                reader.position(0x27);
                int stylestart = reader.get4();
                size = reader.get4();

                printStyles(stylestart, size);
        }

        private void printStyles(int start, int size) {
                Displayer d = new Displayer(reader);
                d.setTitle("Polygon styles");
                d.setSectStart(start);

                for (int i = 0; i < offsets.size(); i++) {
                        int off = start + offsets.get(i);
                        int end = start + ((i < offsets.size() - 1) ? offsets.get(i + 1) : size);
                        reader.position(off);

                        int flagAndScheme = d.byteValue("Color scheme: 0x%x");
                        int colorscheme = flagAndScheme & 0xf;
                        int flags = flagAndScheme & 0xf0;

                        printColourScheme(d, colorscheme);

            if ((colorscheme & 0x8) != 0)
                printBitmap(d);

            if ((flags & 0x10) != 0) // Has text
                printLabels(d);

            if ((flags & 0x20) != 0)  // Font info
                printFontInfo(d);

            d.rawValue((int) (end - reader.position()));
                        d.gap();
                }

                d.print(out);
        }

    private void printBitmap(Displayer d) {
                d.rawValue(128, "Pixmap");
        }

        private void printTypes(int start, int itemsize, int size) {
                Displayer d = new Displayer(reader);
                d.setTitle("Polygon types");
                d.setSectStart(start);

                reader.position(start);
                long end = start+size;
                for (long pos = start; pos < end; pos += itemsize) {
                        DisplayItem item = d.item();

                        int typ_id = reader.get2u();
                        item.setBytes2(typ_id);
                        item.addText("type %x", (typ_id >> 5));

                        // Get the offset into the shape style section.
                        item = d.intItem(itemsize - 2);
                        int off = item.getValue();
                       
                        item.addText("Style at offset %04x", off);
                        offsets.add(off);
                }

                d.print(out);
        }
}