root / ui / vnc-palette.c @ 72aefb76
History | View | Annotate | Download (3.7 kB)
1 | 5136a052 | Corentin Chary | /*
|
---|---|---|---|
2 | 5136a052 | Corentin Chary | * QEMU VNC display driver: palette hash table
|
3 | 5136a052 | Corentin Chary | *
|
4 | 5136a052 | Corentin Chary | * From libvncserver/libvncserver/tight.c
|
5 | 5136a052 | Corentin Chary | * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved.
|
6 | 5136a052 | Corentin Chary | * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
7 | 5136a052 | Corentin Chary | *
|
8 | 5136a052 | Corentin Chary | * Copyright (C) 2010 Corentin Chary <corentin.chary@gmail.com>
|
9 | 5136a052 | Corentin Chary | *
|
10 | 5136a052 | Corentin Chary | * Permission is hereby granted, free of charge, to any person obtaining a copy
|
11 | 5136a052 | Corentin Chary | * of this software and associated documentation files (the "Software"), to deal
|
12 | 5136a052 | Corentin Chary | * in the Software without restriction, including without limitation the rights
|
13 | 5136a052 | Corentin Chary | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
14 | 5136a052 | Corentin Chary | * copies of the Software, and to permit persons to whom the Software is
|
15 | 5136a052 | Corentin Chary | * furnished to do so, subject to the following conditions:
|
16 | 5136a052 | Corentin Chary | *
|
17 | 5136a052 | Corentin Chary | * The above copyright notice and this permission notice shall be included in
|
18 | 5136a052 | Corentin Chary | * all copies or substantial portions of the Software.
|
19 | 5136a052 | Corentin Chary | *
|
20 | 5136a052 | Corentin Chary | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
21 | 5136a052 | Corentin Chary | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
22 | 5136a052 | Corentin Chary | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
23 | 5136a052 | Corentin Chary | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
24 | 5136a052 | Corentin Chary | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
25 | 5136a052 | Corentin Chary | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
26 | 5136a052 | Corentin Chary | * THE SOFTWARE.
|
27 | 5136a052 | Corentin Chary | */
|
28 | 5136a052 | Corentin Chary | |
29 | 5136a052 | Corentin Chary | #include "vnc-palette.h" |
30 | 5136a052 | Corentin Chary | |
31 | 5136a052 | Corentin Chary | static VncPaletteEntry *palette_find(const VncPalette *palette, |
32 | 5136a052 | Corentin Chary | uint32_t color, unsigned int hash) |
33 | 5136a052 | Corentin Chary | { |
34 | 5136a052 | Corentin Chary | VncPaletteEntry *entry; |
35 | 5136a052 | Corentin Chary | |
36 | 5136a052 | Corentin Chary | QLIST_FOREACH(entry, &palette->table[hash], next) { |
37 | 5136a052 | Corentin Chary | if (entry->color == color) {
|
38 | 5136a052 | Corentin Chary | return entry;
|
39 | 5136a052 | Corentin Chary | } |
40 | 5136a052 | Corentin Chary | } |
41 | 5136a052 | Corentin Chary | |
42 | 5136a052 | Corentin Chary | return NULL; |
43 | 5136a052 | Corentin Chary | } |
44 | 5136a052 | Corentin Chary | |
45 | 5136a052 | Corentin Chary | static unsigned int palette_hash(uint32_t rgb, int bpp) |
46 | 5136a052 | Corentin Chary | { |
47 | 5136a052 | Corentin Chary | if (bpp == 16) { |
48 | 5136a052 | Corentin Chary | return ((unsigned int)(((rgb >> 8) + rgb) & 0xFF)); |
49 | 5136a052 | Corentin Chary | } else {
|
50 | 5136a052 | Corentin Chary | return ((unsigned int)(((rgb >> 16) + (rgb >> 8)) & 0xFF)); |
51 | 5136a052 | Corentin Chary | } |
52 | 5136a052 | Corentin Chary | } |
53 | 5136a052 | Corentin Chary | |
54 | 5136a052 | Corentin Chary | VncPalette *palette_new(size_t max, int bpp)
|
55 | 5136a052 | Corentin Chary | { |
56 | 5136a052 | Corentin Chary | VncPalette *palette; |
57 | 5136a052 | Corentin Chary | |
58 | 5136a052 | Corentin Chary | palette = qemu_mallocz(sizeof(*palette));
|
59 | 72aefb76 | Corentin Chary | palette_init(palette, max, bpp); |
60 | 72aefb76 | Corentin Chary | return palette;
|
61 | 72aefb76 | Corentin Chary | } |
62 | 72aefb76 | Corentin Chary | |
63 | 72aefb76 | Corentin Chary | void palette_init(VncPalette *palette, size_t max, int bpp) |
64 | 72aefb76 | Corentin Chary | { |
65 | 72aefb76 | Corentin Chary | memset(palette, 0, sizeof (*palette)); |
66 | 5136a052 | Corentin Chary | palette->max = max; |
67 | 5136a052 | Corentin Chary | palette->bpp = bpp; |
68 | 5136a052 | Corentin Chary | } |
69 | 5136a052 | Corentin Chary | |
70 | 5136a052 | Corentin Chary | void palette_destroy(VncPalette *palette)
|
71 | 5136a052 | Corentin Chary | { |
72 | 5136a052 | Corentin Chary | if (palette == NULL) { |
73 | e31e3694 | Corentin Chary | qemu_free(palette); |
74 | 5136a052 | Corentin Chary | } |
75 | 5136a052 | Corentin Chary | } |
76 | 5136a052 | Corentin Chary | |
77 | 5136a052 | Corentin Chary | int palette_put(VncPalette *palette, uint32_t color)
|
78 | 5136a052 | Corentin Chary | { |
79 | 5136a052 | Corentin Chary | unsigned int hash; |
80 | 5136a052 | Corentin Chary | unsigned int idx = palette->size; |
81 | 5136a052 | Corentin Chary | VncPaletteEntry *entry; |
82 | 5136a052 | Corentin Chary | |
83 | 5136a052 | Corentin Chary | hash = palette_hash(color, palette->bpp) % VNC_PALETTE_HASH_SIZE; |
84 | 5136a052 | Corentin Chary | entry = palette_find(palette, color, hash); |
85 | 5136a052 | Corentin Chary | |
86 | 5136a052 | Corentin Chary | if (!entry && palette->size >= palette->max) {
|
87 | 5136a052 | Corentin Chary | return 0; |
88 | 5136a052 | Corentin Chary | } |
89 | 5136a052 | Corentin Chary | if (!entry) {
|
90 | 5136a052 | Corentin Chary | VncPaletteEntry *entry; |
91 | 5136a052 | Corentin Chary | |
92 | e31e3694 | Corentin Chary | entry = &palette->pool[palette->size]; |
93 | 5136a052 | Corentin Chary | entry->color = color; |
94 | 5136a052 | Corentin Chary | entry->idx = idx; |
95 | 5136a052 | Corentin Chary | QLIST_INSERT_HEAD(&palette->table[hash], entry, next); |
96 | 5136a052 | Corentin Chary | palette->size++; |
97 | 5136a052 | Corentin Chary | } |
98 | 5136a052 | Corentin Chary | return palette->size;
|
99 | 5136a052 | Corentin Chary | } |
100 | 5136a052 | Corentin Chary | |
101 | 5136a052 | Corentin Chary | int palette_idx(const VncPalette *palette, uint32_t color) |
102 | 5136a052 | Corentin Chary | { |
103 | 5136a052 | Corentin Chary | VncPaletteEntry *entry; |
104 | 5136a052 | Corentin Chary | unsigned int hash; |
105 | 5136a052 | Corentin Chary | |
106 | 5136a052 | Corentin Chary | hash = palette_hash(color, palette->bpp) % VNC_PALETTE_HASH_SIZE; |
107 | 5136a052 | Corentin Chary | entry = palette_find(palette, color, hash); |
108 | 5136a052 | Corentin Chary | return (entry == NULL ? -1 : entry->idx); |
109 | 5136a052 | Corentin Chary | } |
110 | 5136a052 | Corentin Chary | |
111 | 5136a052 | Corentin Chary | size_t palette_size(const VncPalette *palette)
|
112 | 5136a052 | Corentin Chary | { |
113 | 5136a052 | Corentin Chary | return palette->size;
|
114 | 5136a052 | Corentin Chary | } |
115 | 5136a052 | Corentin Chary | |
116 | 5136a052 | Corentin Chary | void palette_iter(const VncPalette *palette, |
117 | 5136a052 | Corentin Chary | void (*iter)(int idx, uint32_t color, void *opaque), |
118 | 5136a052 | Corentin Chary | void *opaque)
|
119 | 5136a052 | Corentin Chary | { |
120 | 5136a052 | Corentin Chary | int i;
|
121 | 5136a052 | Corentin Chary | VncPaletteEntry *entry; |
122 | 5136a052 | Corentin Chary | |
123 | 5136a052 | Corentin Chary | for (i = 0; i < VNC_PALETTE_HASH_SIZE; i++) { |
124 | 5136a052 | Corentin Chary | QLIST_FOREACH(entry, &palette->table[i], next) { |
125 | 5136a052 | Corentin Chary | iter(entry->idx, entry->color, opaque); |
126 | 5136a052 | Corentin Chary | } |
127 | 5136a052 | Corentin Chary | } |
128 | 5136a052 | Corentin Chary | } |