|
|
1.1 ! root 1: /* ! 2: * QEMU VNC display driver: palette hash table ! 3: * ! 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. ! 7: * ! 8: * Copyright (C) 2010 Corentin Chary <[email protected]> ! 9: * ! 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: ! 16: * ! 17: * The above copyright notice and this permission notice shall be included in ! 18: * all copies or substantial portions of the Software. ! 19: * ! 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 ! 26: * THE SOFTWARE. ! 27: */ ! 28: ! 29: #include "vnc-palette.h" ! 30: ! 31: static VncPaletteEntry *palette_find(const VncPalette *palette, ! 32: uint32_t color, unsigned int hash) ! 33: { ! 34: VncPaletteEntry *entry; ! 35: ! 36: QLIST_FOREACH(entry, &palette->table[hash], next) { ! 37: if (entry->color == color) { ! 38: return entry; ! 39: } ! 40: } ! 41: ! 42: return NULL; ! 43: } ! 44: ! 45: static unsigned int palette_hash(uint32_t rgb, int bpp) ! 46: { ! 47: if (bpp == 16) { ! 48: return ((unsigned int)(((rgb >> 8) + rgb) & 0xFF)); ! 49: } else { ! 50: return ((unsigned int)(((rgb >> 16) + (rgb >> 8)) & 0xFF)); ! 51: } ! 52: } ! 53: ! 54: VncPalette *palette_new(size_t max, int bpp) ! 55: { ! 56: VncPalette *palette; ! 57: ! 58: palette = qemu_mallocz(sizeof(*palette)); ! 59: palette->max = max; ! 60: palette->bpp = bpp; ! 61: return palette; ! 62: } ! 63: ! 64: void palette_destroy(VncPalette *palette) ! 65: { ! 66: int i; ! 67: ! 68: if (palette == NULL) { ! 69: return ; ! 70: } ! 71: ! 72: for (i = 0; i < VNC_PALETTE_HASH_SIZE; i++) { ! 73: VncPaletteEntry *entry = QLIST_FIRST(&palette->table[i]); ! 74: while (entry) { ! 75: VncPaletteEntry *tmp = QLIST_NEXT(entry, next); ! 76: QLIST_REMOVE(entry, next); ! 77: qemu_free(entry); ! 78: entry = tmp; ! 79: } ! 80: } ! 81: ! 82: qemu_free(palette); ! 83: } ! 84: ! 85: int palette_put(VncPalette *palette, uint32_t color) ! 86: { ! 87: unsigned int hash; ! 88: unsigned int idx = palette->size; ! 89: VncPaletteEntry *entry; ! 90: ! 91: hash = palette_hash(color, palette->bpp) % VNC_PALETTE_HASH_SIZE; ! 92: entry = palette_find(palette, color, hash); ! 93: ! 94: if (!entry && palette->size >= palette->max) { ! 95: return 0; ! 96: } ! 97: if (!entry) { ! 98: VncPaletteEntry *entry; ! 99: ! 100: entry = qemu_mallocz(sizeof(*entry)); ! 101: entry->color = color; ! 102: entry->idx = idx; ! 103: QLIST_INSERT_HEAD(&palette->table[hash], entry, next); ! 104: palette->size++; ! 105: } ! 106: return palette->size; ! 107: } ! 108: ! 109: int palette_idx(const VncPalette *palette, uint32_t color) ! 110: { ! 111: VncPaletteEntry *entry; ! 112: unsigned int hash; ! 113: ! 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); ! 117: } ! 118: ! 119: size_t palette_size(const VncPalette *palette) ! 120: { ! 121: return palette->size; ! 122: } ! 123: ! 124: void palette_iter(const VncPalette *palette, ! 125: void (*iter)(int idx, uint32_t color, void *opaque), ! 126: void *opaque) ! 127: { ! 128: int i; ! 129: VncPaletteEntry *entry; ! 130: ! 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); ! 134: } ! 135: } ! 136: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.