112230Sgiacomo.travaglini@arm.com/*
212230Sgiacomo.travaglini@arm.com * Copyright (c) 2017 ARM Limited
312230Sgiacomo.travaglini@arm.com * All rights reserved
412230Sgiacomo.travaglini@arm.com *
512230Sgiacomo.travaglini@arm.com * The license below extends only to copyright in the software and shall
612230Sgiacomo.travaglini@arm.com * not be construed as granting a license to any other intellectual
712230Sgiacomo.travaglini@arm.com * property including but not limited to intellectual property relating
812230Sgiacomo.travaglini@arm.com * to a hardware implementation of the functionality of the software
912230Sgiacomo.travaglini@arm.com * licensed hereunder.  You may use the software subject to the license
1012230Sgiacomo.travaglini@arm.com * terms below provided that you ensure that this notice is replicated
1112230Sgiacomo.travaglini@arm.com * unmodified and in its entirety in all distributions of the software,
1212230Sgiacomo.travaglini@arm.com * modified or unmodified, in source code or in binary form.
1312230Sgiacomo.travaglini@arm.com *
1412230Sgiacomo.travaglini@arm.com * Redistribution and use in source and binary forms, with or without
1512230Sgiacomo.travaglini@arm.com * modification, are permitted provided that the following conditions are
1612230Sgiacomo.travaglini@arm.com * met: redistributions of source code must retain the above copyright
1712230Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer;
1812230Sgiacomo.travaglini@arm.com * redistributions in binary form must reproduce the above copyright
1912230Sgiacomo.travaglini@arm.com * notice, this list of conditions and the following disclaimer in the
2012230Sgiacomo.travaglini@arm.com * documentation and/or other materials provided with the distribution;
2112230Sgiacomo.travaglini@arm.com * neither the name of the copyright holders nor the names of its
2212230Sgiacomo.travaglini@arm.com * contributors may be used to endorse or promote products derived from
2312230Sgiacomo.travaglini@arm.com * this software without specific prior written permission.
2412230Sgiacomo.travaglini@arm.com *
2512230Sgiacomo.travaglini@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2612230Sgiacomo.travaglini@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2712230Sgiacomo.travaglini@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2812230Sgiacomo.travaglini@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2912230Sgiacomo.travaglini@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3012230Sgiacomo.travaglini@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3112230Sgiacomo.travaglini@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3212230Sgiacomo.travaglini@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3312230Sgiacomo.travaglini@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3412230Sgiacomo.travaglini@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3512230Sgiacomo.travaglini@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3612230Sgiacomo.travaglini@arm.com *
3712230Sgiacomo.travaglini@arm.com * Authors: Giacomo Travaglini
3812230Sgiacomo.travaglini@arm.com */
3912230Sgiacomo.travaglini@arm.com
4012230Sgiacomo.travaglini@arm.com/**
4112230Sgiacomo.travaglini@arm.com * @file Declaration of a class that writes a frame buffer to a png
4212230Sgiacomo.travaglini@arm.com */
4312230Sgiacomo.travaglini@arm.com
4412230Sgiacomo.travaglini@arm.com#ifndef __BASE_PNG_HH__
4512230Sgiacomo.travaglini@arm.com#define __BASE_PNG_HH__
4612230Sgiacomo.travaglini@arm.com
4712230Sgiacomo.travaglini@arm.com#include "base/compiler.hh"
4812230Sgiacomo.travaglini@arm.com#include "base/framebuffer.hh"
4912230Sgiacomo.travaglini@arm.com#include "base/imgwriter.hh"
5012230Sgiacomo.travaglini@arm.com
5112230Sgiacomo.travaglini@arm.com/** Image writer implementing support for PNG */
5212230Sgiacomo.travaglini@arm.comclass PngWriter : public ImgWriter
5312230Sgiacomo.travaglini@arm.com{
5412230Sgiacomo.travaglini@arm.com  public:
5512230Sgiacomo.travaglini@arm.com    /**
5612230Sgiacomo.travaglini@arm.com     * Create a png that takes data in a given mode & size and
5712230Sgiacomo.travaglini@arm.com     * outputs to an ostream.
5812230Sgiacomo.travaglini@arm.com     */
5912230Sgiacomo.travaglini@arm.com    PngWriter(const FrameBuffer *_fb)
6012230Sgiacomo.travaglini@arm.com      : ImgWriter(_fb)
6112230Sgiacomo.travaglini@arm.com    {}
6212230Sgiacomo.travaglini@arm.com
6312230Sgiacomo.travaglini@arm.com    ~PngWriter() {};
6412230Sgiacomo.travaglini@arm.com
6512230Sgiacomo.travaglini@arm.com    /**
6612230Sgiacomo.travaglini@arm.com     * Return Image format as a string
6712230Sgiacomo.travaglini@arm.com     *
6812230Sgiacomo.travaglini@arm.com     * @return img extension (e.g. .png for Png)
6912230Sgiacomo.travaglini@arm.com     */
7012230Sgiacomo.travaglini@arm.com    const char* getImgExtension() const override
7112230Sgiacomo.travaglini@arm.com    { return _imgExtension; }
7212230Sgiacomo.travaglini@arm.com
7312230Sgiacomo.travaglini@arm.com    /**
7412230Sgiacomo.travaglini@arm.com     * Write the frame buffer data into the provided ostream
7512230Sgiacomo.travaglini@arm.com     *
7612230Sgiacomo.travaglini@arm.com     * @param png stream to write to
7712230Sgiacomo.travaglini@arm.com     */
7812230Sgiacomo.travaglini@arm.com    void write(std::ostream &png) const override;
7912230Sgiacomo.travaglini@arm.com  private:
8012230Sgiacomo.travaglini@arm.com    /** Png Pixel type: not containing padding */
8112230Sgiacomo.travaglini@arm.com    struct PngPixel24 {
8212230Sgiacomo.travaglini@arm.com        PngPixel24 &operator=(const Pixel &rhs) {
8312230Sgiacomo.travaglini@arm.com            red = rhs.red;
8412230Sgiacomo.travaglini@arm.com            green = rhs.green;
8512230Sgiacomo.travaglini@arm.com            blue = rhs.blue;
8612230Sgiacomo.travaglini@arm.com
8712230Sgiacomo.travaglini@arm.com            return *this;
8812230Sgiacomo.travaglini@arm.com        }
8912230Sgiacomo.travaglini@arm.com        uint8_t red;
9012230Sgiacomo.travaglini@arm.com        uint8_t green;
9112230Sgiacomo.travaglini@arm.com        uint8_t blue;
9212230Sgiacomo.travaglini@arm.com    } M5_ATTR_PACKED;
9312230Sgiacomo.travaglini@arm.com
9412230Sgiacomo.travaglini@arm.com    /**
9512230Sgiacomo.travaglini@arm.com     * Handle to resources used by libpng:
9612230Sgiacomo.travaglini@arm.com     *   - png_struct: Structure holding write informations
9712230Sgiacomo.travaglini@arm.com     *   - png_info  : Structure holding image informations
9812230Sgiacomo.travaglini@arm.com     *
9912230Sgiacomo.travaglini@arm.com     * The class is automatically taking care of struct
10012230Sgiacomo.travaglini@arm.com     * allocation/deallocation
10112230Sgiacomo.travaglini@arm.com     */
10212230Sgiacomo.travaglini@arm.com    struct PngStructHandle;
10312230Sgiacomo.travaglini@arm.com
10412230Sgiacomo.travaglini@arm.com    typedef PngPixel24 PixelType;
10512230Sgiacomo.travaglini@arm.com
10612230Sgiacomo.travaglini@arm.com    static const char* _imgExtension;
10712230Sgiacomo.travaglini@arm.com};
10812230Sgiacomo.travaglini@arm.com
10912230Sgiacomo.travaglini@arm.com#endif // __BASE_PNG_HH__
110