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