ISA: Make the decode function part of the ISA's decoder.
[gem5.git] / src / base / vnc / convert.cc
1 /*
2 * Copyright (c) 2011 ARM Limited
3 * All rights reserved
4 *
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.
13 *
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.
24 *
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.
36 *
37 * Authors: Ali Saidi
38 * William Wang
39 */
40
41 #include <cassert>
42
43 #include "base/vnc/convert.hh"
44 #include "base/misc.hh"
45
46 /** @file
47 * This file provides conversion functions for a variety of video modes
48 */
49
50 VideoConvert::VideoConvert(Mode input_mode, Mode output_mode, int _width,
51 int _height)
52 : inputMode(input_mode), outputMode(output_mode), width(_width),
53 height(_height)
54 {
55 if (inputMode != bgr565 && inputMode != rgb565 && inputMode != bgr8888)
56 fatal("Only support converting from bgr565, rdb565, and bgr8888\n");
57
58 if (outputMode != rgb8888)
59 fatal("Only support converting to rgb8888\n");
60
61 assert(0 < height && height < 4000);
62 assert(0 < width && width < 4000);
63 }
64
65 VideoConvert::~VideoConvert()
66 {
67 }
68
69 uint8_t*
70 VideoConvert::convert(const uint8_t *fb) const
71 {
72 switch (inputMode) {
73 case bgr565:
74 return m565rgb8888(fb, true);
75 case rgb565:
76 return m565rgb8888(fb, false);
77 case bgr8888:
78 return bgr8888rgb8888(fb);
79 default:
80 panic("Unimplemented Mode\n");
81 }
82 }
83
84 uint8_t*
85 VideoConvert::m565rgb8888(const uint8_t *fb, bool bgr) const
86 {
87 uint8_t *out = new uint8_t[area() * sizeof(uint32_t)];
88 uint32_t *out32 = (uint32_t*)out;
89
90 uint16_t *in16 = (uint16_t*)fb;
91
92 for (int x = 0; x < area(); x++) {
93 Bgr565 inpx;
94 Rgb8888 outpx = 0;
95
96 inpx = in16[x];
97
98 if (bgr) {
99 outpx.red = inpx.blue << 3;
100 outpx.green = inpx.green << 2;
101 outpx.blue = inpx.red << 3;
102 } else {
103 outpx.blue = inpx.blue << 3;
104 outpx.green = inpx.green << 2;
105 outpx.red = inpx.red << 3;
106 }
107
108 out32[x] = outpx;
109 }
110
111 return out;
112 }
113
114
115 uint8_t*
116 VideoConvert::bgr8888rgb8888(const uint8_t *fb) const
117 {
118 uint8_t *out = new uint8_t[area() * sizeof(uint32_t)];
119 uint32_t *out32 = (uint32_t*)out;
120
121 uint32_t *in32 = (uint32_t*)fb;
122
123 for (int x = 0; x < area(); x++) {
124 Rgb8888 outpx = 0;
125 Bgr8888 inpx;
126
127
128 inpx = in32[x];
129
130 outpx.red = inpx.blue;
131 outpx.green = inpx.green;
132 outpx.blue = inpx.red;
133
134 out32[x] = outpx;
135 }
136
137 return out;
138 }
139 /*
140 uint64_t
141 VideoConvert::getHash(const uint8_t *fb) const
142 {
143 const uint8_t *fb_e = fb + area();
144
145 uint64_t hash = 1;
146 while (fb < fb_e - 8) {
147 hash += *((const uint64_t*)fb);
148 fb += 8;
149 }
150
151 while (fb < fb_e) {
152 hash += *(fb++);
153 }
154
155 return hash;
156 }*/