2 * QEMU VNC display driver: palette hash table
4 * From libvncserver/libvncserver/tight.c
5 * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved.
6 * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
8 * Copyright (C) 2010 Corentin Chary <corentin.chary@gmail.com>
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
17 * The above copyright notice and this permission notice shall be included in
18 * all copies or substantial portions of the Software.
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 #include "vnc-palette.h"
31 static VncPaletteEntry
*palette_find(const VncPalette
*palette
,
32 uint32_t color
, unsigned int hash
)
34 VncPaletteEntry
*entry
;
36 QLIST_FOREACH(entry
, &palette
->table
[hash
], next
) {
37 if (entry
->color
== color
) {
45 static unsigned int palette_hash(uint32_t rgb
, int bpp
)
48 return ((unsigned int)(((rgb
>> 8) + rgb
) & 0xFF));
50 return ((unsigned int)(((rgb
>> 16) + (rgb
>> 8)) & 0xFF));
54 VncPalette
*palette_new(size_t max
, int bpp
)
58 palette
= qemu_mallocz(sizeof(*palette
));
64 void palette_destroy(VncPalette
*palette
)
68 if (palette
== NULL
) {
72 for (i
= 0; i
< VNC_PALETTE_HASH_SIZE
; i
++) {
73 VncPaletteEntry
*entry
= QLIST_FIRST(&palette
->table
[i
]);
75 VncPaletteEntry
*tmp
= QLIST_NEXT(entry
, next
);
76 QLIST_REMOVE(entry
, next
);
85 int palette_put(VncPalette
*palette
, uint32_t color
)
88 unsigned int idx
= palette
->size
;
89 VncPaletteEntry
*entry
;
91 hash
= palette_hash(color
, palette
->bpp
) % VNC_PALETTE_HASH_SIZE
;
92 entry
= palette_find(palette
, color
, hash
);
94 if (!entry
&& palette
->size
>= palette
->max
) {
98 VncPaletteEntry
*entry
;
100 entry
= qemu_mallocz(sizeof(*entry
));
101 entry
->color
= color
;
103 QLIST_INSERT_HEAD(&palette
->table
[hash
], entry
, next
);
106 return palette
->size
;
109 int palette_idx(const VncPalette
*palette
, uint32_t color
)
111 VncPaletteEntry
*entry
;
114 hash
= palette_hash(color
, palette
->bpp
) % VNC_PALETTE_HASH_SIZE
;
115 entry
= palette_find(palette
, color
, hash
);
116 return (entry
== NULL
? -1 : entry
->idx
);
119 size_t palette_size(const VncPalette
*palette
)
121 return palette
->size
;
124 void palette_iter(const VncPalette
*palette
,
125 void (*iter
)(int idx
, uint32_t color
, void *opaque
),
129 VncPaletteEntry
*entry
;
131 for (i
= 0; i
< VNC_PALETTE_HASH_SIZE
; i
++) {
132 QLIST_FOREACH(entry
, &palette
->table
[i
], next
) {
133 iter(entry
->idx
, entry
->color
, opaque
);