| /* |
| * Copyright (c) 2015 ARM Limited |
| * All rights reserved |
| * |
| * The license below extends only to copyright in the software and shall |
| * not be construed as granting a license to any other intellectual |
| * property including but not limited to intellectual property relating |
| * to a hardware implementation of the functionality of the software |
| * licensed hereunder. You may use the software subject to the license |
| * terms below provided that you ensure that this notice is replicated |
| * unmodified and in its entirety in all distributions of the software, |
| * modified or unmodified, in source code or in binary form. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer; |
| * redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution; |
| * neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef __BASE_FRAMEBUFFER_HH__ |
| #define __BASE_FRAMEBUFFER_HH__ |
| |
| #include <cmath> |
| #include <cstdint> |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/compiler.hh" |
| #include "base/cprintf.hh" |
| #include "base/pixel.hh" |
| #include "base/str.hh" |
| #include "base/types.hh" |
| #include "sim/serialize.hh" |
| |
| namespace gem5 |
| { |
| |
| /** |
| * Internal gem5 representation of a frame buffer |
| * |
| * Display controllers and other devices producing images are expected |
| * to use this class to represent the final image. |
| * |
| * Pixels are indexed relative to the upper left corner of the |
| * image. That is, the pixel at position (0, 0) is the upper left |
| * corner. The backing store is a linear vector of Pixels ordered left |
| * to right starting in the upper left corner. |
| */ |
| class FrameBuffer : public Serializable |
| { |
| public: |
| /** |
| * Create a frame buffer of a given size. |
| * |
| * @param width Width in pixels |
| * @param height Height in pixels |
| */ |
| FrameBuffer(unsigned width, unsigned height); |
| /** Create an empty (0x0) frame buffer */ |
| FrameBuffer(); |
| |
| virtual ~FrameBuffer(); |
| |
| void serialize(CheckpointOut &cp) const override; |
| void unserialize(CheckpointIn &cp) override; |
| |
| /** |
| * Resize the frame buffer. |
| * |
| * This method resizes frame buffer including the backing |
| * store. The contents of the backing store are undefined after |
| * this operation. |
| * |
| * @param with Width in pixels. |
| * @param height Height in pixels. |
| */ |
| void resize(unsigned width, unsigned height); |
| |
| /** Frame buffer width in pixels */ |
| unsigned width() const { return _width; } |
| /** Frame buffer height in pixels */ |
| unsigned height() const { return _height; } |
| /** Total number of pixels in frame buffer */ |
| unsigned area() const { return _width * _height; } |
| |
| /** |
| * Fill the frame buffer with a single pixel value |
| * |
| * @param pixel Pixel value to fill with. |
| */ |
| void fill(const Pixel &pixel); |
| /** |
| * Fill the frame buffer with black pixels |
| */ |
| void clear(); |
| |
| /** |
| * Fill the frame buffer with pixel data from an external buffer |
| * of the same width and height as this frame buffer. |
| * |
| * @param fb External frame buffer |
| * @param conv Pixel conversion helper |
| */ |
| void copyIn(const uint8_t *fb, const PixelConverter &conv); |
| /** |
| * Fill the frame buffer with pixel data from an external buffer |
| * of the same width and height as this frame buffer. |
| * |
| * @param fb External frame buffer |
| * @param conv Pixel conversion helper |
| */ |
| void copyIn(const std::vector<uint8_t> &fb, const PixelConverter &conv) { |
| copyIn(fb.data(), conv); |
| } |
| |
| /** |
| * Store the contents of this frame buffer in an external buffer |
| * of the same width and height as this frame buffer. |
| * |
| * @param fb External frame buffer |
| * @param conv Pixel conversion helper |
| */ |
| void copyOut(uint8_t *fb, const PixelConverter &conv) const; |
| /** |
| * Store the contents of this frame buffer in an external buffer |
| * of the same width and height as this frame buffer. |
| * |
| * @param fb External frame buffer |
| * @param conv Pixel conversion helper |
| */ |
| void copyOut(std::vector<uint8_t> &fb, const PixelConverter &conv) const { |
| copyOut(fb.data(), conv); |
| } |
| |
| /** |
| * Get a pixel from an (x, y) coordinate |
| * |
| * @param x Distance from the left margin. |
| * @param y Distance from the top of the frame. |
| */ |
| const Pixel &pixel(unsigned x, unsigned y) const { |
| assert(x < _width); |
| assert(y < _height); |
| |
| return pixels[y * _width + x]; |
| } |
| |
| /** |
| * Get a pixel from an (x, y) coordinate |
| * |
| * @param x Distance from the left margin. |
| * @param y Distance from the top of the frame. |
| */ |
| Pixel &pixel(unsigned x, unsigned y) { |
| assert(x < _width); |
| assert(y < _height); |
| |
| return pixels[y * _width + x]; |
| } |
| |
| /** |
| * Create a hash of the image that can be used for quick |
| * comparisons. |
| */ |
| uint64_t getHash() const; |
| |
| /** |
| * Static "dummy" frame buffer. |
| * |
| * This is a dummy frame buffer that can be used as a place holder |
| * for devices that always expect a frame buffer to be present. |
| */ |
| static const FrameBuffer dummy; |
| |
| /** Frame buffer backing store */ |
| std::vector<Pixel> pixels; |
| |
| protected: |
| /** Width in pixels */ |
| unsigned _width; |
| /** Height in pixels */ |
| unsigned _height; |
| }; |
| |
| } // namespace gem5 |
| |
| #endif // __BASE_FRAMEBUFFER_HH__ |