base: Split out the pixel class in framebuffer.(cc|hh).
authorGabe Black <gabeblack@google.com>
Tue, 5 Dec 2017 04:22:43 +0000 (20:22 -0800)
committerGabe Black <gabeblack@google.com>
Wed, 6 Dec 2017 01:14:52 +0000 (01:14 +0000)
These are really two separate things. Also, while it's realitively
straightforward to write a unit test for the pixel conversion code, the
framebuffer object is serializable and brings in more dependencies.

Change-Id: If954caeb0bfedb1002cfb1a7a115a00c90d56d19
Reviewed-on: https://gem5-review.googlesource.com/6341
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/base/SConscript
src/base/framebuffer.cc
src/base/framebuffer.hh
src/base/pixel.cc [new file with mode: 0644]
src/base/pixel.hh [new file with mode: 0644]
src/unittest/SConscript
src/unittest/fbtest.cc [deleted file]
src/unittest/pixeltest.cc [new file with mode: 0644]

index 75759fd371708d073c81dbf2d5660ec0834b3c2a..fb14c4dc33ae2884013559b9290b4cc07987fbf3 100644 (file)
@@ -54,6 +54,7 @@ Source('intmath.cc')
 Source('logging.cc')
 Source('match.cc')
 Source('output.cc')
+Source('pixel.cc')
 Source('pollevent.cc')
 Source('random.cc')
 if env['TARGET_ISA'] != 'null':
index 73f7248926c0c84bf0c480dad56477797468e04b..746327ac600f100cb94bcf7f98bd63e8f91212e0 100644 (file)
 
 #include <zlib.h>
 
-#include <cassert>
-
 #include "base/bitfield.hh"
 
-const PixelConverter PixelConverter::rgba8888_le(4, 0, 8, 16, 8, 8, 8);
-const PixelConverter PixelConverter::rgba8888_be(4, 0, 8, 16, 8, 8, 8,
-                                                 BigEndianByteOrder);
-const PixelConverter PixelConverter::rgb565_le(2,  0, 5, 11, 5, 6, 5);
-const PixelConverter PixelConverter::rgb565_be(2,  0, 5, 11, 5, 6, 5,
-                                               BigEndianByteOrder);
-
 const FrameBuffer FrameBuffer::dummy(320, 240);
 
-PixelConverter::PixelConverter(unsigned _length,
-                               unsigned ro, unsigned go, unsigned bo,
-                               unsigned rw, unsigned gw, unsigned bw,
-                               ByteOrder _byte_order)
-    : length(_length),
-      depth(rw + gw + bw),
-      byte_order(_byte_order),
-      ch_r(ro, rw),
-      ch_g(go, gw),
-      ch_b(bo, bw)
-{
-    assert(length > 1);
-}
-
-PixelConverter::Channel::Channel(unsigned _offset, unsigned width)
-    : offset(_offset),
-      mask(::mask(width)),
-      factor(255.0 / mask)
-{
-}
-
-uint32_t
-PixelConverter::readWord(const uint8_t *p) const
-{
-    uint32_t word(0);
-
-    if (byte_order == LittleEndianByteOrder) {
-        for (int i = 0; i < length; ++i)
-            word |= p[i] << (8 * i);
-    } else {
-        for (int i = 0; i < length; ++i)
-            word |= p[i] << (8 * (length - i - 1));
-    }
-
-    return word;
-}
-
-void
-PixelConverter::writeWord(uint8_t *p, uint32_t word) const
-{
-    if (byte_order == LittleEndianByteOrder) {
-        for (int i = 0; i < length; ++i)
-            p[i] = (word >> (8 * i)) & 0xFF;
-    } else {
-        for (int i = 0; i < length; ++i)
-            p[i] = (word >> (8 * (length - i - 1))) & 0xFF;
-    }
-}
-
-
-
-
 FrameBuffer::FrameBuffer(unsigned width, unsigned height)
     : pixels(width * height),
       _width(width), _height(height)
