2 * Copyright (c) 2011 ARM Limited
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 #include "base/vnc/convert.hh"
44 #include "base/misc.hh"
47 * This file provides conversion functions for a variety of video modes
50 VideoConvert::VideoConvert(Mode input_mode
, Mode output_mode
, int _width
,
52 : inputMode(input_mode
), outputMode(output_mode
), width(_width
),
55 if (inputMode
!= bgr565
&& inputMode
!= rgb565
&& inputMode
!= bgr8888
)
56 fatal("Only support converting from bgr565, rdb565, and bgr8888\n");
58 if (outputMode
!= rgb8888
)
59 fatal("Only support converting to rgb8888\n");
61 assert(0 < height
&& height
< 4000);
62 assert(0 < width
&& width
< 4000);
65 VideoConvert::~VideoConvert()
70 VideoConvert::convert(const uint8_t *fb
) const
74 return m565rgb8888(fb
, true);
76 return m565rgb8888(fb
, false);
78 return bgr8888rgb8888(fb
);
80 panic("Unimplemented Mode\n");
85 VideoConvert::m565rgb8888(const uint8_t *fb
, bool bgr
) const
87 uint8_t *out
= new uint8_t[area() * sizeof(uint32_t)];
88 uint32_t *out32
= (uint32_t*)out
;
90 uint16_t *in16
= (uint16_t*)fb
;
92 for (int x
= 0; x
< area(); x
++) {
99 outpx
.red
= inpx
.blue
<< 3;
100 outpx
.green
= inpx
.green
<< 2;
101 outpx
.blue
= inpx
.red
<< 3;
103 outpx
.blue
= inpx
.blue
<< 3;
104 outpx
.green
= inpx
.green
<< 2;
105 outpx
.red
= inpx
.red
<< 3;
116 VideoConvert::bgr8888rgb8888(const uint8_t *fb
) const
118 uint8_t *out
= new uint8_t[area() * sizeof(uint32_t)];
119 uint32_t *out32
= (uint32_t*)out
;
121 uint32_t *in32
= (uint32_t*)fb
;
123 for (int x
= 0; x
< area(); x
++) {
130 outpx
.red
= inpx
.blue
;
131 outpx
.green
= inpx
.green
;
132 outpx
.blue
= inpx
.red
;
141 VideoConvert::getHash(const uint8_t *fb) const
143 const uint8_t *fb_e = fb + area();
146 while (fb < fb_e - 8) {
147 hash += *((const uint64_t*)fb);