diff options
Diffstat (limited to 'util/gencmap/gencmap.cpp')
-rw-r--r-- | util/gencmap/gencmap.cpp | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/util/gencmap/gencmap.cpp b/util/gencmap/gencmap.cpp new file mode 100644 index 0000000..9d0d997 --- /dev/null +++ b/util/gencmap/gencmap.cpp @@ -0,0 +1,344 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the utils of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qcolor.h> +#include <stdio.h> +#include <stdlib.h> +#include <limits.h> + + +#define APPLE_CMAP 1 + +struct Col { + int r,g,b; +}; + +#if SPACE_SEARCH +#define MAPSIZE 256 +#define ACCURACY 4 // Bits-per-channel +#define SPACESIZE ((1<<ACCURACY)*(1<<ACCURACY)*(1<<ACCURACY)) +#define R(c) (((c>>(8-ACCURACY)*2)&((1<<ACCURACY)-1))<<ACCURACY) +#define G(c) (((c>>(8-ACCURACY))&((1<<ACCURACY)-1))<<ACCURACY) +#define B(c) (((c>>0)&((1<<ACCURACY)-1))<<ACCURACY) +#define COL(c) (((c.r>>(8-ACCURACY))<<8)|((c.b>>(8-ACCURACY))<<4)|(c.g>>(8-ACCURACY))) +#elif APPLE_CMAP +#define SPACESIZE 216 +#define MAPSIZE 216 +#define R(c) ((apple_cmap[c]>>16)&0xff) +#define G(c) ((apple_cmap[c]>>8)&0xff) +#define B(c) ((apple_cmap[c]>>0)&0xff) +#define COL(c) findapple(c) +static int apple_cmap[216] = { +0xffffff, +0xffffcc, +0xffff99, +0xffff66, +0xffff33, +0xffff00, +0xffccff, +0xffcccc, +0xffcc99, +0xffcc66, +0xffcc33, +0xffcc00, +0xff99ff, +0xff99cc, +0xff9999, +0xff9966, +0xff9933, +0xff9900, +0xff66ff, +0xff66cc, +0xff6699, +0xff6666, +0xff6633, +0xff6600, +0xff33ff, +0xff33cc, +0xff3399, +0xff3366, +0xff3333, +0xff3300, +0xff00ff, +0xff00cc, +0xff0099, +0xff0066, +0xff0033, +0xff0000, +0xccffff, +0xccffcc, +0xccff99, +0xccff66, +0xccff33, +0xccff00, +0xccccff, +0xcccccc, +0xcccc99, +0xcccc66, +0xcccc33, +0xcccc00, +0xcc99ff, +0xcc99cc, +0xcc9999, +0xcc9966, +0xcc9933, +0xcc9900, +0xcc66ff, +0xcc66cc, +0xcc6699, +0xcc6666, +0xcc6633, +0xcc6600, +0xcc33ff, +0xcc33cc, +0xcc3399, +0xcc3366, +0xcc3333, +0xcc3300, +0xcc00ff, +0xcc00cc, +0xcc0099, +0xcc0066, +0xcc0033, +0xcc0000, +0x99ffff, +0x99ffcc, +0x99ff99, +0x99ff66, +0x99ff33, +0x99ff00, +0x99ccff, +0x99cccc, +0x99cc99, +0x99cc66, +0x99cc33, +0x99cc00, +0x9999ff, +0x9999cc, +0x999999, +0x999966, +0x999933, +0x999900, +0x9966ff, +0x9966cc, +0x996699, +0x996666, +0x996633, +0x996600, +0x9933ff, +0x9933cc, +0x993399, +0x993366, +0x993333, +0x993300, +0x9900ff, +0x9900cc, +0x990099, +0x990066, +0x990033, +0x990000, +0x66ffff, +0x66ffcc, +0x66ff99, +0x66ff66, +0x66ff33, +0x66ff00, +0x66ccff, +0x66cccc, +0x66cc99, +0x66cc66, +0x66cc33, +0x66cc00, +0x6699ff, +0x6699cc, +0x669999, +0x669966, +0x669933, +0x669900, +0x6666ff, +0x6666cc, +0x666699, +0x666666, +0x666633, +0x666600, +0x6633ff, +0x6633cc, +0x663399, +0x663366, +0x663333, +0x663300, +0x6600ff, +0x6600cc, +0x660099, +0x660066, +0x660033, +0x660000, +0x33ffff, +0x33ffcc, +0x33ff99, +0x33ff66, +0x33ff33, +0x33ff00, +0x33ccff, +0x33cccc, +0x33cc99, +0x33cc66, +0x33cc33, +0x33cc00, +0x3399ff, +0x3399cc, +0x339999, +0x339966, +0x339933, +0x339900, +0x3366ff, +0x3366cc, +0x336699, +0x336666, +0x336633, +0x336600, +0x3333ff, +0x3333cc, +0x333399, +0x333366, +0x333333, +0x333300, +0x3300ff, +0x3300cc, +0x330099, +0x330066, +0x330033, +0x330000, +0x00ffff, +0x00ffcc, +0x00ff99, +0x00ff66, +0x00ff33, +0x00ff00, +0x00ccff, +0x00cccc, +0x00cc99, +0x00cc66, +0x00cc33, +0x00cc00, +0x0099ff, +0x0099cc, +0x009999, +0x009966, +0x009933, +0x009900, +0x0066ff, +0x0066cc, +0x006699, +0x006666, +0x006633, +0x006600, +0x0033ff, +0x0033cc, +0x003399, +0x003366, +0x003333, +0x003300, +0x0000ff, +0x0000cc, +0x000099, +0x000066, +0x000033, +0x000000, +}; +int findapple(Col c) +{ + for (int i=0; i<216; i++) + if (apple_cmap[i]==(c.r<<16)|(c.g<<8)|c.b) return i; + abort(); +} +#endif + +#define SQ(x) ((x)*(x)) +#define D(c1,c2) (SQ(R(c1)-R(c2))+SQ(G(c1)-G(c2))+SQ(B(c1)-B(c2))) + +main() +{ + Col c[256] = { + { 0,0,0 }, + { 255,255,255 }, + { 255,0,0 }, { 0,255,0 }, { 0,0,255 }, + { 255,255,0 }, { 0,255,255 }, { 255,0,255 }, + #define PREALLOC 8 + { 96,96,96 }, { 192,192,192 }, + //#define PREALLOC 10 + }; + int done[SPACESIZE]; + for (int a=0; a<SPACESIZE; a++) done[a]=0; + for (int a=0; a<PREALLOC; a++) done[COL(c[a])]=1; + + for (int allocated=PREALLOC; allocated<MAPSIZE; allocated++) { + int mostdist; + int dist=0; + for (int a=0; a<SPACESIZE; a++) { + if (!done[a]) { + int closeness=INT_MAX; + for (int b=0; b<SPACESIZE; b++) { + if (done[b]) { + int d=D(a,b); + if (d < closeness) { + closeness=d; + } + } + } + if (closeness > dist) { + mostdist=a; + dist=closeness; + } + } + } + c[allocated].r=R(mostdist); + c[allocated].g=G(mostdist); + c[allocated].b=B(mostdist); + done[mostdist]=1; + fprintf(stderr,"Done %d of %d (%06x dist %d)\n",allocated+1,MAPSIZE, + qRgb(c[allocated].r, c[allocated].g, c[allocated].b), dist); + } + + for (int i=0; i<256; i++) { + printf("0x%06x,%c", qRgb(c[i].r, c[i].g, c[i].b), i%4==3 ? '\n' : ' '); + } +} |