index fbeafb4673e826ff415fb0adda6a604ad8772bf4..ae2e15c3c26ac2cd55eae7cc6bb3cc4091d68555 100644 (file)
 
 #include "base/compiler.hh"
 #include "base/cprintf.hh"
+#include "base/pixel.hh"
 #include "base/str.hh"
 #include "base/types.hh"
 #include "sim/serialize.hh"
 
-/**
- * Internal gem5 representation of a Pixel.
- */
-struct Pixel
-{
-    Pixel()
-        : red(0), green(0), blue(0), padding(0) {}
-
-    Pixel(uint8_t _red, uint8_t _green, uint8_t _blue)
-        : red(_red), green(_green), blue(_blue), padding(0) {}
-
-    uint8_t red;
-    uint8_t green;
-    uint8_t blue;
-    uint8_t padding;
-};
-
-inline bool
-operator==(const Pixel &lhs, const Pixel &rhs)
-{
-    return lhs.red == rhs.red &&
-        lhs.green == rhs.green &&
-        lhs.blue == rhs.blue &&
-        lhs.padding == rhs.padding;
-}
-
-/**
- * Configurable RGB pixel converter.
- *
- * This class converts between external RGB representations and gem5's
- * internal Pixel representation. The class assumes that pixels are
- * stored in a word of configurable length (up to 32 bits). Individual
- * pixels are assumed to be represented by contiguous bit ranges in
- * the word (i.e., it is possible to shift and mask out a contiguous
- * bit range for each pixel).
- */
-class PixelConverter
-{
-  public:
-    /**
-     * Color channel conversion and scaling helper class.
-     */
-    struct Channel {
-        /**
-         * @param offset Offset in bits.
-         * @param width Width in bits.
-         */
-        Channel(unsigned offset, unsigned width);
-
-        /**
-         * Get the value of a single color channel represented as an
-         * 8-bit number.
-         */
-        uint8_t toPixel(uint32_t word) const {
-            return round(((word >> offset) & mask) * factor);
-        }
-
-        /**
-         * Convert an 8-bit representation of a color into an external
-         * format.
-         */
-        uint32_t fromPixel(uint8_t ch) const {
-            return (static_cast<uint8_t>(round(ch / factor)) & mask) << offset;
-        }
-
-        /** Offset in bits */
-        unsigned offset;
-        /** Bit mask (after shifting) */
-        unsigned mask;
-        /**
-         * Scaling factor when converting to the full range of an
-         * 8-bit color channel
-         */
-        float factor;
-    };
-
-    PixelConverter(unsigned length,
-                   unsigned ro, unsigned go, unsigned bo,
-                   unsigned rw, unsigned gw, unsigned bw,
-                   ByteOrder byte_order = LittleEndianByteOrder);
-
-    /** Get the Pixel representation of a color word. */
-    Pixel toPixel(uint32_t word) const {
-        return Pixel(ch_r.toPixel(word),
-                     ch_g.toPixel(word),
-                     ch_b.toPixel(word));
-    }
-
-    /** Get a Pixel representation by reading a word from memory. */
-    Pixel toPixel(const uint8_t *rfb) const {
-        return toPixel(readWord(rfb));
-    }
-
-    /** Convert a Pixel into a color word */
-    uint32_t fromPixel(const Pixel &pixel) const {
-        return ch_r.fromPixel(pixel.red) |
-            ch_g.fromPixel(pixel.green) |
-            ch_b.fromPixel(pixel.blue);
-    }
-
-    /**
-     * Convert a pixel into a color word and store the resulting word
-     * in memory.
-     */
-    void fromPixel(uint8_t *rfb, const Pixel &pixel) const {
-        writeWord(rfb, fromPixel(pixel));
-    }
-
-    /**
-     * Read a word of a given length and endianness from memory.
-     *
-     * The number of bytes read from memory is determined by the
-     * length of a color word. Note that some of the bytes may be
-     * padding.
-     *
-     * @param p Pointer to the first byte in the word.
-     * @return Word in host endianness.
-     */
-    uint32_t readWord(const uint8_t *p) const;
-    /**
-     * Write a word of a given length and endianness to memory.
-     *
-     * @param p Pointer to the first byte in memory.
-     * @param word Word to store (host endianness).
-     */
-    void writeWord(uint8_t *p, uint32_t word) const;
-
-    /** Bytes per pixel when stored in memory (including padding) */
-    unsigned length;
-    /**
-     * Number of bits used to represent one pixel value (excluding
-     * padding). This could be less than length * 8 if the pixel value
-     * is padded.
-     */
-    unsigned depth;
-    /** Byte order when stored to memory. */
-    ByteOrder byte_order;
-
-    /** Red channel conversion helper */
-    Channel ch_r;
-    /** Green channel conversion helper */
-    Channel ch_g;
-    /** Blue channel conversion helper */
-    Channel ch_b;
-
-    /** Predefined 32-bit RGB (red in least significant bits, 8
-     * bits/channel, little endian) conversion helper */
-    static const PixelConverter rgba8888_le;
-    /** Predefined 16-bit RGB565 (red in least significant bits,
-     * little endian) conversion helper */
-    static const PixelConverter rgb565_le;
-
-    /** Predefined 32-bit RGB (red in least significant bits, 8
-     * bits/channel, big endian) conversion helper */
-    static const PixelConverter rgba8888_be;
-    /** Predefined 16-bit RGB565 (red in least significant bits,
-     * big endian) conversion helper */
-    static const PixelConverter rgb565_be;
-};
-
-inline bool
-to_number(const std::string &value, Pixel &retval)
-{
-    uint32_t num;
-    if (!to_number(value, num))
-        return false;
-
-    retval = PixelConverter::rgba8888_le.toPixel(num);
-    return true;
-}
-
-inline std::ostream &
-operator<<(std::ostream &os, const Pixel &pxl)
-{
-    os << csprintf("0x%.08x", PixelConverter::rgba8888_le.fromPixel(pxl));
-    return os;
-}
-
 /**
  * Internal gem5 representation of a frame buffer
  *
diff --git a/src/base/pixel.cc b/src/base/pixel.cc
new file mode 100644 (file)
index 0000000..29dcaf6
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * 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.
+ *
+ * Authors: Andreas Sandberg
+ */
+
+#include "base/pixel.hh"
+
+#include <cassert>
+
+#include "base/bitfield.hh"
+
+const PixelConverter PixelConverter::rgba8888_le(4, 0, 8, 16, 8, 8, 8);
+const PixelConverter PixelConverter::rgba8888_be(4, 0, 8, 16, 8, 8, 8,
+                                                 BigEndianByteOrder);
+const PixelConverter PixelConverter::rgb565_le(2,  0, 5, 11, 5, 6, 5);
+const PixelConverter PixelConverter::rgb565_be(2,  0, 5, 11, 5, 6, 5,
+                                               BigEndianByteOrder);
+
+PixelConverter::PixelConverter(unsigned _length,
+                               unsigned ro, unsigned go, unsigned bo,
+                               unsigned rw, unsigned gw, unsigned bw,
+                               ByteOrder _byte_order)
+    : length(_length),
+      depth(rw + gw + bw),
+      byte_order(_byte_order),
+      ch_r(ro, rw),
+      ch_g(go, gw),
+      ch_b(bo, bw)
+{
+    assert(length > 1);
+}
+
+PixelConverter::Channel::Channel(unsigned _offset, unsigned width)
+    : offset(_offset),
+      mask(::mask(width)),
+      factor(255.0 / mask)
+{
+}
+
+uint32_t
+PixelConverter::readWord(const uint8_t *p) const
+{
+    uint32_t word(0);
+
+    if (byte_order == LittleEndianByteOrder) {
+        for (int i = 0; i < length; ++i)
+            word |= p[i] << (8 * i);
+    } else {
+        for (int i = 0; i < length; ++i)
+            word |= p[i] << (8 * (length - i - 1));
+    }
+
+    return word;
+}
+
+void
+PixelConverter::writeWord(uint8_t *p, uint32_t word) const
+{
+    if (byte_order == LittleEndianByteOrder) {
+        for (int i = 0; i < length; ++i)
+            p[i] = (word >> (8 * i)) & 0xFF;
+    } else {
+        for (int i = 0; i < length; ++i)
+            p[i] = (word >> (8 * (length - i - 1))) & 0xFF;
+    }
+}
diff --git a/src/base/pixel.hh b/src/base/pixel.hh
new file mode 100644 (file)
index 0000000..f6faace
--- /dev/null
@@ -0,0 +1,231 @@
+/*
+ * 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.
+ *
+ * Authors: Andreas Sandberg
+ */
+
+#ifndef __BASE_PIXEL_HH__
+#define __BASE_PIXEL_HH__
+
+#include <cmath>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "base/compiler.hh"
+#include "base/cprintf.hh"
+#include "base/str.hh"
+#include "base/types.hh"
+
+/**
+ * Internal gem5 representation of a Pixel.
+ */
+struct Pixel
+{
+    Pixel()
+        : red(0), green(0), blue(0), padding(0) {}
+
+    Pixel(uint8_t _red, uint8_t _green, uint8_t _blue)
+        : red(_red), green(_green), blue(_blue), padding(0) {}
+
+    uint8_t red;
+    uint8_t green;
+    uint8_t blue;
+    uint8_t padding;
+};
+
+inline bool
+operator==(const Pixel &lhs, const Pixel &rhs)
+{
+    return lhs.red == rhs.red &&
+        lhs.green == rhs.green &&
+        lhs.blue == rhs.blue &&
+        lhs.padding == rhs.padding;
+}
+
+/**
+ * Configurable RGB pixel converter.
+ *
+ * This class converts between external RGB representations and gem5's
+ * internal Pixel representation. The class assumes that pixels are
+ * stored in a word of configurable length (up to 32 bits). Individual
+ * pixels are assumed to be represented by contiguous bit ranges in
+ * the word (i.e., it is possible to shift and mask out a contiguous
+ * bit range for each pixel).
+ */
+class PixelConverter
+{
+  public:
+    /**
+     * Color channel conversion and scaling helper class.
+     */
+    struct Channel {
+        /**
+         * @param offset Offset in bits.
+         * @param width Width in bits.
+         */
+        Channel(unsigned offset, unsigned width);
+
+        /**
+         * Get the value of a single color channel represented as an
+         * 8-bit number.
+         */
+        uint8_t toPixel(uint32_t word) const {
+            return round(((word >> offset) & mask) * factor);
+        }
+
+        /**
+         * Convert an 8-bit representation of a color into an external
+         * format.
+         */
+        uint32_t fromPixel(uint8_t ch) const {
+            return (static_cast<uint8_t>(round(ch / factor)) & mask) << offset;
+        }
+
+        /** Offset in bits */
+        unsigned offset;
+        /** Bit mask (after shifting) */
+        unsigned mask;
+        /**
+         * Scaling factor when converting to the full range of an
+         * 8-bit color channel
+         */
+        float factor;
+    };
+
+    PixelConverter(unsigned length,
+                   unsigned ro, unsigned go, unsigned bo,
+                   unsigned rw, unsigned gw, unsigned bw,
+                   ByteOrder byte_order = LittleEndianByteOrder);
+
+    /** Get the Pixel representation of a color word. */
+    Pixel toPixel(uint32_t word) const {
+        return Pixel(ch_r.toPixel(word),
+                     ch_g.toPixel(word),
+                     ch_b.toPixel(word));
+    }
+
+    /** Get a Pixel representation by reading a word from memory. */
+    Pixel toPixel(const uint8_t *rfb) const {
+        return toPixel(readWord(rfb));
+    }
+
+    /** Convert a Pixel into a color word */
+    uint32_t fromPixel(const Pixel &pixel) const {
+        return ch_r.fromPixel(pixel.red) |
+            ch_g.fromPixel(pixel.green) |
+            ch_b.fromPixel(pixel.blue);
+    }
+
+    /**
+     * Convert a pixel into a color word and store the resulting word
+     * in memory.
+     */
+    void fromPixel(uint8_t *rfb, const Pixel &pixel) const {
+        writeWord(rfb, fromPixel(pixel));
+    }
+
+    /**
+     * Read a word of a given length and endianness from memory.
+     *
+     * The number of bytes read from memory is determined by the
+     * length of a color word. Note that some of the bytes may be
+     * padding.
+     *
+     * @param p Pointer to the first byte in the word.
+     * @return Word in host endianness.
+     */
+    uint32_t readWord(const uint8_t *p) const;
+    /**
+     * Write a word of a given length and endianness to memory.
+     *
+     * @param p Pointer to the first byte in memory.
+     * @param word Word to store (host endianness).
+     */
+    void writeWord(uint8_t *p, uint32_t word) const;
+
+    /** Bytes per pixel when stored in memory (including padding) */
+    unsigned length;
+    /**
+     * Number of bits used to represent one pixel value (excluding
+     * padding). This could be less than length * 8 if the pixel value
+     * is padded.
+     */
+    unsigned depth;
+    /** Byte order when stored to memory. */
+    ByteOrder byte_order;
+
+    /** Red channel conversion helper */
+    Channel ch_r;
+    /** Green channel conversion helper */
+    Channel ch_g;
+    /** Blue channel conversion helper */
+    Channel ch_b;
+
+    /** Predefined 32-bit RGB (red in least significant bits, 8
+     * bits/channel, little endian) conversion helper */
+    static const PixelConverter rgba8888_le;
+    /** Predefined 16-bit RGB565 (red in least significant bits,
+     * little endian) conversion helper */
+    static const PixelConverter rgb565_le;
+
+    /** Predefined 32-bit RGB (red in least significant bits, 8
+     * bits/channel, big endian) conversion helper */
+    static const PixelConverter rgba8888_be;
+    /** Predefined 16-bit RGB565 (red in least significant bits,
+     * big endian) conversion helper */
+    static const PixelConverter rgb565_be;
+};
+
+inline bool
+to_number(const std::string &value, Pixel &retval)
+{
+    uint32_t num;
+    if (!to_number(value, num))
+        return false;
+
+    retval = PixelConverter::rgba8888_le.toPixel(num);
+    return true;
+}
+
+inline std::ostream &
+operator<<(std::ostream &os, const Pixel &pxl)
+{
+    os << csprintf("%#.08x", PixelConverter::rgba8888_le.fromPixel(pxl));
+    return os;
+}
+
+#endif // __BASE_PIXEL_HH__
index 305d7c2cf9e075a939277ec07f58ae2c1a096023..9892df845add58ea8f8cf3c0b292d10fe34d925b 100644 (file)
@@ -35,7 +35,7 @@ Source('unittest.cc')
 UnitTest('circlebuf', 'circlebuf.cc')
 UnitTest('cprintftest', 'cprintftest.cc')
 UnitTest('cprintftime', 'cprintftime.cc')
