1 /*
   2  * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package javax.imageio.plugins.bmp;
  27 
  28 import java.util.Locale;
  29 import javax.imageio.ImageWriteParam;
  30 
  31 import com.sun.imageio.plugins.bmp.BMPConstants;
  32 import com.sun.imageio.plugins.bmp.BMPCompressionTypes;
  33 
  34 /**
  35  * A subclass of {@code ImageWriteParam} for encoding images in
  36  * the BMP format.
  37  *
  38  * <p> This class allows for the specification of various parameters
  39  * while writing a BMP format image file.  By default, the data layout
  40  * is bottom-up, such that the pixels are stored in bottom-up order,
  41  * the first scanline being stored last.
  42  *
  43  * <p>The particular compression scheme to be used can be specified by using
  44  * the {@code setCompressionType()} method with the appropriate type
  45  * string.  The compression scheme specified will be honored if and only if it
  46  * is compatible with the type of image being written. If the specified
  47  * compression scheme is not compatible with the type of image being written
  48  * then the {@code IOException} will be thrown by the BMP image writer.
  49  * If the compression type is not set explicitly then {@code getCompressionType()}
  50  * will return {@code null}. In this case the BMP image writer will select
  51  * a compression type that supports encoding of the given image without loss
  52  * of the color resolution.
  53  * <p>The compression type strings and the image type(s) each supports are
  54  * listed in the following
  55  * table:
  56  *
  57  * <table class="striped">
  58  * <caption>Compression Types</caption>
  59  * <thead>
  60  *   <tr>
  61  *     <th scope="col">Type String
  62  *     <th scope="col">Description
  63  *     <th scope="col">Image Types
  64  * </thead>
  65  * <tbody>
  66  *   <tr>
  67  *     <th scope="row">BI_RGB
  68  *     <td>Uncompressed RLE
  69  *     <td>{@literal <= } 8-bits/sample
  70  *   <tr>
  71  *     <th scope="row">BI_RLE8
  72  *     <td>8-bit Run Length Encoding
  73  *     <td>{@literal <=} 8-bits/sample
  74  *   <tr>
  75  *     <th scope="row">BI_RLE4
  76  *     <td>4-bit Run Length Encoding
  77  *     <td>{@literal <=} 4-bits/sample
  78  *   <tr>
  79  *     <th scope="row">BI_BITFIELDS
  80  *     <td>Packed data
  81  *     <td>16 or 32 bits/sample
  82  * </tbody>
  83  * </table>
  84  */
  85 public class BMPImageWriteParam extends ImageWriteParam {
  86 
  87     private boolean topDown = false;
  88 
  89     /**
  90      * Constructs a {@code BMPImageWriteParam} set to use a given
  91      * {@code Locale} and with default values for all parameters.
  92      *
  93      * @param locale a {@code Locale} to be used to localize
  94      * compression type names and quality descriptions, or
  95      * {@code null}.
  96      */
  97     public BMPImageWriteParam(Locale locale) {
  98         super(locale);
  99 
 100         // Set compression types ("BI_RGB" denotes uncompressed).
 101         compressionTypes = BMPCompressionTypes.getCompressionTypes();
 102 
 103         // Set compression flag.
 104         canWriteCompressed = true;
 105         compressionMode = MODE_COPY_FROM_METADATA;
 106         compressionType = compressionTypes[BMPConstants.BI_RGB];
 107     }
 108 
 109     /**
 110      * Constructs an {@code BMPImageWriteParam} object with default
 111      * values for all parameters and a {@code null Locale}.
 112      */
 113     public BMPImageWriteParam() {
 114         this(null);
 115     }
 116 
 117     /**
 118      * If set, the data will be written out in a top-down manner, the first
 119      * scanline being written first.
 120      *
 121      * @param topDown whether the data are written in top-down order.
 122      */
 123     public void setTopDown(boolean topDown) {
 124         this.topDown = topDown;
 125     }
 126 
 127     /**
 128      * Returns the value of the {@code topDown} parameter.
 129      * The default is {@code false}.
 130      *
 131      * @return whether the data are written in top-down order.
 132      */
 133     public boolean isTopDown() {
 134         return topDown;
 135     }
 136 }