aboutsummaryrefslogtreecommitdiffstats
path: root/src/org/apache/fop/image/analyser/BMPReader.java
blob: 5e7cd8513e3fdcf5f5ef7121e1168c1c18d71d33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
 * $Id$
 * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
 * For details on use and redistribution please refer to the
 * LICENSE file included with these sources.
 */

package org.apache.fop.image.analyser;

// Java
import java.io.BufferedInputStream;
import java.io.IOException;

import org.apache.fop.fo.FOUserAgent;

/**
 * ImageReader object for BMP image type.
 * @author Pankaj Narula
 * @version 1.0
 */
public class BMPReader extends AbstractImageReader {
    static protected final int BMP_SIG_LENGTH = 26;

    protected byte[] header;

    public boolean verifySignature(String uri, BufferedInputStream fis,
                                   FOUserAgent ua) throws IOException {
        this.imageStream = fis;
        this.setDefaultHeader();
        boolean supported = ((header[0] == (byte) 0x42) &&
                             (header[1] == (byte) 0x4d));
        if (supported) {
            setDimension();
            return true;
        } else
            return false;
    }

    public String getMimeType() {
        return "image/bmp";
    }

    protected void setDimension() {
        // little endian notation
        int byte1 = header[18] & 0xff;
        int byte2 = header[19] & 0xff;
        int byte3 = header[20] & 0xff;
        int byte4 = header[21] & 0xff;
        long l = (long)((byte4 << 24) | (byte3 << 16) |
                        (byte2 << 8) | byte1);
        this.width = (int)(l & 0xffffffff);

        byte1 = header[22] & 0xff;
        byte2 = header[23] & 0xff;
        byte3 = header[24] & 0xff;
        byte4 = header[25] & 0xff;
        l = (long)((byte4 << 24) | (byte3 << 16) | (byte2 << 8) | byte1);
        this.height = (int)(l & 0xffffffff);
    }

    protected void setDefaultHeader() throws IOException {
        this.header = new byte[BMP_SIG_LENGTH];
        try {
            this.imageStream.mark(BMP_SIG_LENGTH + 1);
            this.imageStream.read(header);
            this.imageStream.reset();
        } catch (IOException ex) {
            try {
                this.imageStream.reset();
            } catch (IOException exbis) {}
            throw ex;
        }
    }

}