-UnitTest('fbtest', 'fbtest.cc')
+UnitTest('pixeltest', 'pixeltest.cc')
 UnitTest('initest', 'initest.cc')
 UnitTest('nmtest', 'nmtest.cc')
 UnitTest('rangemaptest', 'rangemaptest.cc')
diff --git a/src/unittest/fbtest.cc b/src/unittest/fbtest.cc
deleted file mode 100644 (file)
index 8a8f959..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * 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.
- *
- * Authors: Andreas Sandberg
- */
-
-#include "base/framebuffer.hh"
-#include "unittest/unittest.hh"
-
-static Pixel pixel_red(0xff, 0x00, 0x00);
-static Pixel pixel_green(0x00, 0xff, 0x00);
-static Pixel pixel_blue(0x00, 0x00, 0xff);
-
-int
-main()
-{
-    UnitTest::setCase("Pixel conversion RGBA8888");
-    {
-        EXPECT_EQ(PixelConverter::rgba8888_le.fromPixel(pixel_red),
-                  0x000000ffU);
-        EXPECT_EQ(PixelConverter::rgba8888_le.fromPixel(pixel_green),
-                  0x0000ff00U);
-        EXPECT_EQ(PixelConverter::rgba8888_le.fromPixel(pixel_blue),
-                  0x00ff0000U);
-
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(0x000000ffU),
-                  pixel_red);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(0x0000ff00U),
-                  pixel_green);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(0x00ff0000U),
-                  pixel_blue);
-    }
-
-    UnitTest::setCase("Pixel conversion RGB565");
-    {
-        EXPECT_EQ(PixelConverter::rgb565_le.fromPixel(pixel_red),   0x001fU);
-        EXPECT_EQ(PixelConverter::rgb565_le.fromPixel(pixel_green), 0x07e0U);
-        EXPECT_EQ(PixelConverter::rgb565_le.fromPixel(pixel_blue),  0xf800U);
-
-        EXPECT_EQ(PixelConverter::rgb565_le.toPixel(0x001fU), pixel_red);
-        EXPECT_EQ(PixelConverter::rgb565_le.toPixel(0x07e0U), pixel_green);
-        EXPECT_EQ(PixelConverter::rgb565_le.toPixel(0xf800U), pixel_blue);
-    }
-
-    UnitTest::setCase("Pixel->Mem RGBA8888 LE");
-    {
-        uint8_t data[] = { 0xde, 0xad, 0xbe, 0xef };
-        PixelConverter::rgba8888_le.fromPixel(data, pixel_red);
-        EXPECT_EQ(data[0], 0xff);
-        EXPECT_EQ(data[1], 0x00);
-        EXPECT_EQ(data[3], 0x00);
-        EXPECT_EQ(data[3], 0x00);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(data), pixel_red);
-
-        PixelConverter::rgba8888_le.fromPixel(data, pixel_green);
-        EXPECT_EQ(data[0], 0x00);
-        EXPECT_EQ(data[1], 0xff);
-        EXPECT_EQ(data[3], 0x00);
-        EXPECT_EQ(data[3], 0x00);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(data), pixel_green);
-
-        PixelConverter::rgba8888_le.fromPixel(data, pixel_blue);
-        EXPECT_EQ(data[0], 0x00);
-        EXPECT_EQ(data[1], 0x00);
-        EXPECT_EQ(data[2], 0xff);
-        EXPECT_EQ(data[3], 0x00);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(data), pixel_blue);
-    }
-
-    UnitTest::setCase("Mem->Pixel RGBA8888 LE");
-    {
-        uint8_t red[] = { 0xff, 0x00, 0x00, 0x00 };
-        uint8_t green[] = { 0x00, 0xff, 0x00, 0x00 };
-        uint8_t blue[] = { 0x00, 0x00, 0xff, 0x00 };
-
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(red), pixel_red);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(green), pixel_green);
-        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(blue), pixel_blue);
-    }
-
-    UnitTest::setCase("Mem->Pixel RGBA8888 BE");
-    {
-        uint8_t red[] = { 0x00, 0x00, 0x00, 0xff };
-        uint8_t green[] = { 0x00, 0x00, 0xff, 0x00 };
-        uint8_t blue[] = { 0x00, 0xff, 0x00, 0x00 };
-
-        EXPECT_EQ(PixelConverter::rgba8888_be.toPixel(red), pixel_red);
-        EXPECT_EQ(PixelConverter::rgba8888_be.toPixel(green), pixel_green);
-        EXPECT_EQ(PixelConverter::rgba8888_be.toPixel(blue), pixel_blue);
-    }
-
-    return UnitTest::printResults();
-}
diff --git a/src/unittest/pixeltest.cc b/src/unittest/pixeltest.cc
new file mode 100644 (file)
index 0000000..8a8f959
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * 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.
+ *
+ * Authors: Andreas Sandberg
+ */
+
+#include "base/framebuffer.hh"
+#include "unittest/unittest.hh"
+
+static Pixel pixel_red(0xff, 0x00, 0x00);
+static Pixel pixel_green(0x00, 0xff, 0x00);
+static Pixel pixel_blue(0x00, 0x00, 0xff);
+
+int
+main()
+{
+    UnitTest::setCase("Pixel conversion RGBA8888");
+    {
+        EXPECT_EQ(PixelConverter::rgba8888_le.fromPixel(pixel_red),
+                  0x000000ffU);
+        EXPECT_EQ(PixelConverter::rgba8888_le.fromPixel(pixel_green),
+                  0x0000ff00U);
+        EXPECT_EQ(PixelConverter::rgba8888_le.fromPixel(pixel_blue),
+                  0x00ff0000U);
+
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(0x000000ffU),
+                  pixel_red);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(0x0000ff00U),
+                  pixel_green);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(0x00ff0000U),
+                  pixel_blue);
+    }
+
+    UnitTest::setCase("Pixel conversion RGB565");
+    {
+        EXPECT_EQ(PixelConverter::rgb565_le.fromPixel(pixel_red),   0x001fU);
+        EXPECT_EQ(PixelConverter::rgb565_le.fromPixel(pixel_green), 0x07e0U);
+        EXPECT_EQ(PixelConverter::rgb565_le.fromPixel(pixel_blue),  0xf800U);
+
+        EXPECT_EQ(PixelConverter::rgb565_le.toPixel(0x001fU), pixel_red);
+        EXPECT_EQ(PixelConverter::rgb565_le.toPixel(0x07e0U), pixel_green);
+        EXPECT_EQ(PixelConverter::rgb565_le.toPixel(0xf800U), pixel_blue);
+    }
+
+    UnitTest::setCase("Pixel->Mem RGBA8888 LE");
+    {
+        uint8_t data[] = { 0xde, 0xad, 0xbe, 0xef };
+        PixelConverter::rgba8888_le.fromPixel(data, pixel_red);
+        EXPECT_EQ(data[0], 0xff);
+        EXPECT_EQ(data[1], 0x00);
+        EXPECT_EQ(data[3], 0x00);
+        EXPECT_EQ(data[3], 0x00);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(data), pixel_red);
+
+        PixelConverter::rgba8888_le.fromPixel(data, pixel_green);
+        EXPECT_EQ(data[0], 0x00);
+        EXPECT_EQ(data[1], 0xff);
+        EXPECT_EQ(data[3], 0x00);
+        EXPECT_EQ(data[3], 0x00);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(data), pixel_green);
+
+        PixelConverter::rgba8888_le.fromPixel(data, pixel_blue);
+        EXPECT_EQ(data[0], 0x00);
+        EXPECT_EQ(data[1], 0x00);
+        EXPECT_EQ(data[2], 0xff);
+        EXPECT_EQ(data[3], 0x00);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(data), pixel_blue);
+    }
+
+    UnitTest::setCase("Mem->Pixel RGBA8888 LE");
+    {
+        uint8_t red[] = { 0xff, 0x00, 0x00, 0x00 };
+        uint8_t green[] = { 0x00, 0xff, 0x00, 0x00 };
+        uint8_t blue[] = { 0x00, 0x00, 0xff, 0x00 };
+
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(red), pixel_red);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(green), pixel_green);
+        EXPECT_EQ(PixelConverter::rgba8888_le.toPixel(blue), pixel_blue);
+    }
+
+    UnitTest::setCase("Mem->Pixel RGBA8888 BE");
+    {
+        uint8_t red[] = { 0x00, 0x00, 0x00, 0xff };
+        uint8_t green[] = { 0x00, 0x00, 0xff, 0x00 };
+        uint8_t blue[] = { 0x00, 0xff, 0x00, 0x00 };
+
+        EXPECT_EQ(PixelConverter::rgba8888_be.toPixel(red), pixel_red);
+        EXPECT_EQ(PixelConverter::rgba8888_be.toPixel(green), pixel_green);
+        EXPECT_EQ(PixelConverter::rgba8888_be.toPixel(blue), pixel_blue);
+    }
+
+    return UnitTest::printResults();
+}