Ticket #8055: drawbomp2.diff

File drawbomp2.diff, 3.7 KB (added by eriktorbjorn, 22 years ago)

Patch against a September 17 CVS snapshot

  • scummvm/scumm/gfx.cpp

    diff -ur ScummVM-cvs20020917/scummvm/scumm/gfx.cpp ScummVM-cvs20020917+hack/scummvm/scumm/gfx.cpp
    old new  
    30683068
    30693069static byte blend(byte *pal, byte method, int dest_color)
    30703070{
    3071         double val = 1.0;
     3071        int val = 0;
    30723072        int cache = 0;
    30733073
     3074        // FIXME: Check if this gives the correct blending for the Dig
     3075        // inventory box and conversation menus. For now, I have deliberately
     3076        // selected them so that the subsequent multiplication and shift could
     3077        // be replaced by just a shift.
     3078
    30743079        switch (method) {
    30753080                case 1:
    30763081                        cache = 0;
    3077                         val = 0.5;
     3082                        val = 128;
    30783083                        break;
    30793084
    30803085                case 2:
    30813086                        cache = 1;
    3082                         val = 0.4;
     3087                        val = 64;
    30833088                        break;
    30843089
    30853090                case 3:
    30863091                        cache = 2;
    3087                         val = 1.1;
     3092                        val = 256;
    30883093                        break;
    30893094
    30903095                case 255:
     
    30993104                byte g = *(pal + 3 * dest_color + 1);
    31003105                byte b = *(pal + 3 * dest_color + 2);
    31013106
    3102                 int new_r = (int) (val * r + 0.5);
    3103                 int new_g = (int) (val * g + 0.5);
    3104                 int new_b = (int) (val * b + 0.5);
     3107                int new_r = (val * r) >> 8;
     3108                int new_g = (val * g) >> 8;
     3109                int new_b = (val * b) >> 8;
    31053110
    31063111                if (new_r > 255)
    31073112                        new_r = 255;
     
    31173122}
    31183123
    31193124// param3= clipping
    3120 
    31213125// param2= mirror
    3122 
    31233126// param1= never used ?
     3127
    31243128void Scumm::drawBomp(BompDrawData *bd, int param1, byte *dataPtr, int param2, int param3)
    31253129{
    31263130        byte *scale_rows = NULL;
     
    31423146                }
    31433147        }
    31443148
    3145         if (bd->scale_y != 255) {       
     3149        if (bd->scale_y != 255) {
    31463150                scale_cols = (byte *) calloc(bd->srcwidth, 1);
    31473151                if (scale_cols == NULL) {
    31483152                        warning("drawBomp: out of memory");
     3153                        if (scale_rows)
     3154                                free(scale_rows);
    31493155                        return;
    31503156                }
    31513157        }
     
    31663172                        scale_rows[(i * 255) / bd->scale_y] = 1;
    31673173        }
    31683174
     3175        // FIXME: Be more intelligent about clearing the blend cache. It
     3176        // should be possible to clear it only for the parts of the palette
     3177        // that have changed since the last time.
     3178
    31693179        clear_blend_cache();
    31703180
    31713181        dest += bd->x;
    31723182        src = bd->dataptr;
     3183
    31733184        for (src_y = 0, dst_y = bd->y; src_y < bd->srcheight; src_y++) {
    31743185                byte code, color;
    31753186                uint len, num;
    31763187                byte *d = dest;
    31773188
    3178                 if (dst_y < 0 || dst_y >= bd->outheight) {
     3189                if (dst_y < 0 || dst_y >= bd->outheight || (bd->scale_y != 255 && !scale_rows[src_y])) {
    31793190                        src += READ_LE_UINT16(src) + 2;
    31803191                        continue;
    31813192                }
     
    31933204                        len -= num;
    31943205                        if (code & 1) {
    31953206                                color = *src++;
    3196                                 if (bd->scale_y == 255 || scale_rows[src_y]) {
    3197                                         do {
    3198                                                 if (dst_x >= 0 && dst_x < bd->outwidth && (bd->scale_x || scale_cols[src_x]))
     3207                                for (i = 0; i < num; i++) {
     3208                                        if (bd->scale_x == 255 || scale_cols[src_x]) {
     3209                                                if (dst_x >= 0 && dst_x < bd->outwidth)
    31993210                                                        *d = blend(_currentPalette, color, *d);
    3200                                                 if (bd->scale_x == 255 || scale_cols[src_x]) {
    3201                                                         d++;
    3202                                                         dst_x++;
    3203                                                 }
    3204                                                 src_x++;
    3205                                         } while (--num);
    3206                                 } else {
    3207                                         src_x += num;
    3208                                         dst_x += num;
     3211                                                d++;
     3212                                                dst_x++;
     3213                                        }
     3214                                        src_x++;
    32093215                                }
    32103216                        } else {
    3211                                 if (bd->scale_y == 255 || scale_rows[src_y]) {
    3212                                         for (i = 0; i < num; i++) {
    3213                                                 if (dst_x >= 0 && dst_x < bd->outwidth && (bd->scale_x || scale_cols[src_x]))
     3217                                for (i = 0; i < num; i++) {
     3218                                        if (bd->scale_x == 255 || scale_cols[src_x]) {
     3219                                                if (dst_x >= 0 && dst_x < bd->outwidth)
    32143220                                                        *d = blend(_currentPalette, src[i], *d);
    3215                                                 if (bd->scale_x == 255 || scale_cols[src_x]) {
    3216                                                         d++;
    3217                                                         dst_x++;
    3218                                                 }
    3219                                                 src_x++;
     3221                                                d++;
     3222                                                dst_x++;
    32203223                                        }
    3221                                 } else {
    3222                                         dst_x += num;
    3223                                         src_x += num;
     3224                                        src_x++;
    32243225                                }
    32253226                                src += num;
    32263227                        }
    32273228                }
    3228                 if (bd->scale_y == 255 || scale_rows[src_y]) {
    3229                         dest += bd->outwidth;
    3230                         dst_y++;
    3231                 }
     3229                dest += bd->outwidth;
     3230                dst_y++;
    32323231        }
    32333232
    32343233        if (scale_rows)