From 859395022f532d7295ee00cda474de3abc5bdb8d Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sun, 1 Apr 2012 21:49:15 -0700 Subject: [PATCH] Move palette functions into own files. --- libguac/Makefile.am | 6 +- libguac/include/palette.h | 62 ++++++++++++++++++++ libguac/src/palette.c | 117 ++++++++++++++++++++++++++++++++++++++ libguac/src/protocol.c | 72 +---------------------- 4 files changed, 184 insertions(+), 73 deletions(-) create mode 100644 libguac/include/palette.h create mode 100644 libguac/src/palette.c diff --git a/libguac/Makefile.am b/libguac/Makefile.am index a0b2f5bd..20a0ee44 100644 --- a/libguac/Makefile.am +++ b/libguac/Makefile.am @@ -40,13 +40,15 @@ ACLOCAL_AMFLAGS = -I m4 AM_CFLAGS = -Werror -Wall -pedantic -Iinclude libguacincdir = $(includedir)/guacamole -libguacinc_HEADERS = include/client.h include/socket.h include/protocol.h include/client-handlers.h include/error.h +libguacinc_HEADERS = include/client.h include/socket.h include/protocol.h include/client-handlers.h include/error.h include/palette.h lib_LTLIBRARIES = libguac.la -libguac_la_SOURCES = src/client.c src/socket.c src/protocol.c src/client-handlers.c src/error.c +libguac_la_SOURCES = src/client.c src/socket.c src/protocol.c src/client-handlers.c src/error.c src/palette.c libguac_la_LDFLAGS = -version-info 3:0:0 +noinst_HEADERS = include/palette.h + EXTRA_DIST = LICENSE doc/Doxyfile diff --git a/libguac/include/palette.h b/libguac/include/palette.h new file mode 100644 index 00000000..ed210a08 --- /dev/null +++ b/libguac/include/palette.h @@ -0,0 +1,62 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef __GUAC_PALETTE_H +#define __GUAC_PALETTE_H + +#include + +typedef struct guac_palette_entry { + + int index; + int color; + +} guac_palette_entry; + + +typedef struct guac_palette { + + guac_palette_entry entries[0xFFF]; + int colors; + +} guac_palette; + +guac_palette* __guac_create_palette(cairo_surface_t* surface); +void __guac_free_palette(guac_palette* palette); + +#endif + diff --git a/libguac/src/palette.c b/libguac/src/palette.c new file mode 100644 index 00000000..4672b574 --- /dev/null +++ b/libguac/src/palette.c @@ -0,0 +1,117 @@ + +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is libguac. + * + * The Initial Developer of the Original Code is + * Michael Jumper. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include +#include +#include +#include +#include + +#include + +#include + +#include "palette.h" + +guac_palette* __guac_create_palette(cairo_surface_t* surface) { + + int x, y; + + int width = cairo_image_surface_get_width(surface); + int height = cairo_image_surface_get_height(surface); + int stride = cairo_image_surface_get_stride(surface); + unsigned char* data = cairo_image_surface_get_data(surface); + + /* Allocate palette */ + guac_palette* palette = (guac_palette*) malloc(sizeof(guac_palette)); + memset(palette, 0, sizeof(guac_palette)); + + for (y=0; y> 12) ^ (color & 0xFFF); + + guac_palette_entry* entry; + + /* Search for open palette entry */ + for (;;) { + + entry = &(palette->entries[hash]); + + /* If we've found a free space, use it */ + if (entry->index == 0) { + + /* Stop if already at capacity */ + if (palette->colors == 256) { + __guac_free_palette(palette); + return NULL; + } + + /* Add color to map, done */ + entry->index = ++palette->colors; + entry->color = color; + break; + + } + + /* Otherwise, if already stored here, done */ + if (entry->color == color) + break; + + /* Otherwise, collision. Move on to another bucket */ + hash = (hash+1) & 0xFFF; + + } + } + + /* Advance to next data row */ + data += stride; + + } + + return palette; + +} + +void __guac_free_palette(guac_palette* palette) { + free(palette); +} + diff --git a/libguac/src/protocol.c b/libguac/src/protocol.c index 00c34097..7f2d7a4d 100644 --- a/libguac/src/protocol.c +++ b/libguac/src/protocol.c @@ -69,6 +69,7 @@ #include "socket.h" #include "protocol.h" #include "error.h" +#include "palette.h" /* Output formatting functions */ @@ -151,77 +152,6 @@ void __guac_socket_flush_png(png_structp png) { /* Dummy function */ } -typedef struct __guac_palette { - - int index; - int color; - -} __guac_palette; - -void __guac_create_palette(cairo_surface_t* surface) { - - int x, y; - - int width = cairo_image_surface_get_width(surface); - int height = cairo_image_surface_get_height(surface); - int stride = cairo_image_surface_get_stride(surface); - unsigned char* data = cairo_image_surface_get_data(surface); - - /* Simple palette map */ - __guac_palette palette[0xFFF] = {{0}}; - int colors = 0; - - for (y=0; y> 12) ^ (color & 0xFFF); - - __guac_palette* entry; - - /* Search for open palette entry */ - for (;;) { - - entry = &palette[hash]; - - /* If we've found a free space, use it */ - if (entry->index == 0) { - - /* Stop if already at capacity */ - if (colors == 256) - return; - - /* Add color to map, done */ - entry->index = ++colors; - entry->color = color; - break; - - } - - /* Otherwise, if already stored here, done */ - if (entry->color == color) - break; - - /* Otherwise, collision. Move on to another bucket */ - hash = (hash+1) & 0xFFF; - - } - - } - - /* Advance to next data row */ - data += stride; - - } - - fprintf(stderr, "%i colors!\n", colors); - -} - png_byte** __guac_create_png_rgb(cairo_surface_t* surface, int alpha) { png_byte** png_rows;