1/* 2 * Copyright (c) 2010, 2015, 2017 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated 11 * unmodified and in its entirety in all distributions of the software, 12 * modified or unmodified, in source code or in binary form. 13 * 14 * Redistribution and use in source and binary forms, with or without 15 * modification, are permitted provided that the following conditions are 16 * met: redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer; 18 * redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution; 21 * neither the name of the copyright holders nor the names of its 22 * contributors may be used to endorse or promote products derived from 23 * this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * Authors: William Wang 38 * Ali Saidi 39 * Chris Emmons 40 * Andreas Sandberg 41 */ 42 43#include "base/bmpwriter.hh" 44 45#include <cassert> 46 47#include "base/logging.hh" 48 49const char* BmpWriter::_imgExtension = "bmp"; 50 51// bitmap class ctor 52BmpWriter::BmpWriter(const FrameBuffer *_fb) 53 : ImgWriter(_fb) 54{ 55} 56 57const BmpWriter::CompleteV1Header 58BmpWriter::getCompleteHeader() const 59{ 60 const uint32_t pixel_array_size(sizeof(PixelType) * fb.area()); 61 const uint32_t file_size(sizeof(CompleteV1Header) + pixel_array_size); 62 63 const CompleteV1Header header = { 64 // File header 65 { 66 {'B','M'}, /* Magic */ 67 file_size, 68 0, 0, /* Reserved */ 69 sizeof(CompleteV1Header) /* Offset to pixel array */ 70 }, 71 // Info/DIB header 72 { 73 sizeof(InfoHeaderV1), 74 fb.width(), 75 fb.height(), 76 1, /* Color planes */ 77 32, /* Bits per pixel */ 78 0, /* No compression */ 79 pixel_array_size, /* Image size in bytes */ 80 2835, /* x pixels per meter (assume 72 DPI) */ 81 2835, /* y pixels per meter (assume 72 DPI) */ 82 0, /* Colors in color table */ 83 0 /* Important color count (0 == all are important) */ 84 } 85 }; 86 87 return header; 88} 89 90void 91BmpWriter::write(std::ostream &bmp) const 92{ 93 const CompleteV1Header header(getCompleteHeader()); 94 95 // 1. write the header 96 bmp.write(reinterpret_cast<const char *>(&header), sizeof(header)); 97 98 // 2. write the bitmap data 99 // BMP start store data left to right starting with the bottom row 100 // so we need to do some creative flipping 101 std::vector<PixelType> line_buffer(fb.width()); 102 for (int y = 0; y < fb.height(); ++y) { 103 for (unsigned x = 0; x < fb.width(); ++x) 104 line_buffer[x] = fb.pixel(x, fb.height() - y - 1); 105 106 bmp.write(reinterpret_cast<const char *>(line_buffer.data()), 107 line_buffer.size() * sizeof(line_buffer[0])); 108 } 109 110 bmp.flush(); 111} 112 113 114