Ticket #8159: scummvm-ratio800-20030617.diff

File scummvm-ratio800-20030617.diff, 14.4 KB (added by SF/cigaes, 16 years ago)
  • backends/sdl/sdl-common.cpp

    RCS file: /cvsroot/scummvm/scummvm/backends/sdl/sdl-common.cpp,v
    retrieving revision 1.59
    diff -u -r1.59 sdl-common.cpp
     
    458458
    459459void OSystem_SDL_Common::warp_mouse(int x, int y) {
    460460        if (_mouseCurState.x != x || _mouseCurState.y != y) {
    461                 SDL_WarpMouse(x * _scaleFactor, y * _scaleFactor);
     461                SDL_WarpMouse(x * _scaleFactor_hmul / _scaleFactor_hdiv,
     462                        y * _scaleFactor_vmul / _scaleFactor_vdiv);
    462463
    463464                // SDL_WarpMouse() generates a mouse movement event, so
    464465                // set_mouse_pos() would be called eventually. However, the
     
    674675                        km.x = event->mouse.x = ev.motion.x;
    675676                        km.y = event->mouse.y = ev.motion.y;
    676677
    677                         event->mouse.x /= _scaleFactor;
    678                         event->mouse.y /= _scaleFactor;
     678                        event->mouse.x *= _scaleFactor_hdiv;
     679                        event->mouse.x /= _scaleFactor_hmul;
     680                        event->mouse.y *= _scaleFactor_vdiv;
     681                        event->mouse.y /= _scaleFactor_vmul;
    679682
    680683                        return true;
    681684
     
    694697                                break;
    695698                        km.x = event->mouse.x = ev.button.x;
    696699                        km.y = event->mouse.y = ev.button.y;
    697                         event->mouse.x /= _scaleFactor;
    698                         event->mouse.y /= _scaleFactor;
     700                        event->mouse.x *= _scaleFactor_hdiv;
     701                        event->mouse.x /= _scaleFactor_hmul;
     702                        event->mouse.y *= _scaleFactor_vdiv;
     703                        event->mouse.y /= _scaleFactor_vmul;
    699704
    700705                        return true;
    701706
     
    708713                                break;
    709714                        event->mouse.x = ev.button.x;
    710715                        event->mouse.y = ev.button.y;
    711                         event->mouse.x /= _scaleFactor;
    712                         event->mouse.y /= _scaleFactor;
     716                        event->mouse.x *= _scaleFactor_hdiv;
     717                        event->mouse.x /= _scaleFactor_hmul;
     718                        event->mouse.y *= _scaleFactor_vdiv;
     719                        event->mouse.y /= _scaleFactor_vmul;
    713720                        return true;
    714721
    715722                case SDL_JOYBUTTONDOWN:
     
    812819                        }
    813820                        event->mouse.x = km.x;
    814821                        event->mouse.y = km.y;
    815                         event->mouse.x /= _scaleFactor;
    816                         event->mouse.y /= _scaleFactor;
     822                        event->mouse.x *= _scaleFactor_hdiv;
     823                        event->mouse.x /= _scaleFactor_hmul;
     824                        event->mouse.y *= _scaleFactor_vdiv;
     825                        event->mouse.y /= _scaleFactor_vmul;
    817826                        return true;
    818827
    819828                case SDL_VIDEOEXPOSE:
  • backends/sdl/sdl-common.h

    RCS file: /cvsroot/scummvm/scummvm/backends/sdl/sdl-common.h,v
    retrieving revision 1.27
    diff -u -r1.27 sdl-common.h
     
    153153        };
    154154
    155155        bool _forceFull; // Force full redraw on next update_screen
    156         int _scaleFactor;
     156        int _scaleFactor_hmul;
     157        int _scaleFactor_hdiv;
     158        int _scaleFactor_vmul;
     159        int _scaleFactor_vdiv;
    157160        int _mode;
    158161        bool _full_screen;
    159162        uint32 _mode_flags;
  • backends/sdl/sdl.cpp

    RCS file: /cvsroot/scummvm/scummvm/backends/sdl/sdl.cpp,v
    retrieving revision 1.33
    diff -u -r1.33 sdl.cpp
     
    8484       
    8585        switch(_mode) {
    8686        case GFX_2XSAI:
    87                 _scaleFactor = 2;
     87                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     88                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    8889                _scaler_proc = _2xSaI;
    8990                break;
    9091        case GFX_SUPER2XSAI:
    91                 _scaleFactor = 2;
     92                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     93                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    9294                _scaler_proc = Super2xSaI;
    9395                break;
    9496        case GFX_SUPEREAGLE:
    95                 _scaleFactor = 2;
     97                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     98                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    9699                _scaler_proc = SuperEagle;
    97100                break;
    98101        case GFX_ADVMAME2X:
    99                 _scaleFactor = 2;
     102                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     103                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    100104                _scaler_proc = AdvMame2x;
    101105                break;
    102106        case GFX_ADVMAME3X:
    103                 _scaleFactor = 3;
     107                _scaleFactor_hmul = _scaleFactor_vmul = 3;
     108                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    104109                _scaler_proc = AdvMame3x;
    105110                break;
    106111        case GFX_TV2X:
    107                 _scaleFactor = 2;
     112                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     113                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    108114                _scaler_proc = TV2x;
    109115                break;
    110116        case GFX_DOTMATRIX:
    111                 _scaleFactor = 2;
     117                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     118                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    112119                _scaler_proc = DotMatrix;
    113120                break;
    114121
     122        case GFX_RATIO800:
     123                _scaleFactor_hmul = 5;
     124                _scaleFactor_hdiv = 2;
     125                _scaleFactor_vmul = 3;
     126                _scaleFactor_vdiv = 1;
     127                _scaler_proc = Ratio800;
     128                break;
     129
    115130        case GFX_DOUBLESIZE:
    116                 _scaleFactor = 2;
     131                _scaleFactor_hmul = _scaleFactor_vmul = 2;
     132                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    117133                _scaler_proc = Normal2x;
    118134                break;
    119135
     
    122138                        warning("full screen in useless in triplesize mode, reverting to normal mode");
    123139                        goto normal_mode;
    124140                }
    125                 _scaleFactor = 3;
     141                _scaleFactor_hmul = _scaleFactor_vmul = 3;
     142                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    126143                _scaler_proc = Normal3x;
    127144                break;
    128145
    129146        case GFX_NORMAL:
    130147normal_mode:;
    131                 _scaleFactor = 1;
     148                _scaleFactor_hmul = _scaleFactor_vmul = 1;
     149                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    132150                _scaler_proc = Normal1x;
    133151                break;
    134152        default:
    135153                error("unknown gfx mode");
    136                 _scaleFactor = 1;
     154                _scaleFactor_hmul = _scaleFactor_vmul = 1;
     155                _scaleFactor_hdiv = _scaleFactor_vdiv = 1;
    137156                _scaler_proc = NULL;
    138157        }
    139158
     
    147166        //
    148167        // Create the surface that contains the scaled graphics in 16 bit mode
    149168        //
    150         _hwscreen = SDL_SetVideoMode(_screenWidth * _scaleFactor, _screenHeight * _scaleFactor, 16,
     169        _hwscreen = SDL_SetVideoMode(_screenWidth * _scaleFactor_hmul / _scaleFactor_hdiv, _screenHeight * _scaleFactor_vmul / _scaleFactor_vdiv, 16,
    151170                _full_screen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE
    152171        );
    153172        if (_hwscreen == NULL)
     
    176195                error("_tmpscreen failed");
    177196
    178197        // keyboard cursor control, some other better place for it?
    179         km.x_max = _screenWidth * _scaleFactor - 1;
    180         km.y_max = _screenHeight * _scaleFactor - 1;
     198        km.x_max = _screenWidth * _scaleFactor_hmul / _scaleFactor_hdiv - 1;
     199        km.y_max = _screenHeight * _scaleFactor_vmul / _scaleFactor_vdiv - 1;
    181200        km.delay_time = 25;
    182201        km.last_time = 0;
    183202}
     
    240259
    241260        // If the shake position changed, fill the dirty area with blackness
    242261        if (_currentShakePos != _newShakePos) {
    243                 SDL_Rect blackrect = {0, 0, _screenWidth * _scaleFactor, _newShakePos * _scaleFactor};
     262                /* ratio: FIXME */
     263                SDL_Rect blackrect = {0, 0, _screenWidth * _scaleFactor_hmul / _scaleFactor_hdiv, _newShakePos * _scaleFactor_vmul / _scaleFactor_vdiv};
    244264                SDL_FillRect(_hwscreen, &blackrect, 0);
    245265
    246266                _currentShakePos = _newShakePos;
     
    307327
    308328                        SDL_LockSurface(_tmpscreen);
    309329                        SDL_LockSurface(_hwscreen);
    310 
     330               
    311331                        srcPitch = _tmpscreen->pitch;
    312332                        dstPitch = _hwscreen->pitch;
    313 
     333               
    314334                        for(r = _dirty_rect_list; r != last_rect; ++r) {
    315335                                register int dst_y = r->y + _currentShakePos;
    316336                                register int dst_h = 0;
     
    319339                                        if (dst_h > _screenHeight - dst_y)
    320340                                                dst_h = _screenHeight - dst_y;
    321341
    322                                                 dst_y *= _scaleFactor;
     342                                                dst_y *= _scaleFactor_vmul;
     343                                                dst_y /= _scaleFactor_vdiv;
    323344
    324345                                                _scaler_proc((byte *)_tmpscreen->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
    325                                                 (byte *)_hwscreen->pixels + r->x * 2 * _scaleFactor + dst_y * dstPitch, dstPitch, r->w, dst_h);
     346                                                (byte *)_hwscreen->pixels + (r->x * _scaleFactor_hmul / _scaleFactor_hdiv) * 2 + dst_y*dstPitch, dstPitch, r->x, r->y, r->w, dst_h);
    326347                                }
    327348                       
    328                                 r->x *= _scaleFactor;
     349                                r->w = (r->x + r->w) * _scaleFactor_hmul / _scaleFactor_hdiv;
     350                                r->x *= _scaleFactor_hmul;
     351                                r->x /= _scaleFactor_hdiv;
     352                                r->w -= r->x;
     353                                r->h = (r->y + r->h) * _scaleFactor_vmul / _scaleFactor_vdiv;
    329354                                r->y = dst_y;
    330                                 r->w *= _scaleFactor;
    331                                 r->h = dst_h * _scaleFactor;
     355                                r->h -= r->y;
    332356                        }
    333357
    334358                        SDL_UnlockSurface(_tmpscreen);
     
    339363                // This is necessary if shaking is active.
    340364                if (_forceFull) {
    341365                        _dirty_rect_list[0].y = 0;
    342                         _dirty_rect_list[0].h = _screenHeight * _scaleFactor;
     366                        _dirty_rect_list[0].h = _screenHeight * _scaleFactor_vmul / _scaleFactor_vdiv;
    343367                }
    344368
    345369                // Finally, blit all our changes to the screen
  • common/gameDetector.cpp

    RCS file: /cvsroot/scummvm/scummvm/common/gameDetector.cpp,v
    retrieving revision 1.110
    diff -u -r1.110 gameDetector.cpp
     
    5353        "\t-p<path>      - look for game in <path>\n"
    5454        "\t-x[<num>]     - load this savegame (default: 0 - autosave)\n"
    5555        "\t-f            - fullscreen mode\n"
    56         "\t-g<mode>      - graphics mode (normal,2x,3x,2xsai,super2xsai,supereagle,advmame2x,advmame3x,tv2x,dotmatrix)\n"
     56        "\t-g<mode>      - graphics mode (normal,2x,3x,2xsai,super2xsai,supereagle,advmame2x,advmame3x,tv2x,dotmatrix,ratio800)\n"
    5757        "\t-e<mode>      - set music engine (see README for details)\n"
    5858        "\t-a            - specify game is amiga version\n"
    5959        "\t-q<lang>      - specify language (en,de,fr,it,pt,es,jp,zh,kr,hb)\n"
     
    100100        {"advmame3x", "AdvMAME3x", GFX_ADVMAME3X},
    101101        {"tv2x", "TV2x", GFX_TV2X},
    102102        {"dotmatrix", "DotMatrix", GFX_DOTMATRIX},
     103        {"ratio800", "Ratio800", GFX_RATIO800},
    103104#else
    104105        {"flipping", "Page Flipping", GFX_FLIPPING},
    105106        {"dbuffer", "Double Buffer", GFX_DOUBLEBUFFER},
  • common/scaler.cpp

    RCS file: /cvsroot/scummvm/scummvm/common/scaler.cpp,v
    retrieving revision 1.21
    diff -u -r1.21 scaler.cpp
     
    106106        return x + y;
    107107}
    108108
    109 void Super2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     109void Super2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int x, int y, int width, int height) {
    110110        const uint16 *bP;
    111111        uint16 *dP;
    112112        const uint32 nextlineSrc = srcPitch >> 1;
     
    212212        }
    213213}
    214214
    215 void SuperEagle(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     215void SuperEagle(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int x, int y, int width, int height) {
    216216        const uint16 *bP;
    217217        uint16 *dP;
    218218        const uint32 nextlineSrc = srcPitch >> 1;
     
    317317        }
    318318}
    319319
    320 void _2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     320void _2xSaI(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int x, int y, int width, int height) {
    321321        const uint16 *bP;
    322322        uint16 *dP;
    323323        const uint32 nextlineSrc = srcPitch >> 1;
     
    451451}
    452452
    453453void AdvMame2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    454                                                          int width, int height) {
     454                                                         int x, int y, int width, int height) {
    455455        unsigned int nextlineSrc = srcPitch / sizeof(uint16);
    456456        const uint16 *p = (const uint16 *)srcPtr;
    457457
     
    487487}
    488488
    489489void AdvMame3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    490                                                          int width, int height) {
     490                                                         int x, int y, int width, int height) {
    491491        unsigned int nextlineSrc = srcPitch / sizeof(uint16);
    492492        const uint16 *p = (const uint16 *)srcPtr;
    493493
     
    528528}
    529529
    530530void Normal1x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    531                                                         int width, int height) {
     531                                                        int x, int y, int width, int height) {
    532532        while (height--) {
    533533                memcpy(dstPtr, srcPtr, 2 * width);
    534534                srcPtr += srcPitch;
     
    537537}
    538538
    539539void Normal2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    540                                                         int width, int height) {
     540                                                        int x, int y, int width, int height) {
    541541        uint8 *r;
    542542
    543543        while (height--) {
     
    556556}
    557557
    558558void Normal3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    559                                                         int width, int height) {
     559                                                        int x, int y, int width, int height) {
    560560        uint8 *r;
    561561        uint32 dstPitch2 = dstPitch * 2;
    562562        uint32 dstPitch3 = dstPitch * 3;
     
    582582}
    583583
    584584void TV2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    585                                         int width, int height) {
     585                                        int x, int y, int width, int height) {
    586586        unsigned int nextlineSrc = srcPitch / sizeof(uint16);
    587587        const uint16 *p = (const uint16 *)srcPtr;
    588588
     
    612612}
    613613
    614614void DotMatrix(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    615                                         int width, int height)
     615                                        int x, int y, int width, int height)
    616616{
    617617        unsigned int nextlineSrc = srcPitch / sizeof(uint16);
    618618        const uint16 *p = (const uint16 *)srcPtr;
     
    630630                }
    631631                p += nextlineSrc;
    632632                q += nextlineDst << 1;
     633        }
     634}
     635
     636void Ratio800(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
     637                                        int x, int y, int width, int height)
     638{
     639        unsigned int nextlineSrc = srcPitch / sizeof(uint16);
     640        uint16 *p = (uint16 *)srcPtr;
     641
     642        unsigned int nextlineDst = dstPitch / sizeof(uint16);
     643        uint16 *q0 = (uint16 *)dstPtr;
     644        uint16 *q;
     645
     646        int i, j;
     647        uint16 c;
     648
     649        for(i = 0; i < height; i++) {
     650            q = q0;
     651            for(j = 0; j < width; j++) {
     652                c = *p;
     653                if((j ^ x) & 1) {
     654                    q[0] = q[nextlineDst] = q[nextlineDst * 2] =
     655                        INTERPOLATE(c, p[-1]);
     656                    q++;
     657                }
     658                p++;
     659                q[0] = q[nextlineDst] = q[nextlineDst * 2] =
     660                q[1] = q[nextlineDst + 1] = q[nextlineDst * 2 + 1] =
     661                    c;
     662                q += 2;
     663            }
     664            p += nextlineSrc - width;
     665            q0 += nextlineDst * 3;
    633666        }
    634667}
  • common/scaler.h

    RCS file: /cvsroot/scummvm/scummvm/common/scaler.h,v
    retrieving revision 1.10
    diff -u -r1.10 scaler.h
     
    2424extern int Init_2xSaI (uint32 BitFormat);
    2525
    2626typedef void ScalerProc(const uint8 *srcPtr, uint32 srcPitch,
    27                                                         uint8 *dstPtr, uint32 dstPitch, int width, int height);
     27                                                        uint8 *dstPtr, uint32 dstPitch, int x, int y, int width, int height);
    2828
    2929#define DECLARE_SCALER(x)       \
    3030        extern void x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, \
    31                                         uint32 dstPitch, int width, int height)
     31                                        uint32 dstPitch, int x, int y, int width, int height)
    3232
    3333DECLARE_SCALER(_2xSaI);
    3434DECLARE_SCALER(Super2xSaI);
     
    4040DECLARE_SCALER(Normal3x);
    4141DECLARE_SCALER(TV2x);
    4242DECLARE_SCALER(DotMatrix);
     43DECLARE_SCALER(Ratio800);
    4344
    4445
    4546enum {
     
    5354        GFX_ADVMAME3X = 7,
    5455        GFX_TV2X = 8,
    5556        GFX_DOTMATRIX = 9,
     57        GFX_RATIO800 = 10,
    5658       
    5759        GFX_FLIPPING = 100,     // Palmos
    5860        GFX_DOUBLEBUFFER = 101, // Palmos