Ticket #8025: dissolve.diff

File dissolve.diff, 4.8 KB (added by eriktorbjorn, 22 years ago)

Patch against an August 24 CVS snapshot of scummvm-new

  • scummvm-new/scumm/gfx.cpp

    diff -ur ScummVM-cvs20020824/scummvm-new/scumm/gfx.cpp ScummVM-cvs20020824+hack/scummvm-new/scumm/gfx.cpp
    old new  
    674674                transitionEffect(effect - 1);
    675675                break;
    676676        case 128:
    677                 unkScreenEffect6();
     677                dissolveEffect(8, 8);
    678678                break;
    679679        case 130:
    680680                unkScreenEffect1();
     
    689689                unkScreenEffect4();
    690690                break;
    691691        case 134:
    692                 unkScreenEffect5(0);
     692                dissolveEffect(1, 1);
    693693                break;
    694694        case 135:
    695695                unkScreenEffect5(1);
     
    731731                transitionEffect(a - 1);
    732732                break;
    733733        case 128:
    734                 unkScreenEffect6();
     734                dissolveEffect(8, 8);
    735735                break;
    736736        case 129:
    737737                // Just blit screen 0 to the display (i.e. display will be black)
     
    739739                updateDirtyScreen(0);
    740740                break;
    741741        case 134:
    742                 unkScreenEffect5(0);
     742                dissolveEffect(1, 1);
    743743                break;
    744744        case 135:
    745745                unkScreenEffect5(1);
     
    19791979        }
    19801980}
    19811981
    1982 void Scumm::unkScreenEffect6()
     1982// Update width x height areas of the screen, in random order, until the whole
     1983// screen has been updated. For instance:
     1984//
     1985// dissolveEffect(1, 1) produces a pixel-by-pixel dissolve
     1986// dissolveEffect(8, 8) produces a square-by-square dissolve
     1987// dissolveEffect(virtsrc[0].width, 1) produces a line-by-line dissolve
     1988
     1989void Scumm::dissolveEffect(int width, int height)
    19831990{
    1984         /* XXX: not implemented */
    1985         warning("stub unkScreenEffect6");
     1991        VirtScreen *vs = &virtscr[0];
     1992        int *offsets;
     1993        int blits_before_refresh, blits;
     1994        int x, y;
     1995        int w, h;
     1996        int i;
     1997
     1998        // There's probably some less memory-hungry way of doing this. But
     1999        // since we're only dealing with relatively small images, it shouldn't
     2000        // be too bad.
     2001
     2002        w = vs->width / width;
     2003        h = vs->height / height;
     2004
     2005        // When used used correctly, vs->width % width and vs->height % height
     2006        // should both be zero, but just to be safe...
     2007
     2008        if (vs->width % width)
     2009                w++;
     2010
     2011        if (vs->height % height)
     2012                h++;
     2013
     2014        offsets = (int *) malloc(w * h * sizeof(int));
     2015        if (offsets == NULL) {
     2016                warning("dissolveEffect: out of memory");
     2017                return;
     2018        }
     2019
     2020        // Create a permutation of offsets into the frame buffer
     2021
     2022        if (width == 1 && height == 1) {
     2023                // Optimized case for pixel-by-pixel dissolve
     2024
     2025                for (i = 0; i < vs->size; i++)
     2026                        offsets[i] = i;
     2027
     2028                for (i = 1; i < w * h; i++) {
     2029                        int j;
     2030
     2031                        j = getRandomNumber(i - 1);
     2032                        offsets[i] = offsets[j];
     2033                        offsets[j] = i;
     2034                }
     2035        } else {
     2036                int *offsets2;
     2037
     2038                for (i = 0, x = 0; x < vs->width; x += width)
     2039                        for (y = 0; y < vs->height; y += height)
     2040                                offsets[i++] = y * vs->width + x;
     2041
     2042                offsets2 = (int *) malloc(w * h * sizeof(int));
     2043                if (offsets2 == NULL) {
     2044                        warning("dissolveEffect: out of memory");
     2045                        free(offsets);
     2046                        return;
     2047                }
     2048
     2049                memcpy(offsets2, offsets, w * h * sizeof(int));
     2050
     2051                for (i = 1; i < w * h; i++) {
     2052                        int j;
     2053
     2054                        j = getRandomNumber(i - 1);
     2055                        offsets[i] = offsets[j];
     2056                        offsets[j] = offsets2[i];
     2057                }
     2058
     2059                free(offsets2);
     2060        }
     2061
     2062        // Blit the image piece by piece to the screen. The idea here is that
     2063        // the whole update should take about a quarter of a second, assuming
     2064        // most of the time is spent in waitForTimer(). It looks good to me,
     2065        // but might still need some tuning.
     2066
     2067        updatePalette();
     2068
     2069        blits = 0;
     2070        blits_before_refresh = (3 * w * h) / 25;
     2071
     2072        for (i = 0; i < w * h; i++) {
     2073                x = offsets[i] % vs->width;
     2074                y = offsets[i] / vs->width;
     2075                _system->copy_rect(vs->screenPtr + vs->xstart + y * vs->width + x, vs->width, x, y, width, height);
     2076
     2077                if (++blits >= blits_before_refresh) {
     2078                        blits = 0;
     2079                        _system->update_screen();
     2080                        waitForTimer(30);
     2081                }
     2082        }
     2083
     2084        free(offsets);
     2085
     2086        if (blits != 0) {
     2087                _system->update_screen();
     2088                waitForTimer(30);
     2089        }
    19862090}
    19872091
    19882092void Scumm::unkScreenEffect5(int a)
    19892093{
     2094        // unkScreenEffect5(0), which is used by FOA during the opening
     2095        // cutscene when Indy opens the small statue, has been replaced by
     2096        // dissolveEffect(1, 1).
     2097        //
     2098        // I still don't know what unkScreenEffect5(1) is supposed to do.
     2099
    19902100        /* XXX: not implemented */
    1991         warning("stub unkScreenEffect5(%d)", a);
     2101        warning("stub unkScreenEffect(%d)", a);
    19922102}
    19932103
    19942104void Scumm::setShake(int mode)
  • scummvm-new/scumm/scumm.h

    diff -ur ScummVM-cvs20020824/scummvm-new/scumm/scumm.h ScummVM-cvs20020824+hack/scummvm-new/scumm/scumm.h
    old new  
    833833        void unkScreenEffect3();
    834834        void unkScreenEffect4();
    835835        void unkScreenEffect5(int a);
    836         void unkScreenEffect6();
    837836        void transitionEffect(int a);           // former unkScreenEffect7
     837        void dissolveEffect(int width, int height);     // former unkScreenEffect5(0) and unkScreenEffect6
    838838
    839839        void decompressBomp(byte *dst, byte *src, int w, int h);
    840840        uint _shakeFrame;