1a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat/* 2a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (C) 2002 RealVNC Ltd. All Rights Reserved. 3a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Copyright (C) 2003 Sun Microsystems, Inc. 4a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 5a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * This is free software; you can redistribute it and/or modify 6a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * it under the terms of the GNU General Public License as published by 7a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * the Free Software Foundation; either version 2 of the License, or 8a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * (at your option) any later version. 9a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 10a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * This software is distributed in the hope that it will be useful, 11a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * but WITHOUT ANY WARRANTY; without even the implied warranty of 12a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * GNU General Public License for more details. 14a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * 15a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * You should have received a copy of the GNU General Public License 16a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * along with this software; if not, write to the Free Software 17a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 18a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat * USA. 19a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat */ 20a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 21a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include "zrlepalettehelper.h" 22a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <assert.h> 23a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#include <string.h> 24a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 25a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat#define ZRLE_HASH(pix) (((pix) ^ ((pix) >> 17)) & 4095) 26a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 27a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid zrlePaletteHelperInit(zrlePaletteHelper *helper) 28a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 29a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(helper->palette, 0, sizeof(helper->palette)); 30a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(helper->index, 255, sizeof(helper->index)); 31a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat memset(helper->key, 0, sizeof(helper->key)); 32a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat helper->size = 0; 33a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 34a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 35a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatvoid zrlePaletteHelperInsert(zrlePaletteHelper *helper, zrle_U32 pix) 36a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 37a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (helper->size < ZRLE_PALETTE_MAX_SIZE) { 38a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i = ZRLE_HASH(pix); 39a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 40a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (helper->index[i] != 255 && helper->key[i] != pix) 41a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat i++; 42a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (helper->index[i] != 255) return; 43a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 44a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat helper->index[i] = helper->size; 45a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat helper->key[i] = pix; 46a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat helper->palette[helper->size] = pix; 47a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat } 48a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat helper->size++; 49a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 50a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 51a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehatint zrlePaletteHelperLookup(zrlePaletteHelper *helper, zrle_U32 pix) 52a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat{ 53a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat int i = ZRLE_HASH(pix); 54a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 55a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat assert(helper->size <= ZRLE_PALETTE_MAX_SIZE); 56a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 57a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat while (helper->index[i] != 255 && helper->key[i] != pix) 58a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat i++; 59a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat if (helper->index[i] != 255) return helper->index[i]; 60a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat 61a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat return -1; 62a430b2b5ca4f0967836f5820e8f03adc17fc0a24San Mehat} 63