]>
git.proxmox.com Git - qemu.git/blob - ui/vnc-palette.c
c47420b0f193fd598f47a5204254285afd375a49
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
)
66 if (palette
== NULL
) {
71 int palette_put(VncPalette
*palette
, uint32_t color
)
74 unsigned int idx
= palette
->size
;
75 VncPaletteEntry
*entry
;
77 hash
= palette_hash(color
, palette
->bpp
) % VNC_PALETTE_HASH_SIZE
;
78 entry
= palette_find(palette
, color
, hash
);
80 if (!entry
&& palette
->size
>= palette
->max
) {
84 VncPaletteEntry
*entry
;
86 entry
= &palette
->pool
[palette
->size
];
89 QLIST_INSERT_HEAD(&palette
->table
[hash
], entry
, next
);
95 int palette_idx(const VncPalette
*palette
, uint32_t color
)
97 VncPaletteEntry
*entry
;
100 hash
= palette_hash(color
, palette
->bpp
) % VNC_PALETTE_HASH_SIZE
;
101 entry
= palette_find(palette
, color
, hash
);
102 return (entry
== NULL
? -1 : entry
->idx
);
105 size_t palette_size(const VncPalette
*palette
)
107 return palette
->size
;
110 void palette_iter(const VncPalette
*palette
,
111 void (*iter
)(int idx
, uint32_t color
, void *opaque
),
115 VncPaletteEntry
*entry
;
117 for (i
= 0; i
< VNC_PALETTE_HASH_SIZE
; i
++) {
118 QLIST_FOREACH(entry
, &palette
->table
[i
], next
) {
119 iter(entry
->idx
, entry
->color
, opaque
);