Annotation of uae/gfxutil.c, revision 1.1

1.1     ! root        1:  /* 
        !             2:   * UAE - The Un*x Amiga Emulator
        !             3:   * 
        !             4:   * Common code needed by all the various graphics systems.
        !             5:   * 
        !             6:   * (c) 1996 Bernd Schmidt, Ed Hanway
        !             7:   */
        !             8: 
        !             9: #include "sysconfig.h"
        !            10: #include "sysdeps.h"
        !            11: 
        !            12: #include "config.h"
        !            13: #include "options.h"
        !            14: #include "memory.h"
        !            15: #include "custom.h"
        !            16: #include "newcpu.h"
        !            17: #include "keyboard.h"
        !            18: #include "xwin.h"
        !            19: #include "keybuf.h"
        !            20: 
        !            21: unsigned long doMask(int p, int bits, int shift)
        !            22: {
        !            23:     /* p is a value from 0 to 15 (Amiga color value)
        !            24:      * scale to 0..255, shift to align msb with mask, and apply mask */
        !            25: 
        !            26:     unsigned long val = p * 0x11111111UL;
        !            27:     val >>= (32 - bits);
        !            28:     val <<= shift;
        !            29: 
        !            30:     return val;
        !            31: }
        !            32: 
        !            33: void alloc_colors64k(int rw, int gw, int bw, int rs, int gs, int bs)
        !            34: {
        !            35:     int i;
        !            36:     for(i=0; i<4096; i++) {
        !            37:        int r = i >> 8;
        !            38:        int g = (i >> 4) & 0xF;
        !            39:        int b = i & 0xF;
        !            40:        xcolors[i] = doMask(r, rw, rs) | doMask(g, gw, gs) | doMask(b, bw, bs);
        !            41:     }
        !            42: }
        !            43: 
        !            44: static int allocated[4096];
        !            45: 
        !            46: void alloc_colors256(int (* allocfunc)(int, int, int, xcolnr *))
        !            47: {
        !            48:     /* This is kind of kludgy...
        !            49:      * Try to allocate as many different colors as possible. */
        !            50:     int step = 5, mode = 0, count = 0, col;
        !            51:     int no_allocated = 0;
        !            52: 
        !            53:     memset(allocated, 0, sizeof allocated);
        !            54:     fprintf(stderr, "Allocating lots of colors...\n");
        !            55:     
        !            56:     do {
        !            57:        int r, g, b, rs, bs, gs;
        !            58:        bs = step;
        !            59:        rs = step;
        !            60:        gs = step;
        !            61:        for(b = 0; b < 16; b += bs) {
        !            62:            for(r = 0; r < 16; r += rs) {
        !            63:                for(g = 0; g < 16; g += gs) {
        !            64:                    int cnr = (r << 8) + (g << 4) + b;
        !            65:                    if (!allocated[cnr]) {
        !            66:                        int result = allocfunc(r, g, b, xcolors + cnr);
        !            67:                        if (result < 0 || no_allocated == 256)
        !            68:                            goto finished;
        !            69:                        if (result > 0) {
        !            70:                            allocated[cnr] = 1;
        !            71:                            no_allocated++;
        !            72:                        }
        !            73:                    }
        !            74:                }
        !            75:            }
        !            76:        }
        !            77:        if (step > 1)
        !            78:            step++;
        !            79:        step /= 2;
        !            80:     } while (step);
        !            81:     
        !            82:     finished:
        !            83: #if 0
        !            84:     for(col = 0; col < 4096; col++) {
        !            85:        int cnr = col;
        !            86:        if (!allocated[cnr]) {
        !            87:            int r = cnr >> 8;
        !            88:            int g = (cnr >> 4) & 0xF;
        !            89:            int b = cnr & 0xF;
        !            90:            int maxd = 4096,best = 0;
        !            91:            int c2;
        !            92:            for(c2 = 0; c2 < 4096; c2++)
        !            93:                if (allocated[c2]) {
        !            94:                    int r2 = c2 >> 8;
        !            95:                    int g2 = (c2 >> 4) & 0xF;
        !            96:                    int b2 = c2 & 0xF;
        !            97:                    int rd = (r2-r)*r*2;
        !            98:                    int bd = (b2-b)*b*2;
        !            99:                    int gd = (g2-g)*g*2;
        !           100:                    int dist = abs(rd) + abs(gd) + abs(bd) + abs(rd-gd)/3 + abs(rd-bd)/3 + abs(gd-bd)/3;
        !           101:                    if (dist < maxd) {
        !           102:                        maxd = dist;
        !           103:                        best = c2;
        !           104:                    }
        !           105:                }
        !           106:            cnr = best;
        !           107:        }
        !           108:        xcolors[col] = xcolors[cnr];
        !           109:     }
        !           110: #else
        !           111:     for(col = 0; col < 4096; col++) {
        !           112:        int cnr;
        !           113:        int dist;
        !           114:        int r = col >> 8;
        !           115:        int g = (col >> 4) & 0xF;
        !           116:        int b = col & 0xF;
        !           117:        
        !           118:        if (allocated[col])
        !           119:            continue;
        !           120:        
        !           121:        for (dist = 2;; dist++) {
        !           122:            int r2, g2, b2;
        !           123:            int rd, gd, bd;
        !           124:            int best = 0, maxd = 32767;
        !           125:            for (gd = 0; gd < dist; gd = gd < 0 ? -gd : -gd-1) {
        !           126:                g2 = g + gd;
        !           127:                if (g2 < 0 || g2 > 15)
        !           128:                    continue;
        !           129:                for (rd = 0; rd < dist; rd = rd < 0 ? -rd : -rd-1) {
        !           130:                    r2 = r + rd;
        !           131:                    if (r2 < 0 || r2 > 15)
        !           132:                        continue;
        !           133:                    for (bd = 0; bd < dist; bd = bd < 0 ? -bd : -bd-1) {
        !           134:                        b2 = b + bd;
        !           135:                        if (b2 < 0 || b2 > 15)
        !           136:                            continue;
        !           137:                        cnr = (r2 << 8) + (g2 << 4) + b2;
        !           138:                        if (allocated[cnr]) {
        !           139:                            int rd2 = rd == 0 ? 0 : rd*32/r;
        !           140:                            int gd2 = gd == 0 ? 0 : gd*32/g;
        !           141:                            int bd2 = bd == 0 ? 0 : bd*32/b;
        !           142:                            int dist = abs(rd) + abs(gd) + abs(bd) + abs(rd2-gd2) + abs(rd2-bd2) + abs(gd2-bd2);
        !           143:                            if (dist < maxd) {
        !           144:                                maxd = dist;
        !           145:                                xcolors[col] = xcolors[cnr];
        !           146:                            }
        !           147:                        }
        !           148:                    }
        !           149:                }
        !           150:            }
        !           151:            if (maxd != 32767)
        !           152:                break;
        !           153:        }
        !           154:     }
        !           155: #endif
        !           156: }
        !           157: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.