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
));
59 palette_init(palette
, max
, bpp
);
63 void palette_init(VncPalette
*palette
, size_t max
, int bpp
)
65 memset(palette
, 0, sizeof (*palette
));
70 void palette_destroy(VncPalette
*palette
)
75 int palette_put(VncPalette
*palette
, uint32_t color
)
78 unsigned int idx
= palette
->size
;
79 VncPaletteEntry
*entry
;
81 hash
= palette_hash(color
, palette
->bpp
) % VNC_PALETTE_HASH_SIZE
;
82 entry
= palette_find(palette
, color
, hash
);
84 if (!entry
&& palette
->size
>= palette
->max
) {
88 VncPaletteEntry
*entry
;
90 entry
= &palette
->pool
[palette
->size
];
93 QLIST_INSERT_HEAD(&palette
->table
[hash
], entry
, next
);
99 int palette_idx(const VncPalette
*palette
, uint32_t color
)
101 VncPaletteEntry
*entry
;
104 hash
= palette_hash(color
, palette
->bpp
) % VNC_PALETTE_HASH_SIZE
;
105 entry
= palette_find(palette
, color
, hash
);
106 return (entry
== NULL
? -1 : entry
->idx
);
109 size_t palette_size(const VncPalette
*palette
)
111 return palette
->size
;
114 void palette_iter(const VncPalette
*palette
,
115 void (*iter
)(int idx
, uint32_t color
, void *opaque
),
119 VncPaletteEntry
*entry
;
121 for (i
= 0; i
< VNC_PALETTE_HASH_SIZE
; i
++) {
122 QLIST_FOREACH(entry
, &palette
->table
[i
], next
) {
123 iter(entry
->idx
, entry
->color
, opaque
);
128 uint32_t palette_color(const VncPalette
*palette
, int idx
, bool *found
)
131 VncPaletteEntry
*entry
;
133 for (i
= 0; i
< VNC_PALETTE_HASH_SIZE
; i
++) {
134 QLIST_FOREACH(entry
, &palette
->table
[i
], next
) {
135 if (entry
->idx
== idx
) {
146 static void palette_fill_cb(int idx
, uint32_t color
, void *opaque
)
148 uint32_t *colors
= opaque
;
153 size_t palette_fill(const VncPalette
*palette
,
154 uint32_t colors
[VNC_PALETTE_MAX_SIZE
])
156 palette_iter(palette
, palette_fill_cb
, colors
);
157 return palette_size(palette
);