110839Sandreas.sandberg@arm.com/*
210839Sandreas.sandberg@arm.com * Copyright (c) 2015 ARM Limited
310839Sandreas.sandberg@arm.com * All rights reserved
410839Sandreas.sandberg@arm.com *
510839Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
610839Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
710839Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
810839Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
910839Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1010839Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1110839Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1210839Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1310839Sandreas.sandberg@arm.com *
1410839Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1510839Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
1610839Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
1710839Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
1810839Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1910839Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2010839Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2110839Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2210839Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2310839Sandreas.sandberg@arm.com * this software without specific prior written permission.
2410839Sandreas.sandberg@arm.com *
2510839Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610839Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710839Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810839Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910839Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010839Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110839Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210839Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310839Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410839Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510839Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610839Sandreas.sandberg@arm.com *
3710839Sandreas.sandberg@arm.com * Authors: Andreas Sandberg
3810839Sandreas.sandberg@arm.com */
3910839Sandreas.sandberg@arm.com
4010839Sandreas.sandberg@arm.com#include "base/framebuffer.hh"
4110839Sandreas.sandberg@arm.com
4210839Sandreas.sandberg@arm.com#include <zlib.h>
4310839Sandreas.sandberg@arm.com
4410839Sandreas.sandberg@arm.com#include "base/bitfield.hh"
4510839Sandreas.sandberg@arm.com
4610839Sandreas.sandberg@arm.comconst FrameBuffer FrameBuffer::dummy(320, 240);
4710839Sandreas.sandberg@arm.com
4810839Sandreas.sandberg@arm.comFrameBuffer::FrameBuffer(unsigned width, unsigned height)
4910839Sandreas.sandberg@arm.com    : pixels(width * height),
5010839Sandreas.sandberg@arm.com      _width(width), _height(height)
5110839Sandreas.sandberg@arm.com{
5210839Sandreas.sandberg@arm.com    clear();
5310839Sandreas.sandberg@arm.com}
5410839Sandreas.sandberg@arm.com
5510839Sandreas.sandberg@arm.comFrameBuffer::FrameBuffer()
5610839Sandreas.sandberg@arm.com    : _width(0), _height(0)
5710839Sandreas.sandberg@arm.com{
5810839Sandreas.sandberg@arm.com}
5910839Sandreas.sandberg@arm.com
6010839Sandreas.sandberg@arm.comFrameBuffer::~FrameBuffer()
6110839Sandreas.sandberg@arm.com{
6210839Sandreas.sandberg@arm.com}
6310839Sandreas.sandberg@arm.com
6410907Sandreas.sandberg@arm.com
6510907Sandreas.sandberg@arm.comvoid
6610907Sandreas.sandberg@arm.comFrameBuffer::serialize(CheckpointOut &cp) const
6710907Sandreas.sandberg@arm.com{
6810907Sandreas.sandberg@arm.com    SERIALIZE_SCALAR(_width);
6910907Sandreas.sandberg@arm.com    SERIALIZE_SCALAR(_height);
7010907Sandreas.sandberg@arm.com    SERIALIZE_CONTAINER(pixels);
7110907Sandreas.sandberg@arm.com}
7210907Sandreas.sandberg@arm.com
7310907Sandreas.sandberg@arm.comvoid
7410907Sandreas.sandberg@arm.comFrameBuffer::unserialize(CheckpointIn &cp)
7510907Sandreas.sandberg@arm.com{
7610907Sandreas.sandberg@arm.com    UNSERIALIZE_SCALAR(_width);
7710907Sandreas.sandberg@arm.com    UNSERIALIZE_SCALAR(_height);
7810907Sandreas.sandberg@arm.com    UNSERIALIZE_CONTAINER(pixels);
7910907Sandreas.sandberg@arm.com}
8010907Sandreas.sandberg@arm.com
8110839Sandreas.sandberg@arm.comvoid
8210839Sandreas.sandberg@arm.comFrameBuffer::resize(unsigned width, unsigned height)
8310839Sandreas.sandberg@arm.com{
8410839Sandreas.sandberg@arm.com    _width = width;
8510839Sandreas.sandberg@arm.com    _height = height;
8610839Sandreas.sandberg@arm.com
8710839Sandreas.sandberg@arm.com    pixels.resize(width * height);
8810839Sandreas.sandberg@arm.com}
8910839Sandreas.sandberg@arm.com
9010839Sandreas.sandberg@arm.comvoid
9110839Sandreas.sandberg@arm.comFrameBuffer::fill(const Pixel &pixel)
9210839Sandreas.sandberg@arm.com{
9310839Sandreas.sandberg@arm.com    for (auto &p : pixels)
9410839Sandreas.sandberg@arm.com        p = pixel;
9510839Sandreas.sandberg@arm.com}
9610839Sandreas.sandberg@arm.com
9710839Sandreas.sandberg@arm.comvoid
9810839Sandreas.sandberg@arm.comFrameBuffer::clear()
9910839Sandreas.sandberg@arm.com{
10010839Sandreas.sandberg@arm.com    static const Pixel black(0, 0, 0);
10110839Sandreas.sandberg@arm.com
10210839Sandreas.sandberg@arm.com    fill(black);
10310839Sandreas.sandberg@arm.com}
10410839Sandreas.sandberg@arm.com
10510839Sandreas.sandberg@arm.comvoid
10610839Sandreas.sandberg@arm.comFrameBuffer::copyIn(const uint8_t *fb, const PixelConverter &conv)
10710839Sandreas.sandberg@arm.com{
10810839Sandreas.sandberg@arm.com    for (auto &p : pixels) {
10910839Sandreas.sandberg@arm.com        p = conv.toPixel(fb);
11010839Sandreas.sandberg@arm.com        fb += conv.length;
11110839Sandreas.sandberg@arm.com    }
11210839Sandreas.sandberg@arm.com}
11310839Sandreas.sandberg@arm.com
11410839Sandreas.sandberg@arm.comvoid
11510839Sandreas.sandberg@arm.comFrameBuffer::copyOut(uint8_t *fb, const PixelConverter &conv) const
11610839Sandreas.sandberg@arm.com{
11710839Sandreas.sandberg@arm.com    for (auto &p : pixels) {
11810839Sandreas.sandberg@arm.com        conv.fromPixel(fb, p);
11910839Sandreas.sandberg@arm.com        fb += conv.length;
12010839Sandreas.sandberg@arm.com    }
12110839Sandreas.sandberg@arm.com}
12210839Sandreas.sandberg@arm.com
12310839Sandreas.sandberg@arm.comuint64_t
12410839Sandreas.sandberg@arm.comFrameBuffer::getHash() const
12510839Sandreas.sandberg@arm.com{
12610839Sandreas.sandberg@arm.com    return adler32(0UL,
12710839Sandreas.sandberg@arm.com                   reinterpret_cast<const Bytef *>(pixels.data()),
12810839Sandreas.sandberg@arm.com                   area() * sizeof(Pixel));
12910839Sandreas.sandberg@arm.com}
130