Ticket #9019: 16bit_step3.patch

File 16bit_step3.patch, 6.6 KB (added by SF/upthorn, 10 years ago)

Part 3 -- making the v100he subengine non-conditionally display a 16bit background in freddicove

  • dists/msvc8/scumm.vcproj

     
    11<?xml version="1.0" encoding="windows-1252"?>
    22<VisualStudioProject
    33        ProjectType="Visual C++"
    4         Version="8,00"
     4        Version="8.00"
    55        Name="scumm"
    66        ProjectGUID="{B6AFD548-63D2-40CD-A652-E87095AFCBAF}"
    77        RootNamespace="scumm"
     
    4343                                Optimization="0"
    4444                                InlineFunctionExpansion="0"
    4545                                AdditionalIncludeDirectories="../../;../../engines"
    46                                 PreprocessorDefinitions="WIN32;_DEBUG;ENABLE_SCUMM_7_8;ENABLE_HE;USE_ZLIB;USE_MAD;USE_VORBIS"
     46                                PreprocessorDefinitions="WIN32;_DEBUG;ENABLE_SCUMM_7_8;ENABLE_HE;USE_ZLIB;USE_MAD;USE_VORBIS; ENABLE_16BIT"
    4747                                MinimalRebuild="true"
    4848                                ExceptionHandling="1"
    4949                                BasicRuntimeChecks="3"
  • engines/scumm/gfx.cpp

     
    341341        vs->hasTwoBuffers = twobufs;
    342342        vs->xstart = 0;
    343343        vs->backBuf = NULL;
     344#ifdef ENABLE_16BIT
     345        vs->bytesPerPixel = 2;
     346        vs->pitch = width * 2;
     347#else
    344348        vs->bytesPerPixel = 1;
    345349        vs->pitch = width;
     350#endif
    346351
    347352        if (_game.version >= 7) {
    348353                // Increase the pitch by one; needed to accomodate the extra screen
     
    586591                vsPitch = _screenWidth * m - width * m;
    587592
    588593        } else {
     594#ifdef ENABLE_16BIT
     595                vsPitch = vs->pitch - width * 2;
     596#else
    589597                vsPitch = vs->pitch - width;
     598#endif
    590599        }
    591600
    592601
     
    616625                uint32 *dst32 = (uint32 *)_compositeBuf;
    617626
    618627                vsPitch >>= 2;
     628#ifdef ENABLE_16BIT
     629                const int textPitch = (_textSurface.pitch - width * 2 * m) >> 2;
     630                for (int h = height * m; h > 0; --h) {
     631                        for (int w = width*m; w > 0; w-=2) {
     632                                *dst32++ = *src32++;
     633                        }
     634                        src32 += vsPitch;
     635                        text32 += textPitch;
     636                }
     637#else
    619638                const int textPitch = (_textSurface.pitch - width * m) >> 2;
    620639                for (int h = height * m; h > 0; --h) {
    621640                        for (int w = width*m; w > 0; w-=4) {
     
    640659                        text32 += textPitch;
    641660                }
    642661#endif
     662#endif
    643663                src = _compositeBuf;
     664#ifdef ENABLE_16BIT
     665                pitch = width * 2;
     666#else
    644667                pitch = width;
     668#endif
    645669
    646670                if (_renderMode == Common::kRenderHercA || _renderMode == Common::kRenderHercG) {
    647671                        ditherHerc(_compositeBuf, _herculesBuf, width, &x, &y, &width, &height);
     
    10531077        assert(src != NULL);
    10541078        assert(dst != NULL);
    10551079
     1080#ifdef ENABLE_16BIT
     1081        if (w == srcPitch * 2 && w == dstPitch * 2) {
     1082                memcpy(dst, src, w*h*2);
     1083        } else {
     1084                do {
     1085                        memcpy(dst, src, w * 2);
     1086                        dst += dstPitch;
     1087                        src += srcPitch;
     1088                } while (--h);
     1089        }
     1090#else
    10561091        if (w == srcPitch && w == dstPitch) {
    10571092                memcpy(dst, src, w*h);
    10581093        } else {
     
    10621097                        src += srcPitch;
    10631098                } while (--h);
    10641099        }
     1100#endif
    10651101}
    10661102
    10671103static void fill(byte *dst, int dstPitch, byte color, int w, int h) {
  • engines/scumm/gfx.h

     
    155155        }
    156156
    157157        byte *getPixels(int x, int y) const {
     158#ifdef ENABLE_16BIT
     159                return (byte *)pixels + xstart * 2 + y * pitch + x * 2;
     160#else
    158161                return (byte *)pixels + xstart + y * pitch + x;
     162#endif
    159163        }
    160164
    161165        byte *getBackPixels(int x, int y) const {
     166#ifdef ENABLE_16BIT
     167                return (byte *)backBuf + xstart * 2 + y * pitch + x * 2;
     168#else
    162169                return (byte *)backBuf + xstart + y * pitch + x;
     170#endif
    163171        }
    164172};
    165173
  • engines/scumm/he/intern_he.h

     
    543543        byte _debugInputBuffer[256];
    544544public:
    545545        ScummEngine_v100he(OSystem *syst, const DetectorResult &dr) : ScummEngine_v99he(syst, dr) {}
    546 
    547546        virtual void resetScumm();
     547#ifdef ENABLE_16BIT
     548        //HACK: This is a temporary hack to override the normal class methods to get
     549        //an engine that just renders the desired freddicove demo background instead
     550        virtual Common::Error run();
     551        virtual Common::Error go();
     552#endif
    548553
    549554protected:
    550555        virtual void setupOpcodes();
  • engines/scumm/he/wiz_he.cpp

     
    567567                int h = r1.height();
    568568                int w = r1.width();
    569569                src += r1.left + r1.top * srcw * 2;
     570#ifdef ENABLE_16BIT
     571                uint16 *dst16 = (uint16 *) dst;
     572                dst16 += r2.left + r2.top * dstw;
     573                while (h--) {
     574                        for (int i = 0; i < w; ++ i) {
     575                                dst16[i] = READ_LE_UINT16(src + 2 * i);
     576                        }
     577                        src += srcw * 2;
     578                        dst16 += dstw;
     579                }
     580#else
    570581                dst += r2.left + r2.top * dstw;
    571582                while (h--) {
    572583                        for (int i = 0; i < w; ++i) {
     
    583594                        src += srcw * 2;
    584595                        dst += dstw;
    585596                }
     597#endif
    586598        }
    587599}
    588600
  • engines/scumm/scumm.cpp

     
    523523
    524524        // Allocate gfx compositing buffer (not needed for V7/V8 games).
    525525        if (_game.version < 7)
     526#ifdef ENABLE_16BIT
     527                _compositeBuf = (byte *)malloc(_screenWidth * _screenHeight * 2);
     528#else
    526529                _compositeBuf = (byte *)malloc(_screenWidth * _screenHeight);
     530#endif
    527531        else
    528532                _compositeBuf = 0;
    529533
     
    12011205        }
    12021206
    12031207        free(_compositeBuf);
     1208#ifdef ENABLE_16BIT
     1209        _compositeBuf = (byte *)malloc(_screenWidth * _textSurfaceMultiplier * _screenHeight * _textSurfaceMultiplier * 2);
     1210#else
    12041211        _compositeBuf = (byte *)malloc(_screenWidth * _textSurfaceMultiplier * _screenHeight * _textSurfaceMultiplier);
     1212#endif
    12051213}
    12061214
    12071215#ifdef ENABLE_SCUMM_7_8
     
    15641572
    15651573        memset(_debugInputBuffer, 0, sizeof(_debugInputBuffer));
    15661574}
     1575#ifdef ENABLE_16BIT
     1576Common::Error ScummEngine_v100he::run() {
     1577                Common::Error err;
     1578                err = init();
     1579                if (err != Common::kNoError)
     1580                        return err;
     1581                return go();
     1582}
     1583Common::Error ScummEngine_v100he::go() {
     1584        if (_game.features & GF_16BIT_COLOR) {
     1585
     1586                int diff = 0;   // Duration of one loop iteration
     1587
     1588                // Get the background resource
     1589                uint16 t = 0;
     1590                while (!shouldQuit()) {
     1591                        //Draw the background
     1592                        for (int16 i = 316, x = 0; x < 640; i++, x += 80)
     1593                                _wiz->drawWizImage(i, 0, x, 0, 0, 0, 0, 0, 0, 0, 0);
     1594
     1595                        //Update the screen
     1596                        drawStripToScreen(&_virtscr[kMainVirtScreen],0,640,0,480);
     1597                        _system->updateScreen();
     1598
     1599                        // Don't use 100% cpu time
     1600                        _system->delayMillis(17); // approx 60 fps
     1601                        parseEvents();
     1602                }
     1603
     1604                return Common::kNoError;
     1605        }
     1606        return ScummEngine_v99he::go();
     1607}
    15671608#endif
     1609#endif
    15681610
    15691611void ScummEngine::setupMusic(int midi) {
    15701612        int midiDriver = MidiDriver::detectMusicDriver(midi);