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