/**
* $Id:$
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* The contents of this file may be used under the terms of either the GNU
* General Public License Version 2 or later (the "GPL", see
* http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or
* later (the "BL", see http://www.blender.org/BL/ ) which has to be
* bought from the Blender Foundation to become active, in which case the
* above mentioned GPL option does not apply.
*
* The Original Code is Copyright (C) 2002 by NaN Holding BV.
* All rights reserved.
*
* The Original Code is: all of this file.
*
* Contributor(s): none yet.
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
#include "imbuf.h"
#include "convert_arrays.h"
#define OBJECTBLOK "hamx"
uchar hamx_array_char[] = {
0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF,
0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF, 0x00,0x00,0xFF,0xFF,
0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF,
0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF, 0x00,0xFF,0x00,0xFF,
0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00,
0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x10,0x00,0x00, 0x00,0x20,0x00,0x00, 0x00,0x30,0x00,0x00, 0x00,0x40,0x00,0x00, 0x00,0x50,0x00,0x00, 0x00,0x60,0x00,0x00, 0x00,0x70,0x00,0x00,
0x00,0x80,0x00,0x00, 0x00,0x90,0x00,0x00, 0x00,0xA0,0x00,0x00, 0x00,0xB0,0x00,0x00, 0x00,0xC0,0x00,0x00, 0x00,0xD0,0x00,0x00, 0x00,0xE0,0x00,0x00, 0x00,0xF0,0x00,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x00, 0x00,0x00,0x20,0x00, 0x00,0x00,0x30,0x00, 0x00,0x00,0x40,0x00, 0x00,0x00,0x50,0x00, 0x00,0x00,0x60,0x00, 0x00,0x00,0x70,0x00,
0x00,0x00,0x80,0x00, 0x00,0x00,0x90,0x00, 0x00,0x00,0xA0,0x00, 0x00,0x00,0xB0,0x00, 0x00,0x00,0xC0,0x00, 0x00,0x00,0xD0,0x00, 0x00,0x00,0xE0,0x00, 0x00,0x00,0xF0,0x00,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x10, 0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x40, 0x00,0x00,0x00,0x50, 0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x70,
0x00,0x00,0x00,0x80, 0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0xA0, 0x00,0x00,0x00,0xB0, 0x00,0x00,0x00,0xC0, 0x00,0x00,0x00,0xD0, 0x00,0x00,0x00,0xE0, 0x00,0x00,0x00,0xF0,
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0xC0, 0x00,0x00,0x00,0xF0,
0x00,0x00,0x20,0x00, 0x00,0x00,0x20,0x30, 0x00,0x00,0x20,0x60, 0x00,0x00,0x20,0x90, 0x00,0x00,0x20,0xC0, 0x00,0x00,0x20,0xF0,
0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x30, 0x00,0x00,0x40,0x60, 0x00,0x00,0x40,0x90, 0x00,0x00,0x40,0xC0, 0x00,0x00,0x40,0xF0,
0x00,0x00,0x60,0x00, 0x00,0x00,0x60,0x30, 0x00,0x00,0x60,0x60, 0x00,0x00,0x60,0x90, 0x00,0x00,0x60,0xC0, 0x00,0x00,0x60,0xF0,
0x00,0x00,0x90,0x00, 0x00,0x00,0x90,0x30, 0x00,0x00,0x90,0x60, 0x00,0x00,0x90,0x90, 0x00,0x00,0x90,0xC0, 0x00,0x00,0x90,0xF0,
0x00,0x00,0xB0,0x00, 0x00,0x00,0xB0,0x30, 0x00,0x00,0xB0,0x60, 0x00,0x00,0xB0,0x90, 0x00,0x00,0xB0,0xC0, 0x00,0x00,0xB0,0xF0,
0x00,0x00,0xD0,0x00, 0x00,0x00,0xD0,0x30, 0x00,0x00,0xD0,0x60, 0x00,0x00,0xD0,0x90, 0x00,0x00,0xD0,0xC0, 0x00,0x00,0xD0,0xF0,
0x00,0x00,0xF0,0x00, 0x00,0x00,0xF0,0x30, 0x00,0x00,0xF0,0x60, 0x00,0x00,0xF0,0x90, 0x00,0x00,0xF0,0xC0, 0x00,0x00,0xF0,0xF0,
0x00,0x50,0x00,0x00, 0x00,0x50,0x00,0x30, 0x00,0x50,0x00,0x60, 0x00,0x50,0x00,0x90, 0x00,0x50,0x00,0xC0, 0x00,0x50,0x00,0xF0,
0x00,0x50,0x20,0x00, 0x00,0x50,0x20,0x30, 0x00,0x50,0x20,0x60, 0x00,0x50,0x20,0x90, 0x00,0x50,0x20,0xC0, 0x00,0x50,0x20,0xF0,
0x00,0x50,0x40,0x00, 0x00,0x50,0x40,0x30, 0x00,0x50,0x40,0x60, 0x00,0x50,0x40,0x90, 0x00,0x50,0x40,0xC0, 0x00,0x50,0x40,0xF0,
0x00,0x50,0x60,0x00, 0x00,0x50,0x60,0x30, 0x00,0x50,0x60,0x60, 0x00,0x50,0x60,0x90, 0x00,0x50,0x60,0xC0, 0x00,0x50,0x60,0xF0,
0x00,0x50,0x90,0x00, 0x00,0x50,0x90,0x30, 0x00,0x50,0x90,0x60, 0x00,0x50,0x90,0x90, 0x00,0x50,0x90,0xC0, 0x00,0x50,0x90,0xF0,
0x00,0x50,0xB0,0x00, 0x00,0x50,0xB0,0x30, 0x00,0x50,0xB0,0x60, 0x00,0x50,0xB0,0x90, 0x00,0x50,0xB0,0xC0, 0x00,0x50,0xB0,0xF0,
0x00,0x50,0xD0,0x00, 0x00,0x50,0xD0,0x30, 0x00,0x50,0xD0,0x60, 0x00,0x50,0xD0,0x90, 0x00,0x50,0xD0,0xC0, 0x00,0x50,0xD0,0xF0,
0x00,0x50,0xF0,0x00, 0x00,0x50,0xF0,0x30, 0x00,0x50,0xF0,0x60, 0x00,0x50,0xF0,0x90, 0x00,0x50,0xF0,0xC0, 0x00,0x50,0xF0,0xF0,
0x00,0xA0,0x00,0x00, 0x00,0xA0,0x00,0x30, 0x00,0xA0,0x00,0x60, 0x00,0xA0,0x00,0x90, 0x00,0xA0,0x00,0xC0, 0x00,0xA0,0x00,0xF0,
0x00,0xA0,0x20,0x00, 0x00,0xA0,0x20,0x30, 0x00,0xA0,0x20,0x60, 0x00,0xA0,0x20,0x90, 0x00,0xA0,0x20,0xC0, 0x00,0xA0,0x20,0xF0,
0x00,0xA0,0x40,0x00, 0x00,0xA0,0x40,0x30, 0x00,0xA0,0x40,0x60, 0x00,0xA0,0x40,0x90, 0x00,0xA0,0x40,0xC0, 0x00,0xA0,0x40,0xF0,
0x00,0xA0,0x60,0x00, 0x00,0xA0,0x60,0x30, 0x00,0xA0,0x60,0x60, 0x00,0xA0,0x60,0x90, 0x00,0xA0,0x60,0xC0, 0x00,0xA0,0x60,0xF0,
0x00,0xA0,0x90,0x00, 0x00,0xA0,0x90,0x30, 0x00,0xA0,0x90,0x60, 0x00,0xA0,0x90,0x90, 0x00,0xA0,0x90,0xC0, 0x00,0xA0,0x90,0xF0,
0x00,0xA0,0xB0,0x00, 0x00,0xA0,0xB0,0x30, 0x00,0xA0,0xB0,0x60, 0x00,0xA0,0xB0,0x90, 0x00,0xA0,0xB0,0xC0, 0x00,0xA0,0xB0,0xF0,
0x00,0xA0,0xD0,0x00, 0x00,0xA0,0xD0,0x30, 0x00,0xA0,0xD0,0x60, 0x00,0xA0,0xD0,0x90, 0x00,0xA0,0xD0,0xC0, 0x00,0xA0,0xD0,0xF0,
0x00,0xA0,0xF0,0x00, 0x00,0xA0,0xF0,0x30, 0x00,0xA0,0xF0,0x60, 0x00,0xA0,0xF0,0x90, 0x00,0xA0,0xF0,0xC0, 0x00,0xA0,0xF0,0xF0,
0x00,0xF0,0x00,0x00, 0x00,0xF0,0x00,0x30, 0x00,0xF0,0x00,0x60, 0x00,0xF0,0x00,0x90, 0x00,0xF0,0x00,0xC0, 0x00,0xF0,0x00,0xF0,
0x00,0xF0,0x20,0x00, 0x00,0xF0,0x20,0x30, 0x00,0xF0,0x20,0x60, 0x00,0xF0,0x20,0x90, 0x00,0xF0,0x20,0xC0, 0x00,0xF0,0x20,0xF0,
0x00,0xF0,0x40,0x00, 0x00,0xF0,0x40,0x30, 0x00,0xF0,0x40,0x60, 0x00,0xF0,0x40,0x90, 0x00,0xF0,0x40,0xC0, 0x00,0xF0,0x40,0xF0,
0x00,0xF0,0x60,0x00, 0x00,0xF0,0x60,0x30, 0x00,0xF0,0x60,0x60, 0x00,0xF0,0x60,0x90, 0x00,0xF0,0x60,0xC0, 0x00,0xF0,0x60,0xF0,
0x00,0xF0,0x90,0x00, 0x00,0xF0,0x90,0x30, 0x00,0xF0,0x90,0x60, 0x00,0xF0,0x90,0x90, 0x00,0xF0,0x90,0xC0, 0x00,0xF0,0x90,0xF0,
0x00,0xF0,0xB0,0x00, 0x00,0xF0,0xB0,0x30, 0x00,0xF0,0xB0,0x60, 0x00,0xF0,0xB0,0x90, 0x00,0xF0,0xB0,0xC0, 0x00,0xF0,0xB0,0xF0,
0x00,0xF0,0xD0,0x00, 0x00,0xF0,0xD0,0x30, 0x00,0xF0,0xD0,0x60, 0x00,0xF0,0xD0,0x90, 0x00,0xF0,0xD0,0xC0, 0x00,0xF0,0xD0,0xF0,
0x00,0xF0,0xF0,0x00, 0x00,0xF0,0xF0,0x30, 0x00,0xF0,0xF0,0x60, 0x00,0xF0,0xF0,0x90, 0x00,0xF0,0xF0,0xC0, 0x00,0xF0,0xF0,0xF0,
0x00,0x10,0x10,0x10, 0x00,0x20,0x20,0x20, 0x00,0x30,0x30,0x30, 0x00,0x40,0x40,0x40,
0x00,0x50,0x50,0x50, 0x00,0x60,0x60,0x60, 0x00,0x70,0x70,0x70, 0x00,0x80,0x80,0x80,
0x00,0x90,0x90,0x90, 0x00,0xA0,0xA0,0xA0, 0x00,0xB0,0xB0,0xB0, 0x00,0xC0,0xC0,0xC0,
0x00,0xD0,0xD0,0xD0, 0x00,0xE0,0xE0,0xE0
};
int * hamx_array = (int *) (hamx_array_char);
uchar cmap_hamx_char[] = {
0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30, 0x00,0x00,0x00,0x60, 0x00,0x00,0x00,0x90, 0x00,0x00,0x00,0xC0, 0x00,0x00,0x00,0xF0,
0x00,0x00,0x20,0x00, 0x00,0x00,0x20,0x30, 0x00,0x00,0x20,0x60, 0x00,0x00,0x20,0x90, 0x00,0x00,0x20,0xC0, 0x00,0x00,0x20,0xF0,
0x00,0x00,0x40,0x00, 0x00,0x00,0x40,0x30, 0x00,0x00,0x40,0x60, 0x00,0x00,0x40,0x90, 0x00,0x00,0x40,0xC0, 0x00,0x00,0x40,0xF0,
0x00,0x00,0x60,0x00, 0x00,0x00,0x60,0x30, 0x00,0x00,0x60,0x60, 0x00,0x00,0x60,0x90, 0x00,0x00,0x60,0xC0, 0x00,0x00,0x60,0xF0,
0x00,0x00,0x90,0x00, 0x00,0x00,0x90,0x30, 0x00,0x00,0x90,0x60, 0x00,0x00,0x90,0x90, 0x00,0x00,0x90,0xC0, 0x00,0x00,0x90,0xF0,
0x00,0x00,0xB0,0x00, 0x00,0x00,0xB0,0x30, 0x00,0x00,0xB0,0x60, 0x00,0x00,0xB0,0x90, 0x00,0x00,0xB0,0xC0, 0x00,0x00,0xB0,0xF0,
0x00,0x00,0xD0,0x00, 0x00,0x00,0xD0,0x30, 0x00,0x00,0xD0,0x60, 0x00,0x00,0xD0,0x90, 0x00,0x00,0xD0,0xC0, 0x00,0x00,0xD0,0xF0,
0x00,0x00,0xF0,0x00, 0x00,0x00,0xF0,0x30, 0x00,0x00,0xF0,0x60, 0x00,0x00,0xF0,0x90, 0x00,0x00,0xF0,0xC0, 0x00,0x00,0xF0,0xF0,
0x00,0x50,0x00,0x00, 0x00,0x50,0x00,0x30, 0x00,0x50,0x00,0x60, 0x00,0x50,0x00,0x90, 0x00,0x50,0x00,0xC0, 0x00,0x50,0x00,0xF0,
0x00,0x50,0x20,0x00, 0x00,0x50,0x20,0x30, 0x00,0x50,0x20,0x60, 0x00,0x50,0x20,0x90, 0x00,0x50,0x20,0xC0, 0x00,0x50,0x20,0xF0,
0x00,0x50,0x40,0x00, 0x00,0x50,0x40,0x30, 0x00,0x50,0x40,0x60, 0x00,0x50,0x40,0x90, 0x00,0x50,0x40,0xC0, 0x00,0x50,0x40,0xF0,
0x00,0x50,0x60,0x00, 0x00,0x50,0x60,0x30, 0x00,0x50,0x60,0x60, 0x00,0x50,0x60,0x90, 0x00,0x50,0x60,0xC0, 0x00,0x50,0x60,0xF0,
0x00,0x50,0x90,0x00, 0x00,0x50,0x90,0x30, 0x00,0x50,0x90,0x60, 0x00,0x50,0x90,0x90, 0x00,0x50,0x90,0xC0, 0x00,0x50,0x90,0xF0,
0x00,0x50,0xB0,0x00, 0x00,0x50,0xB0,0x30, 0x00,0x50,0xB0,0x60, 0x00,0x50,0xB0,0x90, 0x00,0x50,0xB0,0xC0, 0x00,0x50,0xB0,0xF0,
0x00,0x50,0xD0,0x00, 0x00,0x50,0xD0,0x30, 0x00,0x50,0xD0,0x60, 0x00,0x50,0xD0,0x90, 0x00,0x50,0xD0,0xC0, 0x00,0x50,0xD0,0xF0,
0x00,0x50,0xF0,0x00, 0x00,0x50,0xF0,0x30, 0x00,0x50,0xF0,0x60, 0x00,0x50,0xF0,0x90, 0x00,0x50,0xF0,0xC0, 0x00,0x50,0xF0,0xF0,
0x00,0xA0,0x00,0x00, 0x00,0xA0,0x00,0x30, 0x00,0xA0,0x00,0x60, 0x00,0xA0,0x00,0x90, 0x00,0xA0,0x00,0xC0, 0x00,0xA0,0x00,0xF0,
0x00,0xA0,0x20,0x00, 0x00,0xA0,0x20,0x30, 0x00,0xA0,0x20,0x60, 0x00,0xA0,0x20,0x90, 0x00,0xA0,0x20,0xC0, 0x00,0xA0,0x20,0xF0,
0x00,0xA0,0x40,0x00, 0x00,0xA0,0x40,0x30, 0x00,0xA0,0x40,0x60, 0x00,0xA0,0x40,0x90, 0x00,0xA0,0x40,0xC0, 0x00,0xA0,0x40,0xF0,
0x00,0xA0,0x60,0x00, 0x00,0xA0,0x60,0x30, 0x00,0xA0,0x60,0x60, 0x00,0xA0,0x60,0x90, 0x00,0xA0,0x60,0xC0, 0x00,0xA0,0x60,0xF0,
0x00,0xA0,0x90,0x00, 0x00,0xA0,0x90,0x30, 0x00,0xA0,0x90,0x60, 0x00,0xA0,0x90,0x90, 0x00,0xA0,0x90,0xC0, 0x00,0xA0,0x90,0xF0,
0x00,0xA0,0xB0,0x00, 0x00,0xA0,0xB0,0x30, 0x00,0xA0,0xB0,0x60, 0x00,0xA0,0xB0,0x90, 0x00,0xA0,0xB0,0xC0, 0x00,0xA0,0xB0,0xF0,
0x00,0xA0,0xD0,0x00, 0x00,0xA0,0xD0,0x30, 0x00,0xA0,0xD0,0x60, 0x00,0xA0,0xD0,0x90, 0x00,0xA0,0xD0,0xC0, 0x00,0xA0,0xD0,0xF0,
0x00,0xA0,0xF0,0x00, 0x00,0xA0,0xF0,0x30, 0x00,0xA0,0xF0,0x60, 0x00,0xA0,0xF0,0x90, 0x00,0xA0,0xF0,0xC0, 0x00,0xA0,0xF0,0xF0,
0x00,0xF0,0x00,0x00, 0x00,0xF0,0x00,0x30, 0x00,0xF0,0x00,0x60, 0x00,0xF0,0x00,0x90, 0x00,0xF0,0x00,0xC0, 0x00,0xF0,0x00,0xF0,
0x00,0xF0,0x20,0x00, 0x00,0xF0,0x20,0x30, 0x00,0xF0,0x20,0x60, 0x00,0xF0,0x20,0x90, 0x00,0xF0,0x20,0xC0, 0x00,0xF0,0x20,0xF0,
0x00,0xF0,0x40,0x00, 0x00,0xF0,0x40,0x30, 0x00,0xF0,0x40,0x60, 0x00,0xF0,0x40,0x90, 0x00,0xF0,0x40,0xC0, 0x00,0xF0,0x40,0xF0,
0x00,0xF0,0x60,0x00, 0x00,0xF0,0x60,0x30, 0x00,0xF0,0x60,0x60, 0x00,0xF0,0x60,0x90, 0x00,0xF0,0x60,0xC0, 0x00,0xF0,0x60,0xF0,
0x00,0xF0,0x90,0x00, 0x00,0xF0,0x90,0x30, 0x00,0xF0,0x90,0x60, 0x00,0xF0,0x90,0x90, 0x00,0xF0,0x90,0xC0, 0x00,0xF0,0x90,0xF0,
0x00,0xF0,0xB0,0x00, 0x00,0xF0,0xB0,0x30, 0x00,0xF0,0xB0,0x60, 0x00,0xF0,0xB0,0x90, 0x00,0xF0,0xB0,0xC0, 0x00,0xF0,0xB0,0xF0,
0x00,0xF0,0xD0,0x00, 0x00,0xF0,0xD0,0x30, 0x00,0xF0,0xD0,0x60, 0x00,0xF0,0xD0,0x90, 0x00,0xF0,0xD0,0xC0, 0x00,0xF0,0xD0,0xF0,
0x00,0xF0,0xF0,0x00, 0x00,0xF0,0xF0,0x30, 0x00,0xF0,0xF0,0x60, 0x00,0xF0,0xF0,0x90, 0x00,0xF0,0xF0,0xC0, 0x00,0xF0,0xF0,0xF0,
0x00,0x10,0x10,0x10, 0x00,0x20,0x20,0x20, 0x00,0x30,0x30,0x30, 0x00,0x40,0x40,0x40, 0x00,0x50,0x50,0x50, 0x00,0x60,0x60,0x60,
0x00,0x70,0x70,0x70, 0x00,0x80,0x80,0x80, 0x00,0x90,0x90,0x90, 0x00,0xA0,0xA0,0xA0, 0x00,0xB0,0xB0,0xB0, 0x00,0xC0,0xC0,0xC0,
0x00,0xD0,0xD0,0xD0, 0x00,0xE0,0xE0,0xE0
};
uint * cmap_hamx = (uint *) cmap_hamx_char;
int scalecmapY = FALSE;
float adat_gamma = 1.0;
float adat_distort = 1.0;
/*
*
* Nieuwe versie:
*
* 32 helderheden Y 15 direct te bereiken (zwart & wit zijn specials)
* 16 kleuren H ue
* 7 intensiteiten S aturation
*
* Totaal 3584 'verschillende' kleuren. Eerste 512 kleuren vrij.
*
*
*/
#define NEW_TAN_COLOR(offset)\
\
nh = (rect[1 + offset] / 16.0) + 0.5;\
ny = (31.0 * rect[2 + offset] / 255.0) + 0.5;\
ns = ((rect[3 + offset] - 80) / 16.0) + 0.5;\
\
/* h is cyclish */\
nh &= 0xf;\
/* s moet nog even geclipped worden */\
if (ns < 0) ns = 0;\
else if (ns > 6) ns = 6;\
#define EVALUATE_TAN_old(h, y, s, newcol)\
\
/* hys -> kunnen we zetten met behulp van newcol */\
\
if (minerror) {\
int q;\
error = 0;\
/* Hue is cyclisch */\
\
/* volgende regels zorgen ervoor dat bij om en om dither laagste waarde stabiel is\
* om die reden moeten cs/ns en ch/nh even zwaar blijven wegen voor errorbepaling\
*/\
q = h - ch;\
if (q > 0) error++;\
else if (q == -15) error++;\
\
q = ABS(h - ch);\
if (q > 8) q = 16 - q;\
error += (cs + 1) * q;\
\
q = ABS(h - nh);\
if (q > 8) q = 16 - q;\
error += (ns + 1) * q;\
\
error >>= 1;\
error += ABS(y - cy) + (ABS(y - ny) >> 1);\
error += 2 * (ABS(s - cs) + ABS(s - ns));\
/* volgende regel zorgt ervoor dat bij om en om dither laagste waarde stabiel is */\
if (s - cs > 0) error++;\
\
if (error < minerror) {\
minerror = error;\
col = newcol;\
fh = h;\
fy = y;\
fs = s;\
}\
}\
#define EVALUATE_TAN(h, y, s, newcol)\
\
/* hys -> kunnen we zetten met behulp van newcol */\
\
if (minerror) {\
int q;\
error = 0;\
/* Hue is cyclisch */\
\
/* volgende regels zorgen ervoor dat bij om en om dither laagste waarde stabiel is\
* om die reden moeten cs/ns en ch/nh even zwaar blijven wegen voor errorbepaling\
*/\
q = h - ch;\
if (q > 0) error++;\
else if (q == -15) error++;\
if (cs) {\
q = ABS(h - ch);\
if (q > 8) q = 16 - q;\
error += q;\
}\
if (ns) {\
q = ABS(h - nh);\
if (q > 8) q = 16 - q;\
error += q;\
}\
error += ABS(y - cy) + (ABS(y - ny) >> 1);\
error += 2 * (ABS(s - cs) + ABS(s - ns));\
/* volgende regel zorgt ervoor dat bij om en om dither laagste waarde stabiel is */\
if (s - cs > 0) error++;\
\
if (error < minerror) {\
minerror = error;\
col = newcol;\
fh = h;\
fy = y;\
fs = s;\
}\
}\
#define YH_tan_start 0 /* + 15 * 8 */
#define YS_tan_start 120 /* + 15 * 4 */
#define Y_tan_start 180 /* + 32 */
#define H_tan_start 212 /* + 16 */
#define S_tan_start 228 /* + 7 */
#define HS_tan_start 235 /* + 16 ?? */
#define FREE_tan_start 251 /* + 4 ?? */
void converttotanx(ibuf)
struct ImBuf *ibuf;
{
/*
* l? staat voor last (echt gezette pixel)
* c? staat voor current (wil ik zetten)
* n? staat voor next (volgende pixel die ik moet zetten)
* f? staat voor final (pixel die ik ga zetten)
*/
int cy, ch, cs, ly, lh, ls, dy, dh, ds, nh, ny, ns, fh, fy, fs, ty, t, col, type, step, first;
int i, error, minerror;
uchar *rect;
first = TRUE;
for (step = 0 ; step < 2 ; step ++){
rect = (uchar *) ibuf->rect;
rect += 4 * step;
i = ((ibuf->x * ibuf->y) + 2 - step - 1) / 2;
ly = 255;
lh = ls = 0;
NEW_TAN_COLOR(0)
for ( ; i > 0; i--){
ch = nh;
cy = ny;
cs = ns;
if (i > 1) {
NEW_TAN_COLOR(8)
}
if ((ns - cs) > 1 && (ns - ls) > 1) ch = nh; /* alvast vooruit werken */
dh = ch - lh;
dy = cy - ly;
ds = cs - ls;
if (dh | dy | ds) {
/* mogelijke optimaliseringen:
* zwart & wit afvangen
*/
/*
* verdere verbeteringen:
* kleuren anders verdelen zodat de kleuren exact op de rgb componenten komen
* te vallen. magenta->rood en cyaan->groen heeft dan 1 tussenkleur, de andere
* overgangen dan telkens 2.
*/
/* maar een variable verandert */
if (dy == 0 && ds == 0) {
col = H_tan_start + ch;
lh = ch;
} else if (dh == 0 && ds == 0) {
col = Y_tan_start + cy;
ly = cy;
} else if (dy == 0 && dh == 0) {
col = S_tan_start + cs;
ls = cs;
} else {
/* we lopen alle mogelijkheden af */
minerror = 0x7fffffff;
if (dy) {
ty = (15.0 * rect[2] / 255.0) + 0.5;\
ty += ty;
if (ty == 0) ty = 2;
if (dh) EVALUATE_TAN((ch & ~1), ty, ls, YH_tan_start + (8 * ((ty - 2) >> 1)) + (ch >> 1));
if (ds) {
t = ((rect[3] - 80) / 32.0) + 0.5;\
if (t < 0) t = 0;
else if (t > 3) t = 3;
EVALUATE_TAN(lh, ty, t + t, YS_tan_start + (4 * ((ty - 2) >> 1)) + t);
}
}
if (dy) EVALUATE_TAN(lh, cy, ls, Y_tan_start + cy);
if (dh) EVALUATE_TAN(ch, ly, ls, H_tan_start + ch);
if (ds) EVALUATE_TAN(lh, ly, cs, S_tan_start + cs);
/* bij niet zo felle kleuren is de HS niet zo belangrijk */
if (fs < 4) minerror = (minerror >> 1) + (minerror >> 2);
if (cs < 4) {
EVALUATE_TAN((ch & ~1), ly, 2, HS_tan_start + (ch >> 1));
} else {
EVALUATE_TAN((ch & ~1), ly, 4, HS_tan_start + 8 + (ch >> 1));
}
lh = fh;
ly = fy;
ls = fs;
}
}
/*
if (rect[0] != 255) {
printf("%2d %2d %2d\n", lh, ly, ls);
printf("%2d %2d %2d %3d\n\n", ch, cy, cs, col);
}
*/
rect[1] = (lh * 16.0) + 0.5;
rect[2] = ((ly * 255.0) / 31.0) + 0.5;
rect[3] = (ls * 16.0) + 0.5 + 80.0;
rect[0] = col;
if (step == 0) {
/* error diffusion */
if (first == TRUE) first = FALSE;
else if (i != 1) {
dh = (rect[1] - ((255 * lh) / 16)) / 2;
dy = (rect[2] - ((255 * ly) / 31)) / 2;
ds = (rect[3] - 80 - ((255 * ls) / 16)) / 2;
rect[-3] += dh;
rect[5] += dh;
t = rect[-2] + dy;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[-2] = t;
t = rect[6] + dy;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[6] = t;
t = rect[-1] + ds;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[-1] = t;
t = rect[7] + ds;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[7] = t;
}
}
rect += 8;
}
}
}
short dec_tanx(ibuf)
struct ImBuf * ibuf;
{
int todo,i;
int j,step,col;
uint *rect;
int y, s, h, ny, ns, nh;
for (step = 0 ; step < 2 ; step ++){
rect = ibuf->rect;
rect += step;
todo = (ibuf->x * ibuf->y + 2 - step - 1) / 2;
y = 0;
s = h = 0;
for (;todo > 0; todo --){
col = rect[0] & 0xff;
*rect = 0;
if (col >= FREE_tan_start) {
col -= FREE_tan_start;
} else if (col >= S_tan_start) {
col -= S_tan_start;
s = col;
} else if (col >= H_tan_start) {
col -= H_tan_start;
h = col;
} else if (col >= Y_tan_start) {
col -= Y_tan_start;
y = col;
} else if (col >= YS_tan_start) {
col -= YS_tan_start;
y = col >> 2;
y = 2 + 2 * y;
s = (col & 0x3) << 1;
} else if (col >= YH_tan_start) {
col -= YH_tan_start;
y = col >> 3;
y = 2 + 2 * y;
h = (col & 0x7) << 1;
}
nh = (h * 16.0) + 0.5;
ny = ((y * 255.0) / 31.0) + 0.5;
ns = (s * 16.0) + 0.5 + 80.0;
*rect = (nh << 16) + (ny << 8) + ns;
rect += 2;
}
}
return(1);
}
void filteruv(ibuf)
struct ImBuf *ibuf;
{
uchar *point;
short x,y,skip;
point = (uchar *)ibuf->rect;
x = ibuf->x;
y = ibuf->y;
skip = x << 2;
for (;y > 0; y--){
filtrow(point + 1, x);
filtrow(point + 3, x);
point += skip;
}
/* point = (uchar *)ibuf->rect;
x = ibuf->x;
y = ibuf->y;
for (;x>0;x--){
filtcolum(point + 1, y, skip);
filtcolum(point + 3, y, skip);
point += 4;
}
*/}
void tan_add_dit4(struct ImBuf * ibuf, short ofs)
{
short x, y;
uchar * rect;
short * add;
static short dit_[] = {
0, 14, 1, 15, 10, 4, 11, 5, 2, 12, 3, 13, 8, 6, 9, 7 };
static short dit__[] = {
-7, 7, -6, 8, 3, -3, 4, -2, -5, 5, -4, 6, 1, -1, 2, 0 };
static short dit[] = {
-8, 6, -7, 7, 2, -4, 3, -3, -6, 4, -5, 5, 0, -2, 1, -1 };
rect= (uchar *)ibuf->rect;
rect +=ofs;
for(y=ibuf->y;y>0;y--){
add = &dit[4 * (y & 3)];
for (x = ibuf->x; x > 0; x--){
*rect += add[x & 3];
rect += 4;
}
}
}
void tan_add_dit2(struct ImBuf * ibuf, short ofs)
{
short x, y, pix, add1, add2, dit_[] = {0, 4, 6, 2}, dit[] = {-3, 1, 3, -1};
uchar *rect;
rect = (uchar *) ibuf->rect;
rect += ofs;
for (y = ibuf->y; y > 0; y--){
if (y & 1){
add1 = dit[0];
add2 = dit[1];
} else {
add1 = dit[2];
add2 = dit[3];
}
for (x = ibuf->x; x > 0; x--){
pix = *rect;
if (x & 1) pix += add1;
else pix += add2;
if (pix & 0x100) {
if (pix < 0) pix = 0;
else pix = 255;
}
*rect = pix;
rect += 4;
}
}
}
/*
* YUVX
*
* 17 stappen in y, 15 stappen in u & v
*
* y = 0 -> u = 0
* y = 16 -> v = 0
*
* y kan telkens direct gezet worden. Daarnaast kan grofweg de u & v gezet worden. Als y
* al goet staat, kunnen u & v nauwkeurig gezet worden.
*
* Alle 17 grijstinten kunnen direct gezet worden.
*
* coderings tabel:
*
* 000 - 104 15y * 7u = 105
* 105 - 209 15y * 7v = 105
* 210 - 217 8 tussenliggende u's = 8
* 218 - 225 8 tussenliggende v's = 8
* 226 - 242 17 grijswaardes
* 243 - 255 13 keer alleen y veranderen
*
*/
#define YB_yrb_start 0
#define YR_yrb_start 105
#define B_yrb_start 210
#define R_yrb_start 218
#define GREY_yrb_start 226
#define Y_yrb_start 243
void converttoyuvx(ImBuf * ibuf)
{
short y, b, r, ly, lb, lr, dy, db, dr, t, col, type, step, first;
int i;
uchar *rect;
first = TRUE;
for (step = 0 ; step < 2 ; step ++){
rect = (uchar *) ibuf->rect;
rect += 4 * step;
i = ((ibuf->x * ibuf->y) + 2 - step - 1) / 2;
type = col = 0;
ly = 255;
lb = lr = 7;
col = 0;
for ( ; i > 0; i--){
b = (14.0 * rect[1] / 255.0) + 0.5;
y = (16.0 * rect[2] / 255.0) + 0.5;
r = (14.0 * rect[3] / 255.0) + 0.5;
db = b - lb;
dy = y - ly;
dr = r - lr;
if (db | dy | dr) {
ly = y; /* always */
if (((b == 7) && (r == 7)) || (y == 0) || (y == 16)) { /* GREY */
col = GREY_yrb_start + y;
lb = lr = 7;
} else {
/* wie gaat er voorrang krijgen, b-y of r-y ? */
type = 0;
if (db | dr) {
db = ABS(db);
dr = ABS(dr);
if (db > dr) type = 'b';
else type = 'r';
}
if (type == 0) {
/* niet alle y-waardes kunnen gezet worden zonder
* ook r of b te zetten (te weinig codes).
* We gaan kijken of dat misschien zonder probleem kan.
*/
if (r & 1) type = 'r';
else if (b & 1) type = 'b';
/* Helaas. Heel donker & heel licht hebben pech */
else if (y == 1 || y == 15) type = 'b';
}
if (type == 0) { /* alleen y moet gezet worden */
col = Y_yrb_start + y - 2;
} else if (type == 'b') {
if (dy || (b & 1)) { /* als y gezet moet worden, of b = oneven */
/* welke waarde ligt het dichtst in de buurt ? */
t = (6 * rect[1] / 255.0) + 0.5; /* t wordt een waarde tussen 0 & 6 */
lb = (2 * t) + 1;
col = YB_yrb_start + (7 * (y - 1)) + t; /* y loopt van 1 - 15 */
} else {
lb = b;
col = B_yrb_start + (b / 2);
}
} else {
if (dy || (r & 1)) {
t = (6 * rect[3] / 255.0) + 0.5;
lr = (2 * t) + 1;
col = YR_yrb_start + (7 * (y - 1)) + t;
} else {
lr = r;
col = R_yrb_start + (r / 2);
}
}
}
}
if (step == 0) {
/* error diffusion */
if (first == TRUE) first = FALSE;
else if (i != 1) {
db = (rect[1] - ((255 * lb) / 14)) / 2;
dr = (rect[3] - ((255 * lr) / 14)) / 2;
t = rect[-3] + db;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[-3] = t;
t = rect[5] + db;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[5] = t;
t = rect[-1] + dr;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[-1] = t;
t = rect[7] + dr;
if (t & 0x100) {
if (t < 0) t = 0;
else t = 255;
}
rect[7] = t;
}
}
rect[3] = col;
rect += 8;
}
}
}
void atan_space(ImBuf * ibuf)
{
int x, y;
double u, v, t, l;
uchar * rect;
rect = (uchar *) ibuf->rect;
for (y = ibuf->y; y > 0 ; y--) {
for (x = ibuf->x; x > 0 ; x--) {
u = rect[1] - 128;
v = rect[3] - 128;
t = 128.0 * ((atan2(u, v) / M_PI) + 1.0);
l = 256.0 * sqrt(((u * u) + (v * v)) / 32768.0);
/* l loopt van 0 -> 193 en moet uiteindelijk een bereik
* van (7 - 1) * 16 = 96 krijgen. (komt dat even mooi uit)
*/
l = 193.0 * pow(l / 193.0 , 1.0 / 1.3);
l = (l / 2.0) + 80.0;
if (t > 255.0) t = 255.0;
if (l > 255.0) l = 255.0;
rect[1] = t;
rect[3] = l;
rect += 4;
}
}
}
void tan_space(ImBuf * ibuf)
{
int x, y;
double u, v, t, l;
uchar * rect;
rect = (uchar *) ibuf->rect;
for (y = ibuf->y; y > 0 ; y--) {
for (x = ibuf->x; x > 0 ; x--) {
t = M_PI * ((rect[1] / 128.0) - 1.0);
l = 2.0 * (rect[3] - 80.0);
/* l loopt nu tussen 0 -> 193
* Gamma 2.0 over de kleurverzadiging
*/
l = 193.0 * pow(l / 193.0 , 1.3);
/*l = l * l / 193.0;*/
/* scalen met 1/2 SQRT(2) */
l = M_SQRT1_2 * l;
u = (l * sin(t)) + 128.0;
v = (l * cos(t)) + 128.0;
if (u > 255.0) u = 255.0;
if (v > 255.0) v = 255.0;
if (u < 0.0) u = 0.0;
if (v < 0.0) v = 0.0;
rect[1] = u;
rect[3] = v;
rect += 4;
}
}
}
void nix()
{
double l;
/* .8343227 = bijna gamma 1.3 */
/* .5079365 */
/* 0 -> 193.0 */
l = 6.0 * (1.0 - (l / 193.0));
/* 6 -> 0 */
l = 1.0 - ((1.0 - pow(.7, l)) / (1.0 - pow(.7, 6)));
/* 0 -> 1.0 */
l *= 193.0;
/* 0 -> 193.0 */
}
void yrb_add_dit4(ImBuf * ibuf, short ofs)
{
short x,y,pix,and;
uchar *rect;
short dit[] = {-8, 0, -6, 2, 4, -4, 6, -2, -5, 3, -7, 1, 7, -1, 5, -3}, * add;
rect= (uchar *)ibuf->rect;
rect +=ofs;
for (y = ibuf->y; y > 0; y--){
add = &dit[4 * (y & 3)];
for(x = ibuf->x; x > 0; x--){
pix = *rect + add[x & 3];
if (pix & 0x100) {
if (pix < 0) pix = 0;
else pix = 255;
}
*rect = pix;
rect += 4;
}
}
}
void yrb_add_dit2(struct ImBuf * ibuf, short ofs)
{
short x, y, pix, add1, add2, dit[] = {-6, 2, 6, -2};
uchar *rect;
rect = (uchar *) ibuf->rect;
rect += ofs;
for (y = ibuf->y; y > 0; y--){
if (y & 1){
add1 = dit[0];
add2 = dit[1];
} else {
add1 = dit[2];
add2 = dit[3];
}
for (x = ibuf->x; x > 0; x--){
pix = *rect;
if (x & 1) pix += add1;
else pix += add2;
if (pix & 0x100) {
if (pix < 0) pix = 0;
else pix = 255;
}
*rect = pix;
rect += 4;
}
}
}
void convhamx(ibuf, coltab, deltab)
struct ImBuf *ibuf;
uchar coltab[][4];
short *deltab;
{
short r,g,b,lr,lg,lb,dr,dg,db,col,fout,type,step;
int i;
uchar *rect;
/*
b = 0000 xxxx
g = 0001 xxxx
r = 0010 xxxx
cmap >= 48
*/
for (step = 0 ; step < 2 ; step ++){
rect = (uchar *) ibuf->rect;
rect += 4*step;
i = ((ibuf->x * ibuf->y) + 2 - step - 1) / 2;
lb = coltab[0][1];
lg = coltab[0][2];
lr = coltab[0][3];
type = col = 0;
for ( ;i>0;i--){
b = rect[1] >> 4;
g = rect[2] >> 4;
r = rect[3] >> 4;
if ((b-lb) | (g-lg) | (r-lr)){
col = ((b<<8) + (g<<4) + r) << 1;
fout = deltab[col + 1];
col = deltab[col];
type = 0;
dr = quadr[lr-r] ;
dg = quadr[lg-g] ;
db = quadr[lb-b];
if ((dr+dg)<=fout) {
fout = dr+dg ;
type = 1;
}
if ((dg+db)<=fout) {
fout = dg+db;
type = 2;
}
if ((dr+db)<=fout) {
fout = dr+db;
type = 4;
}
switch(type){
case 1:
lb = b ;
col = b;
break;
case 4:
lg = g ;
col = g+16;
break;
case 2:
lr = r ;
col = r + 32;
break;
default:
printf("%04x %5d %5d ", (b<<8) + (g<<4) + r, col, fout);
lb = coltab[col][1];
lg = coltab[col][2];
lr = coltab[col][3];
printf("%01x%01x%01x %01x%01x%01x\n", b, g, r, lb, lg, lr);
col += 48;
}
}
rect[3] = col;
rect += 8;
}
}
}
short dec_c233_rect(ibuf,body,steps)
struct ImBuf * ibuf;
uchar *body;
int steps;
{
uchar i;
int todo;
uint *rect,j,step;
for (step = 0 ; step < steps ; step ++){
rect = ibuf->rect;
rect += step;
todo = (ibuf->x * ibuf->y + steps - step - 1) / steps;
while (todo>0){
i = *body++;
if (i & 128){ /* fill */
if (i==128) continue; /* nop */
i = 257-i;
todo -= i;
j = *(body++) | 0x100;
do{
*rect = j;
rect += steps;
}while (--i);
} else{ /* copy */
i++;
todo -= i;
do{
*rect = *(body++) | 0x100;
rect += steps;
}while (--i);
}
}
if (todo) return (0);
}
return(1);
}
short dec_c233(ibuf,body,steps)
struct ImBuf * ibuf;
uchar *body;
int steps;
{
uchar i;
int todo;
short *rect,j,step;
for (step = 0 ; step < steps ; step ++){
rect = (short *) ibuf->rect;
rect += step;
todo = (ibuf->x * ibuf->y + steps - step - 1) / steps;
while (todo>0){
i = *body++;
if (i & 128){ /* fill */
if (i==128) continue; /* nop */
i = 257-i;
todo -= i;
j = *(body++) | 0x100;
do{
*rect = j;
rect += steps;
}while (--i);
} else{ /* copy */
i++;
todo -= i;
do{
*rect = *(body++) | 0x100;
rect += steps;
}while (--i);
}
}
if (todo) return (0);
}
return(1);
}
short dec_and_or_rect(ImBuf * ibuf, uchar * body, short * and_or, int first)
{
int todo, i;
int j, step, col;
uint *rect;
for (step = 0 ; step < 2 ; step ++){
rect = ibuf->rect;
rect += step;
todo = (ibuf->x * ibuf->y + 2 - step - 1) / 2;
col = first;
while (todo>0){
i = *body++;
if (i & 128){ /* fill */
i = 257-i;
todo -= i;
j = *(body++);
col = (col & and_or[j]) | and_or[j + 256];
do{
*rect = col;
rect += 2;
}while (--i);
} else{ /* copy */
i++;
todo -= i;
do{
j = *(body++);
col = (col & and_or[j]) | and_or[j + 256];
*rect = col;
rect += 2;
}while (--i);
}
}
if (todo) return (0);
}
return(1);
}
short dec_and_or_short(ImBuf * ibuf, uchar * body, short * and_or, int first)
{
int todo, i;
int j, step, col;
short *rect;
for (step = 0 ; step < 2 ; step ++){
rect = (short *) ibuf->rect;
rect += step;
todo = (ibuf->x * ibuf->y + 2 - step - 1) / 2;
col = first;
while (todo>0){
i = *body++;
if (i & 128){ /* fill */
i = 257-i;
todo -= i;
j = *(body++);
col = (col & and_or[j]) | and_or[j + 256];
do{
*rect = col;
rect += 2;
}while (--i);
} else { /* copy */
i++;
todo -= i;
do{
j = *(body++);
/*and_or[511] = rect[-first];*/
* rect = col = (col & and_or[j]) | and_or[j + 256];
rect += 2;
}while (--i);
}
}
if (todo) return (0);
}
return(1);
}
short dec_hamx(ibuf,body,cmap)
struct ImBuf * ibuf;
uchar *body;
int cmap[];
{
int todo,i;
int j,step,col;
uint *rect;
for (step = 0 ; step < 2 ; step ++){
rect = ibuf->rect;
rect += step;
todo = (ibuf->x * ibuf->y + 2 - step - 1) / 2;
col = cmap[0];
while (todo>0){
i = *body++;
if (i & 128){ /* fill */
i = 257-i;
todo -= i;
j = *(body++);
col = ((col & hamx_array[j]) | hamx_array[j + 256]);
do{
*rect = col;
rect += 2;
}while (--i);
} else{ /* copy */
i++;
todo-=i;
do{
j = *(body++);
*rect = col = ((col & hamx_array[j]) | hamx_array[j + 256]);
rect += 2;
}while (--i);
}
}
if (todo) return (0);
}
return(1);
}
struct ImBuf *loadanim(int *iffmem, int flags)
{
int chunk, totlen, len, *mem, cmaplen = 0;
uint *cmap;
uchar *body = 0;
struct Adat adat;
struct ImBuf *ibuf=0;
extern float rgb_to_bw[4][4];
static int first_tanx = TRUE;
mem=iffmem;
if (GET_ID(mem) != FORM) return (0);
if (GET_ID(mem + 2) != ANIM) return (0);
totlen= (GET_BIG_LONG(mem + 1) + 1) & ~1;
mem += 3;
totlen -= 4;
adat.w = 0;
adat.xorig = 0;
adat.yorig = 0;
adat.gamma = adat_gamma;
adat.distort = adat_distort;
while(totlen > 0){
chunk = GET_ID(mem);
len = (GET_BIG_LONG(mem + 1) + 1) & ~1;
mem += 2;
totlen -= len+8;
switch (chunk){
case ADAT:
if (len > sizeof(struct Adat)){
memcpy(&adat,mem,sizeof(struct Adat));
} else{
memcpy(&adat,mem,len);
}
adat.w = BIG_SHORT(adat.w);
adat.h = BIG_SHORT(adat.h);
adat.type = BIG_SHORT(adat.type);
adat.xorig = BIG_SHORT(adat.xorig);
adat.yorig = BIG_SHORT(adat.yorig);
break;
case CMAP:
cmap = (uint *) mem;
cmaplen = len;
break;
case BODY:
body = (uchar *) mem;
break;
}
mem = (int *)((uchar *)mem +len);
}
if (body == 0) return (0);
if (adat.w == 0) return (0);
adat_gamma = adat.gamma;
adat_distort = adat.distort;
if (flags & IB_test) ibuf=allocImBuf(adat.w, adat.h, 24, 0, 0);
else ibuf=allocImBuf(adat.w, adat.h, 24, IB_rect, 0);
if (ibuf==0) return (0);
ibuf->ftype = (Anim | adat.type);
ibuf->xorig = adat.xorig;
ibuf->yorig = adat.yorig;
if (cmaplen){
ibuf->cmap = malloc(cmaplen);
memcpy(ibuf->cmap, cmap, cmaplen);
ibuf->maxcol = cmaplen >> 2;
}
if (flags & IB_test){
if (flags & IB_freem) free(iffmem);
return(ibuf);
}
switch (adat.type){
case C233:
if (flags & IB_word){
if (dec_c233(ibuf,body,2) == 0){
freeImBuf(ibuf);
ibuf = 0;
}
} else {
if (dec_c233_rect(ibuf, body, 2) == 0){
freeImBuf(ibuf);
ibuf = 0;
}
}
break;
case YUVX:
ibuf->cmap = yuv_cmap;
ibuf->mincol = 256;
ibuf->maxcol = 4096;
if (flags & IB_word){
dec_and_or_short(ibuf, body, yuv_and_or, 0x888);
} else {
dec_and_or_rect(ibuf, body, yuv_and_or, 0x888);
if ((flags & IB_cmap) == 0) applycmap(ibuf);
if ((flags & IB_ttob) == 0) flipy(ibuf);
}
break;
case TANX:
if (first_tanx) {
ImBuf * tbuf;
/* Convert cmap to RGB with current settings */
tbuf = allocImBuf(4096, 1, 24, 0, 0);
tbuf->rect = tan_cmap;
tan_space(tbuf);
cspace(tbuf, yuvrgb);
gamwarp(tbuf, adat_gamma);
freeImBuf(tbuf);
first_tanx = FALSE;
}
ibuf->cmap = tan_cmap;
ibuf->mincol = 512;
ibuf->maxcol = 4096;
if (flags & IB_word){
dec_and_or_short(ibuf, body, tan_and_or, 0x200);
} else if (1) {
dec_and_or_rect(ibuf, body, tan_and_or, 0x200);
if ((flags & IB_cmap) == 0) applycmap(ibuf);
if ((flags & IB_ttob) == 0) flipy(ibuf);
} else {
dec_c233_rect(ibuf, body, 2);
dec_tanx(ibuf);
tan_space(ibuf);
cspace(ibuf, yuvrgb);
gamwarp(ibuf, adat.gamma);
if ((flags & IB_ttob) == 0) flipy(ibuf);
}
break;
case HAMX:
if (flags & IB_rect){
if (dec_hamx(ibuf,body,cmap_hamx) == 0){
freeImBuf(ibuf);
ibuf = 0;
}
if (flags & IB_ttob) flipy(ibuf);
}
break;
default:
freeImBuf(ibuf);
ibuf = 0;
}
if (scalecmapY) {
ibuf->x /= 2;
scalefastImBuf(ibuf, ibuf->x, ibuf->y * 2);
ibuf->x *=2;
}
if (flags & IB_freem) free(iffmem);
return (ibuf);
}
uchar *makebody_anim(bytes,buf,rect)
register uchar *buf;
register uchar *rect;
int bytes;
{
register uchar last,this;
register int copy;
register uchar *rectstart,*temp;
bytes--;
rectstart = rect;
last = *rect++;
this = *rect++;
copy = last^this;
while (bytes>0){
if (copy){
do{
last = this;
this = *rect++;
if (last == this){
if (this == rect[-3]){ /* drie dezelfde? */
bytes --; /* bytes goed zetten */
break;
}
}
}while (--bytes != 0);
copy = rect-rectstart;
copy --;
if (bytes) copy -= 2;
temp = rect;
rect = rectstart;
while (copy){
last = copy;
if (copy>MAXDAT) last = MAXDAT;
copy -= last;
*buf++ = last-1;
do{
*buf++ = *rect++;
}while(--last != 0);
}
rectstart = rect;
rect = temp;
last = this;
copy = FALSE;
} else {
while (*rect++ == this){ /* zoek naar eerste afwijkende byte */
if (--bytes == 0) break; /* of einde regel */
}
rect --;
copy = rect-rectstart;
rectstart = rect;
bytes --;
this = *rect++;
while (copy){
if (copy>MAXRUN){
*buf++ = -(MAXRUN-1);
*buf++ = last;
copy -= MAXRUN;
} else {
*buf++ = -(copy-1);
*buf++ = last;
break;
}
}
copy=TRUE;
}
}
return (buf);
}
short enc_anim(ibuf,file)
struct ImBuf *ibuf;
int file;
{
int step, steps, size, i, skip;
uchar *buf1, *crect, *_buf1, *_buf2, *bufend, *buf2;
short ok = TRUE;
if (ibuf == 0) return (0);
if (file < 0 ) return (0);
if (ibuf->rect == 0) return(0);
/* dither toevoegen */
switch(ibuf->ftype){
case AN_c233:
if ((ibuf->flags & IB_cmap) == 0) {
flipy(ibuf);
dit2(ibuf,1,2);
dit2(ibuf,2,3);
dit2(ibuf,3,3);
}
steps = 2;
break;
case AN_yuvx:
if ((ibuf->flags & IB_cmap) == 0) {
cspace(ibuf, rgbyuv);
flipy(ibuf);
yrb_add_dit2(ibuf, 1);
yrb_add_dit4(ibuf, 2);
yrb_add_dit2(ibuf, 3);
}
steps = 2;
converttoyuvx(ibuf);
break;
case AN_tanx:
if ((ibuf->flags & IB_cmap) == 0) {
gamwarp(ibuf, 1.0 / adat_gamma);
cspace(ibuf, rgbyuv);
atan_space(ibuf);
flipy(ibuf);
tan_add_dit4(ibuf, 1);
tan_add_dit2(ibuf, 2);
tan_add_dit4(ibuf, 3);
}
steps = 2;
converttotanx(ibuf);
break;
case AN_hamx:
ibuf->cmap = cmap_hamx;
ibuf->mincol = 0;
ibuf->maxcol = sizeof(cmap_hamx) / 4;
converttoham(ibuf);
steps = 2;
break;
}
size = ((ibuf->x + 1)* (ibuf->y + 1)) / steps + 1024;
if ((_buf1 = malloc(size)) == 0) return(0);
if ((_buf2 = malloc(size)) == 0){
free(_buf1);
return(0);
}
skip = 4 * steps;
for (step = 0 ; step < steps ; step ++){
crect = (uchar *) ibuf->rect;
crect += 4 * step;
size = (ibuf->x * ibuf->y + steps - step - 1) / steps;
buf1 = _buf1;
if ((ibuf->ftype == AN_hamx) || (ibuf->ftype == AN_yuvx)){
crect += 3;
for (i = size ; i>0 ; i--){
*(buf1 ++) = *crect;
crect += skip;
}
} else if (ibuf->ftype == AN_tanx) {
for (i = size ; i > 0 ; i--){
*(buf1 ++) = *crect;
crect += skip;
}
} else{
for (i = size ; i>0 ; i--){
*(buf1 ++) = crect[1] + (crect[2] >> 2) + (crect[3] >> 5);
crect += skip;
}
}
bufend = makebody_anim(size,_buf2,_buf1);
if (bufend == 0){
ok = FALSE;
break;
}
size = bufend - _buf2;
if (write(file, _buf2, size) != size){
ok = FALSE;
break;
}
}
free(_buf1);
free(_buf2);
return (ok);
}