Ticket #8611: 32bit_try02.patch

File 32bit_try02.patch, 57.3 KB (added by DrMcCoy, 17 years ago)

2nd try

  • backends/platform/sdl/graphics.cpp

     
    145145bool OSystem_SDL::setGraphicsMode(int mode) {
    146146        Common::StackLock lock(_graphicsMutex);
    147147
     148        bool needHotSwap = false;
    148149        int newScaleFactor = 1;
    149150        ScalerProc *newScalerProc;
    150151
     
    211212        _transactionDetails.normal1xScaler = (mode == GFX_NORMAL);
    212213
    213214        _mode = mode;
     215
     216#ifndef DISABLE_HQ_SCALERS
     217        // Hotswapping (to change the color depth) when switching to and from
     218        // HQ-scalers. They use lookup-tables for color conversion and therefore
     219        // won't work for 32 bit graphics
     220        if (_scalerProc != newScalerProc) {
     221                if (((newScalerProc == HQ2x) || (newScalerProc == HQ3x)) &&
     222                                (_curBytesPerPixel == 4))
     223                        needHotSwap = true;
     224                if (((_scalerProc == HQ2x) || (_scalerProc == HQ3x)) &&
     225                                (_bytesPerPixel > 2))
     226                        needHotSwap = true;
     227        }
     228#endif
     229
    214230        _scalerProc = newScalerProc;
    215231
    216232        if (_transactionMode == kTransactionActive) {
     
    230246        // NOTE: This should not be executed at transaction commit
    231247        //   Otherwise there is some unsolicited setGraphicsMode() call
    232248        //   which should be properly removed
    233         if (newScaleFactor != _scaleFactor) {
     249        if ((newScaleFactor != _scaleFactor) || needHotSwap) {
    234250                assert(_transactionMode != kTransactionCommit);
    235251
    236252                _scaleFactor = newScaleFactor;
     
    337353                error("allocating _screen failed");
    338354
    339355        //
    340         // Create the surface that contains the scaled graphics in 16 bit mode
     356        // Check whether to use 32 or 16 bit colors
    341357        //
    342358
    343         _hwscreen = SDL_SetVideoMode(hwW, hwH, 16,
     359        // If a color depth of more than 16 bit is supported by the system,
     360        // use 32 bit. Don't, if a HQ-scaler is in use, though, because these
     361        // scalers use lookup-tables (RGBtoYUV and LUT16to32) for color conversion.
     362        if ((_bytesPerPixel > 2) && (_scalerProc != HQ2x) && (_scalerProc != HQ3x))
     363                _curBytesPerPixel = 4;
     364        else
     365                _curBytesPerPixel = 2;
     366
     367        //
     368        // Create the surface that contains the scaled graphics in 32/16 bit mode
     369        //
     370
     371        _hwscreen = SDL_SetVideoMode(hwW, hwH, _curBytesPerPixel * 8,
    344372                _fullscreen ? (SDL_FULLSCREEN|SDL_SWSURFACE) : SDL_SWSURFACE
    345373        );
    346374        if (_hwscreen == NULL) {
     
    368396        // Create the surface used for the graphics in 16 bit before scaling, and also the overlay
    369397        //
    370398
    371         // Distinguish 555 and 565 mode
    372         if (_hwscreen->format->Rmask == 0x7C00)
    373                 InitScalers(555);
    374         else
    375                 InitScalers(565);
     399        //
     400        if (_curBytesPerPixel == 2) {
     401                _Rmask = _hwscreen->format->Rmask;
     402                _Gmask = _hwscreen->format->Gmask;
     403                _Bmask = _hwscreen->format->Bmask;
     404                _Amask = _hwscreen->format->Amask;
     405                // Distinguish 555 and 565 mode
     406                if (_Rmask == 0x7C00)
     407                        InitScalers(555);
     408                else
     409                        InitScalers(565);
     410        } else {
     411                // Use 565 format for 16 bit surfaces when using a 32 bit _hwscreen
     412                _Rmask = 0xF800;
     413                _Gmask = 0x07E0;
     414                _Bmask = 0x001F;
     415                _Amask = 0x0000;
     416                InitScalers(8888);
     417        }
    376418
    377419        // Need some extra bytes around when using 2xSaI
    378420        _tmpscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _screenWidth + 3, _screenHeight + 3,
    379                                                 16,
     421                                                _curBytesPerPixel * 8,
    380422                                                _hwscreen->format->Rmask,
    381423                                                _hwscreen->format->Gmask,
    382424                                                _hwscreen->format->Bmask,
     
    386428                error("allocating _tmpscreen failed");
    387429
    388430        _overlayscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, _overlayWidth, _overlayHeight,
    389                                                 16,
    390                                                 _hwscreen->format->Rmask,
    391                                                 _hwscreen->format->Gmask,
    392                                                 _hwscreen->format->Bmask,
    393                                                 _hwscreen->format->Amask);
     431                                                16, _Rmask, _Gmask, _Bmask, _Amask);
    394432
    395433        if (_overlayscreen == NULL)
    396434                error("allocating _overlayscreen failed");
    397435
    398436        _tmpscreen2 = SDL_CreateRGBSurface(SDL_SWSURFACE, _overlayWidth + 3, _overlayHeight + 3,
    399                                                 16,
     437                                                16, _Rmask, _Gmask, _Bmask, _Amask);
     438
     439        if (_tmpscreen2 == NULL)
     440                error("allocating _tmpscreen2 failed");
     441
     442        _tmpscreen3 = SDL_CreateRGBSurface(SDL_SWSURFACE, _screenWidth + 3, _screenHeight + 3,
     443                                                16, _Rmask, _Gmask, _Bmask, _Amask);
     444
     445        if (_tmpscreen3 == NULL)
     446                error("allocating _tmpscreen3 failed");
     447
     448        _tmpscreen4 = SDL_CreateRGBSurface(SDL_SWSURFACE, _overlayWidth + 3, _overlayHeight + 3,
     449                                                _curBytesPerPixel * 8,
    400450                                                _hwscreen->format->Rmask,
    401451                                                _hwscreen->format->Gmask,
    402452                                                _hwscreen->format->Bmask,
    403453                                                _hwscreen->format->Amask);
    404454
    405         if (_tmpscreen2 == NULL)
    406                 error("allocating _tmpscreen2 failed");
     455        if (_tmpscreen4 == NULL)
     456                error("allocating _tmpscreen4 failed");
    407457
    408458#ifdef USE_OSD
    409459        _osdSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA,
    410460                                                _hwscreen->w,
    411461                                                _hwscreen->h,
    412                                                 16,
    413                                                 _hwscreen->format->Rmask,
    414                                                 _hwscreen->format->Gmask,
    415                                                 _hwscreen->format->Bmask,
    416                                                 _hwscreen->format->Amask);
     462                                                16, _Rmask, _Gmask, _Bmask, _Amask);
    417463        if (_osdSurface == NULL)
    418464                error("allocating _osdSurface failed");
    419465        SDL_SetColorKey(_osdSurface, SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA, kOSDColorKey);
     
    447493                _tmpscreen2 = NULL;
    448494        }
    449495
     496        if (_tmpscreen3) {
     497                SDL_FreeSurface(_tmpscreen3);
     498                _tmpscreen3 = NULL;
     499        }
     500
     501        if (_tmpscreen4) {
     502                SDL_FreeSurface(_tmpscreen4);
     503                _tmpscreen4 = NULL;
     504        }
     505
    450506        if (_overlayscreen) {
    451507                SDL_FreeSurface(_overlayscreen);
    452508                _overlayscreen = NULL;
     
    474530
    475531        SDL_FreeSurface(_tmpscreen);
    476532        SDL_FreeSurface(_tmpscreen2);
     533        SDL_FreeSurface(_tmpscreen3);
     534        SDL_FreeSurface(_tmpscreen4);
    477535
    478536#ifdef USE_OSD
    479537        // Release the OSD surface
     
    578636                scale1 = _scaleFactor;
    579637        } else {
    580638                origSurf = _overlayscreen;
    581                 srcSurf = _tmpscreen2;
     639                srcSurf = _tmpscreen4;
    582640                width = _overlayWidth;
    583641                height = _overlayHeight;
    584642                scalerProc = Normal1x;
     
    646704                                                dst_y = real2Aspect(dst_y);
    647705
    648706                                        assert(scalerProc != NULL);
    649                                         scalerProc((byte *)srcSurf->pixels + (r->x * 2 + 2) + (r->y + 1) * srcPitch, srcPitch,
    650                                                            (byte *)_hwscreen->pixels + rx1 * 2 + dst_y * dstPitch, dstPitch, r->w, dst_h);
     707                                        scalerProc((byte *)srcSurf->pixels +
     708                                                            (r->x * _curBytesPerPixel + _bytesPerPixel) +
     709                                                            (r->y + 1) * srcPitch, srcPitch,
     710                                                           (byte *)_hwscreen->pixels +
     711                                                            rx1 * _curBytesPerPixel +
     712                                                                dst_y * dstPitch, dstPitch,
     713                                                                r->w, dst_h, _curBytesPerPixel);
    651714                                }
    652715
    653716                                r->x = rx1;
     
    657720
    658721#ifndef DISABLE_SCALERS
    659722                                if (_adjustAspectRatio && orig_dst_y < height && !_overlayVisible)
    660                                         r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1);
     723                                        r->h = stretch200To240((uint8 *) _hwscreen->pixels, dstPitch, r->w, r->h, r->x, r->y, orig_dst_y * scale1, _curBytesPerPixel);
    661724#endif
    662725                        }
    663726                        SDL_UnlockSurface(srcSurf);
     
    11571220        dst.x = dst.y = 1;
    11581221        src.w = dst.w = _screenWidth;
    11591222        src.h = dst.h = _screenHeight;
    1160         if (SDL_BlitSurface(_screen, &src, _tmpscreen, &dst) != 0)
     1223        if (SDL_BlitSurface(_screen, &src, _tmpscreen3, &dst) != 0)
    11611224                error("SDL_BlitSurface failed: %s", SDL_GetError());
    11621225
    1163         SDL_LockSurface(_tmpscreen);
     1226        SDL_LockSurface(_tmpscreen3);
    11641227        SDL_LockSurface(_overlayscreen);
    1165         _scalerProc((byte *)(_tmpscreen->pixels) + _tmpscreen->pitch + 2, _tmpscreen->pitch,
     1228        _scalerProc((byte *)(_tmpscreen3->pixels) + _tmpscreen3->pitch + 2, _tmpscreen3->pitch,
    11661229        (byte *)_overlayscreen->pixels, _overlayscreen->pitch, _screenWidth, _screenHeight);
    11671230
    11681231#ifndef DISABLE_SCALERS
    11691232        if (_adjustAspectRatio)
    11701233                stretch200To240((uint8 *)_overlayscreen->pixels, _overlayscreen->pitch,
    1171                                                 _overlayWidth, _screenHeight * _scaleFactor, 0, 0, 0);
     1234                                                _overlayWidth, _screenHeight * _scaleFactor, 0, 0, 0, 2);
    11721235#endif
    1173         SDL_UnlockSurface(_tmpscreen);
     1236        SDL_UnlockSurface(_tmpscreen3);
    11741237        SDL_UnlockSurface(_overlayscreen);
    11751238
    11761239        _forceFull = true;
     
    13171380                _mouseOrigSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA,
    13181381                                                _mouseCurState.w + 2,
    13191382                                                _mouseCurState.h + 2,
    1320                                                 16,
    1321                                                 _hwscreen->format->Rmask,
    1322                                                 _hwscreen->format->Gmask,
    1323                                                 _hwscreen->format->Bmask,
    1324                                                 _hwscreen->format->Amask);
     1383                                                16, _Rmask, _Gmask, _Bmask, _Amask);
    13251384
    13261385                if (_mouseOrigSurface == NULL)
    13271386                        error("allocating _mouseOrigSurface failed");
     
    14381497                _mouseSurface = SDL_CreateRGBSurface(SDL_SWSURFACE | SDL_RLEACCEL | SDL_SRCCOLORKEY | SDL_SRCALPHA,
    14391498                                                _mouseCurState.rW,
    14401499                                                _mouseCurState.rH,
    1441                                                 16,
    1442                                                 _hwscreen->format->Rmask,
    1443                                                 _hwscreen->format->Gmask,
    1444                                                 _hwscreen->format->Bmask,
    1445                                                 _hwscreen->format->Amask);
     1500                                                16, _Rmask, _Gmask, _Bmask, _Amask);
    14461501
    14471502                if (_mouseSurface == NULL)
    14481503                        error("allocating _mouseSurface failed");
  • backends/platform/sdl/sdl.cpp

     
    142142                error("Could not initialize SDL: %s", SDL_GetError());
    143143        }
    144144
     145        _bytesPerPixel = SDL_GetVideoInfo()->vfmt->BytesPerPixel;
    145146        _graphicsMutex = createMutex();
    146147
    147148        SDL_ShowCursor(SDL_DISABLE);
  • backends/platform/sdl/sdl-common.h

     
    221221        // temporary screen (for scalers)
    222222        SDL_Surface *_tmpscreen;
    223223        SDL_Surface *_tmpscreen2;
     224        SDL_Surface *_tmpscreen3;
     225        SDL_Surface *_tmpscreen4;
    224226
    225227        // overlay
    226228        SDL_Surface *_overlayscreen;
    227229        int _overlayWidth, _overlayHeight;
    228230        bool _overlayVisible;
    229231
     232        // color depth
     233        uint8 _bytesPerPixel;
     234        uint8 _curBytesPerPixel;
     235        uint32 _Rmask;
     236        uint32 _Gmask;
     237        uint32 _Bmask;
     238        uint32 _Amask;
     239
    230240        // Audio
    231241        int _samplesPerSec;
    232242
  • graphics/scaler.cpp

     
    107107                InitLUT<ColorMasks<555> >();
    108108        if (gBitFormat == 565)
    109109                InitLUT<ColorMasks<565> >();
     110        // Use 565-format for 16 bit surfaces in 32 bit mode
     111        if (gBitFormat == 8888)
     112                InitLUT<ColorMasks<565> >();
    110113#endif
    111114}
    112115
     
    116119 * source to the destionation.
    117120 */
    118121void Normal1x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    119                                                         int width, int height) {
     122                                                        int width, int height, uint8 bytesPerPixel) {
    120123        while (height--) {
    121                 memcpy(dstPtr, srcPtr, 2 * width);
     124                memcpy(dstPtr, srcPtr, bytesPerPixel * width);
    122125                srcPtr += srcPitch;
    123126                dstPtr += dstPitch;
    124127        }
     
    129132 * Trivial nearest-neighbour 2x scaler.
    130133 */
    131134void Normal2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    132                                                         int width, int height) {
     135                                                        int width, int height, uint8 bytesPerPixel) {
    133136        uint8 *r;
     137        const uint8 *s;
    134138
    135139        assert(((long)dstPtr & 3) == 0);
     140        width *= bytesPerPixel;
    136141        while (height--) {
    137142                r = dstPtr;
    138                 for (int i = 0; i < width; ++i, r += 4) {
    139                         uint32 color = *(((const uint16 *)srcPtr) + i);
    140 
    141                         color |= color << 16;
    142 
    143                         *(uint32 *)(r) = color;
    144                         *(uint32 *)(r + dstPitch) = color;
     143                for (int i = 0; i < width; i += bytesPerPixel, r += (bytesPerPixel * 2)) {
     144                        s = srcPtr + i;
     145                        memcpy(r, s, bytesPerPixel);
     146                        memcpy(r + bytesPerPixel, s, bytesPerPixel);
     147                        memcpy(r + dstPitch, s, bytesPerPixel);
     148                        memcpy(r + dstPitch + bytesPerPixel, s, bytesPerPixel);
    145149                }
    146150                srcPtr += srcPitch;
    147151                dstPtr += dstPitch << 1;
     
    152156 * Trivial nearest-neighbour 3x scaler.
    153157 */
    154158void Normal3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    155                                                         int width, int height) {
     159                                                        int width, int height, uint8 bytesPerPixel) {
    156160        uint8 *r;
     161        const uint8 *s;
    157162        const uint32 dstPitch2 = dstPitch * 2;
    158163        const uint32 dstPitch3 = dstPitch * 3;
    159164
    160165        assert(((long)dstPtr & 1) == 0);
     166        width *= bytesPerPixel;
    161167        while (height--) {
    162168                r = dstPtr;
    163                 for (int i = 0; i < width; ++i, r += 6) {
    164                         uint16 color = *(((const uint16 *)srcPtr) + i);
    165 
    166                         *(uint16 *)(r + 0) = color;
    167                         *(uint16 *)(r + 2) = color;
    168                         *(uint16 *)(r + 4) = color;
    169                         *(uint16 *)(r + 0 + dstPitch) = color;
    170                         *(uint16 *)(r + 2 + dstPitch) = color;
    171                         *(uint16 *)(r + 4 + dstPitch) = color;
    172                         *(uint16 *)(r + 0 + dstPitch2) = color;
    173                         *(uint16 *)(r + 2 + dstPitch2) = color;
    174                         *(uint16 *)(r + 4 + dstPitch2) = color;
     169                for (int i = 0; i < width; i += bytesPerPixel, r += (bytesPerPixel * 3)) {
     170                        s = srcPtr + i;
     171                        memcpy(r, s, bytesPerPixel);
     172                        memcpy(r + bytesPerPixel, s, bytesPerPixel);
     173                        memcpy(r + bytesPerPixel * 2, s, bytesPerPixel);
     174                        memcpy(r + dstPitch, s, bytesPerPixel);
     175                        memcpy(r + dstPitch + bytesPerPixel, s, bytesPerPixel);
     176                        memcpy(r + dstPitch + bytesPerPixel * 2, s, bytesPerPixel);
     177                        memcpy(r + dstPitch2, s, bytesPerPixel);
     178                        memcpy(r + dstPitch2 + bytesPerPixel, s, bytesPerPixel);
     179                        memcpy(r + dstPitch2 + bytesPerPixel * 2, s, bytesPerPixel);
    175180                }
    176181                srcPtr += srcPitch;
    177182                dstPtr += dstPitch3;
    178183        }
    179184}
    180185
    181 #define interpolate32_1_1               interpolate32_1_1<bitFormat>
    182 #define interpolate32_1_1_1_1   interpolate32_1_1_1_1<bitFormat>
     186#define interpolate_1_1         interpolate_1_1<bitFormat>
     187#define interpolate_1_1_1_1     interpolate_1_1_1_1<bitFormat>
    183188
    184189/**
    185190 * Trivial nearest-neighbour 1.5x scaler.
    186191 */
    187 template<int bitFormat>
    188 void Normal1o5xTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
     192template<int bitFormat, typename T>
     193void Normal1o5xTemplate(const T *srcPtr, uint32 srcPitch, T *dstPtr, uint32 dstPitch,
    189194                                                        int width, int height) {
    190         uint8 *r;
     195        dstPitch /= sizeof(T);
     196        srcPitch /= sizeof(T);
     197
     198        T *r;
    191199        const uint32 dstPitch2 = dstPitch * 2;
    192200        const uint32 dstPitch3 = dstPitch * 3;
    193201        const uint32 srcPitch2 = srcPitch * 2;
     
    195203        assert(((long)dstPtr & 1) == 0);
    196204        while (height > 0) {
    197205                r = dstPtr;
    198                 for (int i = 0; i < width; i += 2, r += 6) {
    199                         uint16 color0 = *(((const uint16 *)srcPtr) + i);
    200                         uint16 color1 = *(((const uint16 *)srcPtr) + i + 1);
    201                         uint16 color2 = *(((const uint16 *)(srcPtr + srcPitch)) + i);
    202                         uint16 color3 = *(((const uint16 *)(srcPtr + srcPitch)) + i + 1);
     206                for (int i = 0; i < width; i += 2, r += 3) {
     207                        T color0 = *(srcPtr + i);
     208                        T color1 = *(srcPtr + i + 1);
     209                        T color2 = *(srcPtr + srcPitch + i);
     210                        T color3 = *(srcPtr + srcPitch + i + 1);
    203211
    204                         *(uint16 *)(r + 0) = color0;
    205                         *(uint16 *)(r + 2) = interpolate32_1_1(color0, color1);
    206                         *(uint16 *)(r + 4) = color1;
    207                         *(uint16 *)(r + 0 + dstPitch) = interpolate32_1_1(color0, color2);
    208                         *(uint16 *)(r + 2 + dstPitch) = interpolate32_1_1_1_1(color0, color1, color2, color3);
    209                         *(uint16 *)(r + 4 + dstPitch) = interpolate32_1_1(color1, color3);
    210                         *(uint16 *)(r + 0 + dstPitch2) = color2;
    211                         *(uint16 *)(r + 2 + dstPitch2) = interpolate32_1_1(color2, color3);
    212                         *(uint16 *)(r + 4 + dstPitch2) = color3;
     212                        *(r + 0) = color0;
     213                        *(r + 1) = interpolate_1_1(color0, color1);
     214                        *(r + 2) = color1;
     215                        *(r + 0 + dstPitch) = interpolate_1_1(color0, color2);
     216                        *(r + 1 + dstPitch) = interpolate_1_1_1_1(color0, color1, color2, color3);
     217                        *(r + 2 + dstPitch) = interpolate_1_1(color1, color3);
     218                        *(r + 0 + dstPitch2) = color2;
     219                        *(r + 1 + dstPitch2) = interpolate_1_1(color2, color3);
     220                        *(r + 2 + dstPitch2) = color3;
    213221                }
    214222                srcPtr += srcPitch2;
    215223                dstPtr += dstPitch3;
     
    223231 * See also http://scale2x.sourceforge.net
    224232 */
    225233void AdvMame2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    226                                                          int width, int height) {
    227         scale(2, dstPtr, dstPitch, srcPtr - srcPitch, srcPitch, 2, width, height);
     234                                                         int width, int height, uint8 bytesPerPixel) {
     235        scale(2, dstPtr, dstPitch, srcPtr - srcPitch, srcPitch, bytesPerPixel, width, height);
    228236}
    229237
    230238/**
     
    232240 * See also http://scale2x.sourceforge.net
    233241 */
    234242void AdvMame3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    235                                                          int width, int height) {
    236         scale(3, dstPtr, dstPitch, srcPtr - srcPitch, srcPitch, 2, width, height);
     243                                                         int width, int height, uint8 bytesPerPixel) {
     244        scale(3, dstPtr, dstPitch, srcPtr - srcPitch, srcPitch, bytesPerPixel, width, height);
    237245}
    238246
    239 template<int bitFormat>
    240 void TV2xTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
     247template<int bitFormat, typename T>
     248void TV2xTemplate(const T *srcPtr, uint32 srcPitch, T *dstPtr, uint32 dstPitch,
    241249                                        int width, int height) {
    242         const uint32 nextlineSrc = srcPitch / sizeof(uint16);
    243         const uint16 *p = (const uint16 *)srcPtr;
     250        dstPitch /= sizeof(T);
     251        srcPitch /= sizeof(T);
    244252
    245         const uint32 nextlineDst = dstPitch / sizeof(uint16);
    246         uint16 *q = (uint16 *)dstPtr;
    247 
    248253        while (height--) {
    249254                for (int i = 0, j = 0; i < width; ++i, j += 2) {
    250                         uint16 p1 = *(p + i);
     255                        T p1 = *(srcPtr + i);
    251256                        uint32 pi;
    252257
    253258                        pi = (((p1 & redblueMask) * 7) >> 3) & redblueMask;
    254259                        pi |= (((p1 & greenMask) * 7) >> 3) & greenMask;
    255260
    256                         *(q + j) = p1;
    257                         *(q + j + 1) = p1;
    258                         *(q + j + nextlineDst) = (uint16)pi;
    259                         *(q + j + nextlineDst + 1) = (uint16)pi;
     261                        *(dstPtr + j) = p1;
     262                        *(dstPtr + j + 1) = p1;
     263                        *(dstPtr + j + dstPitch) = (T)pi;
     264                        *(dstPtr + j + dstPitch + 1) = (T)pi;
    260265                }
    261                 p += nextlineSrc;
    262                 q += nextlineDst << 1;
     266                srcPtr += srcPitch;
     267                dstPtr += dstPitch << 1;
    263268        }
    264269}
    265270MAKE_WRAPPER(TV2x)
     
    277282        0x1CE7, 0x0000, 0x1CE7, 0x0000
    278283};
    279284
    280 static inline uint16 DOT_16(const uint16 *dotmatrix, uint16 c, int j, int i) {
     285static const uint32 dotmatrix_8888[16] = {
     286        0x00003F00, 0x0000003F, 0x001F0000, 0x00000000,
     287        0x001F3F3F, 0x00000000, 0x001F3F3F, 0x00000000,
     288        0x001F0000, 0x00000000, 0x00003F00, 0x0000003F,
     289        0x001F3F3F, 0x00000000, 0x001F3F3F, 0x00000000
     290};
     291
     292template<typename T>
     293static inline T DOT(const T *dotmatrix, T c, int j, int i) {
    281294        return c - ((c >> 2) & *(dotmatrix + ((j & 3) << 2) + (i & 3)));
    282295}
    283296
     
    287300// a way that also works together with aspect-ratio correction is left as an
    288301// exercise for the reader.)
    289302
     303template<typename T>
     304void DotMatrix(const T *srcPtr, uint32 srcPitch, T *dstPtr, uint32 dstPitch,
     305                                        int width, int height, const T *dotmatrix) {
     306        dstPitch /= sizeof(T);
     307        srcPitch /= sizeof(T);
     308
     309        for (int j = 0, jj = 0; j < height; ++j, jj += 2) {
     310                for (int i = 0, ii = 0; i < width; ++i, ii += 2) {
     311                        T c = *(srcPtr + i);
     312                        *(dstPtr + ii) = DOT(dotmatrix, c, jj, ii);
     313                        *(dstPtr + ii + 1) = DOT(dotmatrix, c, jj, ii + 1);
     314                        *(dstPtr + ii + dstPitch) = DOT(dotmatrix, c, jj + 1, ii);
     315                        *(dstPtr + ii + dstPitch + 1) = DOT(dotmatrix, c, jj + 1, ii + 1);
     316                }
     317                srcPtr += srcPitch;
     318                dstPtr += dstPitch << 1;
     319        }
     320}
     321
    290322void DotMatrix(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch,
    291                                         int width, int height) {
    292 
    293         const uint16 *dotmatrix;
     323                                        int width, int height, uint8 bytesPerPixel) {
    294324        if (gBitFormat == 565) {
    295                 dotmatrix = dotmatrix_565;
     325                DotMatrix((uint16*) srcPtr, srcPitch, (uint16*) dstPtr, dstPitch, width, height, dotmatrix_565);
    296326        } else if (gBitFormat == 555) {
    297                 dotmatrix = dotmatrix_555;
     327                DotMatrix((uint16*) srcPtr, srcPitch, (uint16*) dstPtr, dstPitch, width, height, dotmatrix_555);
     328        } else if (gBitFormat == 8888) {
     329                if (bytesPerPixel == 4)
     330                        DotMatrix((uint32*) srcPtr, srcPitch, (uint32*) dstPtr, dstPitch, width, height, dotmatrix_8888);
     331                else
     332                        DotMatrix((uint16*) srcPtr, srcPitch, (uint16*) dstPtr, dstPitch, width, height, dotmatrix_565);
    298333        } else {
    299334                error("Unknown bit format %d", gBitFormat);
    300335        }
    301 
    302         const uint32 nextlineSrc = srcPitch / sizeof(uint16);
    303         const uint16 *p = (const uint16 *)srcPtr;
    304 
    305         const uint32 nextlineDst = dstPitch / sizeof(uint16);
    306         uint16 *q = (uint16 *)dstPtr;
    307 
    308         for (int j = 0, jj = 0; j < height; ++j, jj += 2) {
    309                 for (int i = 0, ii = 0; i < width; ++i, ii += 2) {
    310                         uint16 c = *(p + i);
    311                         *(q + ii) = DOT_16(dotmatrix, c, jj, ii);
    312                         *(q + ii + 1) = DOT_16(dotmatrix, c, jj, ii + 1);
    313                         *(q + ii + nextlineDst) = DOT_16(dotmatrix, c, jj + 1, ii);
    314                         *(q + ii + nextlineDst + 1) = DOT_16(dotmatrix, c, jj + 1, ii + 1);
    315                 }
    316                 p += nextlineSrc;
    317                 q += nextlineDst << 1;
    318         }
    319336}
    320337
    321338#endif
  • graphics/scaler.h

     
    2929extern void InitScalers(uint32 BitFormat);
    3030
    3131typedef void ScalerProc(const uint8 *srcPtr, uint32 srcPitch,
    32                                                         uint8 *dstPtr, uint32 dstPitch, int width, int height);
     32                                                        uint8 *dstPtr, uint32 dstPitch, int width, int height, uint8 bytesPerPixel = 2);
    3333
    3434#define DECLARE_SCALER(x)       \
    3535        extern void x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, \
    36                                         uint32 dstPitch, int width, int height)
     36                                        uint32 dstPitch, int width, int height, uint8 bytesPerPixel = 2)
    3737
    3838DECLARE_SCALER(_2xSaI);
    3939DECLARE_SCALER(Super2xSaI);
     
    6262
    6363extern void makeRectStretchable(int &x, int &y, int &w, int &h);
    6464
    65 extern int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY);
     65extern int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY, uint8 bytesPerPixel = 2);
    6666
    6767// creates a 160x100 thumbnail for 320x200 games
    6868// and 160x120 thumbnail for 320x240 and 640x480 games
  • graphics/colormasks.h

     
    6363template<>
    6464struct ColorMasks<565> {
    6565        enum {
    66                 highBits    = 0xF7DEF7DE,
    67                 lowBits     = 0x08210821,
    68                 qhighBits   = 0xE79CE79C,
    69                 qlowBits    = 0x18631863,
     66                highBits    = 0xF7DE,
     67                lowBits     = 0x0821,
     68                qhighBits   = 0xE79C,
     69                qlowBits    = 0x1863,
     70                phighBits   = 0xF7DEF7DE,
     71                plowBits    = 0x08210821,
     72                pqhighBits  = 0xE79CE79C,
     73                pqlowBits   = 0x18631863,
    7074
    7175
    7276                kBytesPerPixel = 2,
     
    9498template<>
    9599struct ColorMasks<555> {
    96100        enum {
    97                 highBits    = 0x7BDE7BDE,
    98                 lowBits     = 0x04210421,
    99                 qhighBits   = 0x739C739C,
    100                 qlowBits    = 0x0C630C63,
     101                highBits    = 0x7BDE,
     102                lowBits     = 0x0421,
     103                qhighBits   = 0x739C,
     104                qlowBits    = 0x0C63,
     105                phighBits   = 0x7BDE7BDE,
     106                plowBits    = 0x04210421,
     107                pqhighBits  = 0x739C739C,
     108                pqlowBits   = 0x0C630C63,
    101109
    102110
    103111                kBytesPerPixel = 2,
     
    172180template<>
    173181struct ColorMasks<888> {
    174182        enum {
     183                highBits    = 0x00FEFEFE,
     184                lowBits     = 0x00010101,
     185                qhighBits   = 0x00FCFCFC,
     186                qlowBits    = 0x00030303,
    175187                kBytesPerPixel = 4,
    176188
    177189                kAlphaBits  = 0,
     
    196208template<>
    197209struct ColorMasks<8888> {
    198210        enum {
     211                highBits    = 0xFEFEFEFE,
     212                lowBits     = 0x01010101,
     213                qhighBits   = 0xFCFCFCFC,
     214                qlowBits    = 0x03030303,
    199215                kBytesPerPixel = 4,
    200216
    201217                kAlphaBits  = 8,
  • graphics/scaler/intern.h

     
    2929#include "graphics/colormasks.h"
    3030
    3131
    32 #define highBits        ColorMasks<bitFormat>::highBits
    33 #define lowBits         ColorMasks<bitFormat>::lowBits
    34 #define qhighBits       ColorMasks<bitFormat>::qhighBits
    35 #define qlowBits        ColorMasks<bitFormat>::qlowBits
    36 #define redblueMask     ColorMasks<bitFormat>::kRedBlueMask
    37 #define greenMask       ColorMasks<bitFormat>::kGreenMask
     32#define highBits     ColorMasks<bitFormat>::highBits
     33#define lowBits      ColorMasks<bitFormat>::lowBits
     34#define qhighBits    ColorMasks<bitFormat>::qhighBits
     35#define qlowBits     ColorMasks<bitFormat>::qlowBits
     36#define phighBits    ColorMasks<bitFormat>::phighBits
     37#define plowBits     ColorMasks<bitFormat>::plowBits
     38#define pqhighBits   ColorMasks<bitFormat>::pqhighBits
     39#define pqlowBits    ColorMasks<bitFormat>::pqlowBits
     40#define redblueMask  ColorMasks<bitFormat>::kRedBlueMask
     41#define greenMask    ColorMasks<bitFormat>::kGreenMask
    3842
    39 
    4043/**
    41  * Interpolate two 16 bit pixel *pairs* at once with equal weights 1.
    42  * In particular, A and B can contain two pixels/each in the upper
    43  * and lower halves.
     44 * Interpolate two pixels with equal weights 1.
    4445 */
    4546template<int bitFormat>
    46 static inline uint32 interpolate32_1_1(uint32 A, uint32 B) {
     47static inline uint32 interpolate_1_1(uint32 A, uint32 B) {
    4748        return (((A & highBits) >> 1) + ((B & highBits) >> 1) + (A & B & lowBits));
    4849}
    4950
    5051/**
    51  * Interpolate two 16 bit pixel *pairs* at once with weights 3 resp. 1.
    52  * In particular, A and B can contain two pixels/each in the upper
    53  * and lower halves.
     52 * Interpolate two 16 bit pixels *pairs* with equal weights 1.
    5453 */
    5554template<int bitFormat>
    56 static inline uint32 interpolate32_3_1(uint32 A, uint32 B) {
     55static inline uint32 interpolate16p_1_1(uint32 A, uint32 B) {
     56        return (((A & phighBits) >> 1) + ((B & phighBits) >> 1) + (A & B & plowBits));
     57}
     58
     59
     60/**
     61 * Interpolate two pixels with weights 3 resp. 1.
     62 */
     63template<int bitFormat>
     64static inline uint32 interpolate_3_1(uint32 A, uint32 B) {
    5765        register uint32 x = ((A & qhighBits) >> 2) * 3 + ((B & qhighBits) >> 2);
    5866        register uint32 y = ((A & qlowBits) * 3 + (B & qlowBits)) >> 2;
    5967
     
    6270}
    6371
    6472/**
    65  * Interpolate four 16 bit pixel pairs at once with equal weights 1.
    66  * In particular, A and B can contain two pixels/each in the upper
    67  * and lower halves.
     73 * Interpolate two 16 bit pixels *pairs* with weights 3 resp. 1.
    6874 */
    6975template<int bitFormat>
    70 static inline uint32 interpolate32_1_1_1_1(uint32 A, uint32 B, uint32 C, uint32 D) {
     76static inline uint32 interpolate16p_3_1(uint32 A, uint32 B) {
     77        register uint32 x = ((A & pqhighBits) >> 2) * 3 + ((B & pqhighBits) >> 2);
     78        register uint32 y = ((A & pqlowBits) * 3 + (B & pqlowBits)) >> 2;
     79
     80        y &= pqlowBits;
     81        return x + y;
     82}
     83
     84/**
     85 * Interpolate four pixels with equal weights 1.
     86 */
     87template<int bitFormat>
     88static inline uint32 interpolate_1_1_1_1(uint32 A, uint32 B, uint32 C, uint32 D) {
    7189        register uint32 x = ((A & qhighBits) >> 2) + ((B & qhighBits) >> 2) + ((C & qhighBits) >> 2) + ((D & qhighBits) >> 2);
    7290        register uint32 y = ((A & qlowBits) + (B & qlowBits) + (C & qlowBits) + (D & qlowBits)) >> 2;
    7391
     
    7795
    7896
    7997/**
    80  * Interpolate two 16 bit pixels with the weights specified in the template
     98 * Interpolate two pixels with the weights specified in the template
    8199 * parameters. Used by the hq scaler family.
    82100 * @note w1 and w2 must sum up to 2, 4, 8 or 16.
    83101 */
    84102template<int bitFormat, int w1, int w2>
    85 static inline uint16 interpolate16_2(uint16 p1, uint16 p2) {
     103static inline uint32 interpolate_2(uint32 p1, uint32 p2) {
    86104        return ((((p1 & redblueMask) * w1 + (p2 & redblueMask) * w2) / (w1 + w2)) & redblueMask) |
    87105               ((((p1 & greenMask) * w1 + (p2 & greenMask) * w2) / (w1 + w2)) & greenMask);
    88106}
    89107
     108
    90109/**
    91  * Interpolate three 16 bit pixels with the weights specified in the template
     110 * Interpolate three pixels with the weights specified in the template
    92111 * parameters. Used by the hq scaler family.
    93112 * @note w1, w2 and w3 must sum up to 2, 4, 8 or 16.
    94113 */
    95114template<int bitFormat, int w1, int w2, int w3>
    96 static inline uint16 interpolate16_3(uint16 p1, uint16 p2, uint16 p3) {
     115static inline uint32 interpolate_3(uint32 p1, uint32 p2, uint32 p3) {
    97116        return ((((p1 & redblueMask) * w1 + (p2 & redblueMask) * w2 + (p3 & redblueMask) * w3) / (w1 + w2 + w3)) & redblueMask) |
    98117                   ((((p1 & greenMask) * w1 + (p2 & greenMask) * w2 + (p3 & greenMask) * w3) / (w1 + w2 + w3)) & greenMask);
    99118}
     
    146165
    147166/** Auxiliary macro to simplify creating those template function wrappers. */
    148167#define MAKE_WRAPPER(FUNC) \
    149         void FUNC(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) { \
    150                 if (gBitFormat == 565) \
    151                         FUNC ## Template<565>(srcPtr, srcPitch, dstPtr, dstPitch, width, height); \
     168        void FUNC(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, uint8 bytesPerPixel) { \
     169                if (gBitFormat == 8888) { \
     170                        if (bytesPerPixel == 4) \
     171                                FUNC ## Template<8888>((uint32*) srcPtr, srcPitch, (uint32*) dstPtr, dstPitch, width, height); \
     172                        else \
     173                                FUNC ## Template<565>((uint16*) srcPtr, srcPitch, (uint16*) dstPtr, dstPitch, width, height); \
     174                } \
     175                else if (gBitFormat == 565) \
     176                        FUNC ## Template<565>((uint16*) srcPtr, srcPitch, (uint16*) dstPtr, dstPitch, width, height); \
    152177                else \
    153                         FUNC ## Template<555>(srcPtr, srcPitch, dstPtr, dstPitch, width, height); \
     178                        FUNC ## Template<555>((uint16*) srcPtr, srcPitch, (uint16*) dstPtr, dstPitch, width, height); \
    154179        }
    155180
    156 /** Specifies the currently active 16bit pixel format, 555 or 565. */
     181
     182/** Specifies the currently active pixel format, 555, 565 or 8888. */
    157183extern int gBitFormat;
    158184
    159185#endif
  • graphics/scaler/aspect.cpp

     
    2424#include "graphics/scaler/intern.h"
    2525#include "graphics/scaler.h"
    2626
     27#define highBits            ColorMasks<bitFormat>::highBits
     28#define lowBits             ColorMasks<bitFormat>::lowBits
     29#define qhighBits           ColorMasks<bitFormat>::qhighBits
     30#define qlowBits            ColorMasks<bitFormat>::qlowBits
     31#define interpolate_1_1     interpolate_1_1<bitFormat>
     32#define interpolate_3_1     interpolate_3_1<bitFormat>
     33#define interpolate16p_1_1  interpolate16p_1_1<bitFormat>
     34#define interpolate16p_3_1  interpolate16p_3_1<bitFormat>
    2735
    28 #define kVeryFastAndUglyAspectMode      0       // No interpolation at all, but super-fast
    29 #define kFastAndNiceAspectMode          1       // Quite good quality with good speed
    30 #define kSlowAndPerfectAspectMode       2       // Accurate but slow code
    31 
    32 #define ASPECT_MODE     kFastAndNiceAspectMode
    33 
    34 
    35 #if ASPECT_MODE == kSlowAndPerfectAspectMode
    36 
    3736template<int bitFormat, int scale>
    38 static inline uint16 interpolate5(uint16 A, uint16 B) {
    39         uint16 r = (uint16)(((A & redblueMask & 0xFF00) * scale + (B & redblueMask & 0xFF00) * (5 - scale)) / 5);
    40         uint16 g = (uint16)(((A & greenMask) * scale + (B & greenMask) * (5 - scale)) / 5);
    41         uint16 b = (uint16)(((A & redblueMask & 0x00FF) * scale + (B & redblueMask & 0x00FF) * (5 - scale)) / 5);
    42 
    43         return (uint16)((r & redblueMask & 0xFF00) | (g & greenMask) | (b & redblueMask & 0x00FF));
    44 }
    45 
    46 
    47 template<int bitFormat, int scale>
    4837static inline void interpolate5Line(uint16 *dst, const uint16 *srcA, const uint16 *srcB, int width) {
    49         // Accurate but slightly slower code
    50         while (width--) {
    51                 *dst++ = interpolate5<bitFormat, scale>(*srcA++, *srcB++);
    52         }
    53 }
    54 #endif
    55 
    56 #if ASPECT_MODE == kFastAndNiceAspectMode
    57 
    58 template<int bitFormat, int scale>
    59 static inline void interpolate5Line(uint16 *dst, const uint16 *srcA, const uint16 *srcB, int width) {
    6038        // For efficiency reasons we blit two pixels at a time, so it is important
    6139        // that makeRectStretchable() guarantees that the width is even and that
    6240        // the rect starts on a well-aligned address. (Even where unaligned memory
     
    7048        //assert(((int)srcB & 3) == 0);
    7149        //assert((width & 1) == 0);
    7250
    73         width /= 2;
    7451        const uint32 *sA = (const uint32 *)srcA;
    7552        const uint32 *sB = (const uint32 *)srcB;
    7653        uint32 *d = (uint32 *)dst;
     54
     55        width /= 2;
    7756        if (scale == 1) {
    78                 while (width--) {
    79                         *d++ = interpolate32_3_1<bitFormat>(*sB++, *sA++);
    80                 }
     57                while (width--)
     58                        *d++ = interpolate16p_3_1(*sB++, *sA++);
    8159        } else {
    82                 while (width--) {
    83                         *d++ = interpolate32_1_1<bitFormat>(*sB++, *sA++);
    84                 }
     60                while (width--)
     61                        *d++ = interpolate16p_1_1(*sB++, *sA++);
    8562        }
    8663}
    87 #endif
     64template<int bitFormat, int scale>
     65static inline void interpolate5Line(uint32 *dst, const uint32 *srcA, const uint32 *srcB, int width) {
     66        if (scale == 1)
     67                while (width--)
     68                        *dst++ = interpolate_3_1(*srcB++, *srcA++);
     69        else
     70                while (width--)
     71                        *dst++ = interpolate_1_1(*srcB++, *srcA++);
     72}
    8873
    8974void makeRectStretchable(int &x, int &y, int &w, int &h) {
    90 #if ASPECT_MODE != kVeryFastAndUglyAspectMode
    9175        int m = real2Aspect(y) % 6;
    9276
    9377        // Ensure that the rect will start on a line that won't have its
     
    9781                h += m;
    9882        }
    9983
    100   #if ASPECT_MODE == kFastAndNiceAspectMode
    10184        // Force x to be even, to ensure aligned memory access (this assumes
    10285        // that each line starts at an even memory location, but that should
    10386        // be the case on every target anyway).
     
    11194        // this should actually be faster than having the check for the
    11295        if (w & 1)
    11396                w++;
    114   #endif
    115 #endif
    11697}
    11798
    11899/**
     
    131112 * srcY + height - 1, and it should be stretched to Y coordinates srcY
    132113 * through real2Aspect(srcY + height - 1).
    133114 */
    134 template<int bitFormat>
    135 int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY) {
     115template<int bitFormat, typename T>
     116int stretch200To240(T *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY) {
     117        pitch /= sizeof(T);
     118
    136119        int maxDstY = real2Aspect(origSrcY + height - 1);
    137120        int y;
    138         const uint8 *startSrcPtr = buf + srcX * 2 + (srcY - origSrcY) * pitch;
    139         uint8 *dstPtr = buf + srcX * 2 + maxDstY * pitch;
     121        const T *startSrcPtr = buf + srcX + (srcY - origSrcY) * pitch;
     122        T *dstPtr = buf + srcX + maxDstY * pitch;
    140123
    141124        for (y = maxDstY; y >= srcY; y--) {
    142                 const uint8 *srcPtr = startSrcPtr + aspect2Real(y) * pitch;
     125                const T *srcPtr = startSrcPtr + aspect2Real(y) * pitch;
    143126
    144 #if ASPECT_MODE == kVeryFastAndUglyAspectMode
    145                 if (srcPtr == dstPtr)
    146                         break;
    147                 memcpy(dstPtr, srcPtr, width * 2);
    148 #else
    149127                // Bilinear filter
    150128                switch (y % 6) {
    151129                case 0:
    152130                case 5:
    153131                        if (srcPtr != dstPtr)
    154                                 memcpy(dstPtr, srcPtr, width * 2);
     132                                memcpy(dstPtr, srcPtr, width * sizeof(T));
    155133                        break;
    156134                case 1:
    157                         interpolate5Line<bitFormat, 1>((uint16 *)dstPtr, (const uint16 *)(srcPtr - pitch), (const uint16 *)srcPtr, width);
     135                        interpolate5Line<bitFormat, 1>(dstPtr, srcPtr - pitch, srcPtr, width);
    158136                        break;
    159137                case 2:
    160                         interpolate5Line<bitFormat, 2>((uint16 *)dstPtr, (const uint16 *)(srcPtr - pitch), (const uint16 *)srcPtr, width);
     138                        interpolate5Line<bitFormat, 2>(dstPtr, srcPtr - pitch, srcPtr, width);
    161139                        break;
    162140                case 3:
    163                         interpolate5Line<bitFormat, 2>((uint16 *)dstPtr, (const uint16 *)srcPtr, (const uint16 *)(srcPtr - pitch), width);
     141                        interpolate5Line<bitFormat, 2>(dstPtr, srcPtr, srcPtr - pitch, width);
    164142                        break;
    165143                case 4:
    166                         interpolate5Line<bitFormat, 1>((uint16 *)dstPtr, (const uint16 *)srcPtr, (const uint16 *)(srcPtr - pitch), width);
     144                        interpolate5Line<bitFormat, 1>(dstPtr, srcPtr, srcPtr - pitch, width);
    167145                        break;
    168146                }
    169 #endif
    170147                dstPtr -= pitch;
    171148        }
    172149
    173150        return 1 + maxDstY - srcY;
    174151}
    175152
    176 int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY) {
    177         if (gBitFormat == 565)
    178                 return stretch200To240<565>(buf, pitch, width, height, srcX, srcY, origSrcY);
     153int stretch200To240(uint8 *buf, uint32 pitch, int width, int height, int srcX, int srcY, int origSrcY, uint8 bytesPerPixel) {
     154        if (gBitFormat == 8888) {
     155                if (bytesPerPixel == 4)
     156                        return stretch200To240<8888>((uint32*) buf, pitch, width, height, srcX, srcY, origSrcY);
     157                else
     158                        return stretch200To240<565>((uint16*) buf, pitch, width, height, srcX, srcY, origSrcY);
     159        }
     160        else if (gBitFormat == 565)
     161                return stretch200To240<565>((uint16*) buf, pitch, width, height, srcX, srcY, origSrcY);
    179162        else // gBitFormat == 555
    180                 return stretch200To240<555>(buf, pitch, width, height, srcX, srcY, origSrcY);
     163                return stretch200To240<555>((uint16*) buf, pitch, width, height, srcX, srcY, origSrcY);
    181164}
    182 
  • graphics/scaler/hq2x.cpp

     
    3636
    3737}
    3838
    39 void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     39void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, uint8 bytesPerPixel) {
    4040        hq2x_16(srcPtr, dstPtr, width, height, srcPitch, dstPitch);
    4141}
    4242
    4343#else
    4444
    4545#define PIXEL00_0       *(q) = w5;
    46 #define PIXEL00_10      *(q) = interpolate16_2<bitFormat,3,1>(w5, w1);
    47 #define PIXEL00_11      *(q) = interpolate16_2<bitFormat,3,1>(w5, w4);
    48 #define PIXEL00_12      *(q) = interpolate16_2<bitFormat,3,1>(w5, w2);
    49 #define PIXEL00_20      *(q) = interpolate16_3<bitFormat,2,1,1>(w5, w4, w2);
    50 #define PIXEL00_21      *(q) = interpolate16_3<bitFormat,2,1,1>(w5, w1, w2);
    51 #define PIXEL00_22      *(q) = interpolate16_3<bitFormat,2,1,1>(w5, w1, w4);
    52 #define PIXEL00_60      *(q) = interpolate16_3<bitFormat,5,2,1>(w5, w2, w4);
    53 #define PIXEL00_61      *(q) = interpolate16_3<bitFormat,5,2,1>(w5, w4, w2);
    54 #define PIXEL00_70      *(q) = interpolate16_3<bitFormat,6,1,1>(w5, w4, w2);
    55 #define PIXEL00_90      *(q) = interpolate16_3<bitFormat,2,3,3>(w5, w4, w2);
    56 #define PIXEL00_100     *(q) = interpolate16_3<bitFormat,14,1,1>(w5, w4, w2);
     46#define PIXEL00_10      *(q) = interpolate_2<bitFormat,3,1>(w5, w1);
     47#define PIXEL00_11      *(q) = interpolate_2<bitFormat,3,1>(w5, w4);
     48#define PIXEL00_12      *(q) = interpolate_2<bitFormat,3,1>(w5, w2);
     49#define PIXEL00_20      *(q) = interpolate_3<bitFormat,2,1,1>(w5, w4, w2);
     50#define PIXEL00_21      *(q) = interpolate_3<bitFormat,2,1,1>(w5, w1, w2);
     51#define PIXEL00_22      *(q) = interpolate_3<bitFormat,2,1,1>(w5, w1, w4);
     52#define PIXEL00_60      *(q) = interpolate_3<bitFormat,5,2,1>(w5, w2, w4);
     53#define PIXEL00_61      *(q) = interpolate_3<bitFormat,5,2,1>(w5, w4, w2);
     54#define PIXEL00_70      *(q) = interpolate_3<bitFormat,6,1,1>(w5, w4, w2);
     55#define PIXEL00_90      *(q) = interpolate_3<bitFormat,2,3,3>(w5, w4, w2);
     56#define PIXEL00_100     *(q) = interpolate_3<bitFormat,14,1,1>(w5, w4, w2);
    5757
    5858#define PIXEL01_0       *(q+1) = w5;
    59 #define PIXEL01_10      *(q+1) = interpolate16_2<bitFormat,3,1>(w5, w3);
    60 #define PIXEL01_11      *(q+1) = interpolate16_2<bitFormat,3,1>(w5, w2);
    61 #define PIXEL01_12      *(q+1) = interpolate16_2<bitFormat,3,1>(w5, w6);
    62 #define PIXEL01_20      *(q+1) = interpolate16_3<bitFormat,2,1,1>(w5, w2, w6);
    63 #define PIXEL01_21      *(q+1) = interpolate16_3<bitFormat,2,1,1>(w5, w3, w6);
    64 #define PIXEL01_22      *(q+1) = interpolate16_3<bitFormat,2,1,1>(w5, w3, w2);
    65 #define PIXEL01_60      *(q+1) = interpolate16_3<bitFormat,5,2,1>(w5, w6, w2);
    66 #define PIXEL01_61      *(q+1) = interpolate16_3<bitFormat,5,2,1>(w5, w2, w6);
    67 #define PIXEL01_70      *(q+1) = interpolate16_3<bitFormat,6,1,1>(w5, w2, w6);
    68 #define PIXEL01_90      *(q+1) = interpolate16_3<bitFormat,2,3,3>(w5, w2, w6);
    69 #define PIXEL01_100     *(q+1) = interpolate16_3<bitFormat,14,1,1>(w5, w2, w6);
     59#define PIXEL01_10      *(q+1) = interpolate_2<bitFormat,3,1>(w5, w3);
     60#define PIXEL01_11      *(q+1) = interpolate_2<bitFormat,3,1>(w5, w2);
     61#define PIXEL01_12      *(q+1) = interpolate_2<bitFormat,3,1>(w5, w6);
     62#define PIXEL01_20      *(q+1) = interpolate_3<bitFormat,2,1,1>(w5, w2, w6);
     63#define PIXEL01_21      *(q+1) = interpolate_3<bitFormat,2,1,1>(w5, w3, w6);
     64#define PIXEL01_22      *(q+1) = interpolate_3<bitFormat,2,1,1>(w5, w3, w2);
     65#define PIXEL01_60      *(q+1) = interpolate_3<bitFormat,5,2,1>(w5, w6, w2);
     66#define PIXEL01_61      *(q+1) = interpolate_3<bitFormat,5,2,1>(w5, w2, w6);
     67#define PIXEL01_70      *(q+1) = interpolate_3<bitFormat,6,1,1>(w5, w2, w6);
     68#define PIXEL01_90      *(q+1) = interpolate_3<bitFormat,2,3,3>(w5, w2, w6);
     69#define PIXEL01_100     *(q+1) = interpolate_3<bitFormat,14,1,1>(w5, w2, w6);
    7070
    7171#define PIXEL10_0       *(q+nextlineDst) = w5;
    72 #define PIXEL10_10      *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w7);
    73 #define PIXEL10_11      *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w8);
    74 #define PIXEL10_12      *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w4);
    75 #define PIXEL10_20      *(q+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w5, w8, w4);
    76 #define PIXEL10_21      *(q+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w5, w7, w4);
    77 #define PIXEL10_22      *(q+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w5, w7, w8);
    78 #define PIXEL10_60      *(q+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w5, w4, w8);
    79 #define PIXEL10_61      *(q+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w5, w8, w4);
    80 #define PIXEL10_70      *(q+nextlineDst) = interpolate16_3<bitFormat,6,1,1>(w5, w8, w4);
    81 #define PIXEL10_90      *(q+nextlineDst) = interpolate16_3<bitFormat,2,3,3>(w5, w8, w4);
    82 #define PIXEL10_100     *(q+nextlineDst) = interpolate16_3<bitFormat,14,1,1>(w5, w8, w4);
     72#define PIXEL10_10      *(q+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w7);
     73#define PIXEL10_11      *(q+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w8);
     74#define PIXEL10_12      *(q+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w4);
     75#define PIXEL10_20      *(q+nextlineDst) = interpolate_3<bitFormat,2,1,1>(w5, w8, w4);
     76#define PIXEL10_21      *(q+nextlineDst) = interpolate_3<bitFormat,2,1,1>(w5, w7, w4);
     77#define PIXEL10_22      *(q+nextlineDst) = interpolate_3<bitFormat,2,1,1>(w5, w7, w8);
     78#define PIXEL10_60      *(q+nextlineDst) = interpolate_3<bitFormat,5,2,1>(w5, w4, w8);
     79#define PIXEL10_61      *(q+nextlineDst) = interpolate_3<bitFormat,5,2,1>(w5, w8, w4);
     80#define PIXEL10_70      *(q+nextlineDst) = interpolate_3<bitFormat,6,1,1>(w5, w8, w4);
     81#define PIXEL10_90      *(q+nextlineDst) = interpolate_3<bitFormat,2,3,3>(w5, w8, w4);
     82#define PIXEL10_100     *(q+nextlineDst) = interpolate_3<bitFormat,14,1,1>(w5, w8, w4);
    8383
    8484#define PIXEL11_0       *(q+1+nextlineDst) = w5;
    85 #define PIXEL11_10      *(q+1+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w9);
    86 #define PIXEL11_11      *(q+1+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w6);
    87 #define PIXEL11_12      *(q+1+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w8);
    88 #define PIXEL11_20      *(q+1+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w5, w6, w8);
    89 #define PIXEL11_21      *(q+1+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w5, w9, w8);
    90 #define PIXEL11_22      *(q+1+nextlineDst) = interpolate16_3<bitFormat,2,1,1>(w5, w9, w6);
    91 #define PIXEL11_60      *(q+1+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w5, w8, w6);
    92 #define PIXEL11_61      *(q+1+nextlineDst) = interpolate16_3<bitFormat,5,2,1>(w5, w6, w8);
    93 #define PIXEL11_70      *(q+1+nextlineDst) = interpolate16_3<bitFormat,6,1,1>(w5, w6, w8);
    94 #define PIXEL11_90      *(q+1+nextlineDst) = interpolate16_3<bitFormat,2,3,3>(w5, w6, w8);
    95 #define PIXEL11_100     *(q+1+nextlineDst) = interpolate16_3<bitFormat,14,1,1>(w5, w6, w8);
     85#define PIXEL11_10      *(q+1+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w9);
     86#define PIXEL11_11      *(q+1+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w6);
     87#define PIXEL11_12      *(q+1+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w8);
     88#define PIXEL11_20      *(q+1+nextlineDst) = interpolate_3<bitFormat,2,1,1>(w5, w6, w8);
     89#define PIXEL11_21      *(q+1+nextlineDst) = interpolate_3<bitFormat,2,1,1>(w5, w9, w8);
     90#define PIXEL11_22      *(q+1+nextlineDst) = interpolate_3<bitFormat,2,1,1>(w5, w9, w6);
     91#define PIXEL11_60      *(q+1+nextlineDst) = interpolate_3<bitFormat,5,2,1>(w5, w8, w6);
     92#define PIXEL11_61      *(q+1+nextlineDst) = interpolate_3<bitFormat,5,2,1>(w5, w6, w8);
     93#define PIXEL11_70      *(q+1+nextlineDst) = interpolate_3<bitFormat,6,1,1>(w5, w6, w8);
     94#define PIXEL11_90      *(q+1+nextlineDst) = interpolate_3<bitFormat,2,3,3>(w5, w6, w8);
     95#define PIXEL11_100     *(q+1+nextlineDst) = interpolate_3<bitFormat,14,1,1>(w5, w6, w8);
    9696
    9797#define YUV(x)  RGBtoYUV[w ## x]
    9898
     
    110110#undef bitFormat
    111111
    112112
    113 void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     113void HQ2x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, uint8 bytesPerPixel) {
    114114        if (gBitFormat == 565)
    115115                HQ2x_565(srcPtr, srcPitch, dstPtr, dstPitch, width, height);
    116116        else
  • graphics/scaler/hq3x.cpp

     
    3737
    3838}
    3939
    40 void HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     40void HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, uint8 bytesPerPixel) {
    4141        hq3x_16(srcPtr, dstPtr, width, height, srcPitch, dstPitch);
    4242}
    4343
    4444#else
    4545
    46 #define PIXEL00_1M  *(q) = interpolate16_2<bitFormat,3,1>(w5, w1);
    47 #define PIXEL00_1U  *(q) = interpolate16_2<bitFormat,3,1>(w5, w2);
    48 #define PIXEL00_1L  *(q) = interpolate16_2<bitFormat,3,1>(w5, w4);
    49 #define PIXEL00_2   *(q) = interpolate16_3<bitFormat,2,1,1>(w5, w4, w2);
    50 #define PIXEL00_4   *(q) = interpolate16_3<bitFormat,2,7,7>(w5, w4, w2);
    51 #define PIXEL00_5   *(q) = interpolate16_2<bitFormat,1,1>(w4, w2);
     46#define PIXEL00_1M  *(q) = interpolate_2<bitFormat,3,1>(w5, w1);
     47#define PIXEL00_1U  *(q) = interpolate_2<bitFormat,3,1>(w5, w2);
     48#define PIXEL00_1L  *(q) = interpolate_2<bitFormat,3,1>(w5, w4);
     49#define PIXEL00_2   *(q) = interpolate_3<bitFormat,2,1,1>(w5, w4, w2);
     50#define PIXEL00_4   *(q) = interpolate_3<bitFormat,2,7,7>(w5, w4, w2);
     51#define PIXEL00_5   *(q) = interpolate_2<bitFormat,1,1>(w4, w2);
    5252#define PIXEL00_C   *(q) = w5;
    5353
    54 #define PIXEL01_1   *(q+1) = interpolate16_2<bitFormat,3,1>(w5, w2);
    55 #define PIXEL01_3   *(q+1) = interpolate16_2<bitFormat,7,1>(w5, w2);
    56 #define PIXEL01_6   *(q+1) = interpolate16_2<bitFormat,3,1>(w2, w5);
     54#define PIXEL01_1   *(q+1) = interpolate_2<bitFormat,3,1>(w5, w2);
     55#define PIXEL01_3   *(q+1) = interpolate_2<bitFormat,7,1>(w5, w2);
     56#define PIXEL01_6   *(q+1) = interpolate_2<bitFormat,3,1>(w2, w5);
    5757#define PIXEL01_C   *(q+1) = w5;
    5858
    59 #define PIXEL02_1M  *(q+2) = interpolate16_2<bitFormat,3,1>(w5, w3);
    60 #define PIXEL02_1U  *(q+2) = interpolate16_2<bitFormat,3,1>(w5, w2);
    61 #define PIXEL02_1R  *(q+2) = interpolate16_2<bitFormat,3,1>(w5, w6);
    62 #define PIXEL02_2   *(q+2) = interpolate16_3<bitFormat,2,1,1>(w5, w2, w6);
    63 #define PIXEL02_4   *(q+2) = interpolate16_3<bitFormat,2,7,7>(w5, w2, w6);
    64 #define PIXEL02_5   *(q+2) = interpolate16_2<bitFormat,1,1>(w2, w6);
     59#define PIXEL02_1M  *(q+2) = interpolate_2<bitFormat,3,1>(w5, w3);
     60#define PIXEL02_1U  *(q+2) = interpolate_2<bitFormat,3,1>(w5, w2);
     61#define PIXEL02_1R  *(q+2) = interpolate_2<bitFormat,3,1>(w5, w6);
     62#define PIXEL02_2   *(q+2) = interpolate_3<bitFormat,2,1,1>(w5, w2, w6);
     63#define PIXEL02_4   *(q+2) = interpolate_3<bitFormat,2,7,7>(w5, w2, w6);
     64#define PIXEL02_5   *(q+2) = interpolate_2<bitFormat,1,1>(w2, w6);
    6565#define PIXEL02_C   *(q+2) = w5;
    6666
    67 #define PIXEL10_1   *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w4);
    68 #define PIXEL10_3   *(q+nextlineDst) = interpolate16_2<bitFormat,7,1>(w5, w4);
    69 #define PIXEL10_6   *(q+nextlineDst) = interpolate16_2<bitFormat,3,1>(w4, w5);
     67#define PIXEL10_1   *(q+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w4);
     68#define PIXEL10_3   *(q+nextlineDst) = interpolate_2<bitFormat,7,1>(w5, w4);
     69#define PIXEL10_6   *(q+nextlineDst) = interpolate_2<bitFormat,3,1>(w4, w5);
    7070#define PIXEL10_C   *(q+nextlineDst) = w5;
    7171
    7272#define PIXEL11     *(q+1+nextlineDst) = w5;
    7373
    74 #define PIXEL12_1   *(q+2+nextlineDst) = interpolate16_2<bitFormat,3,1>(w5, w6);
    75 #define PIXEL12_3   *(q+2+nextlineDst) = interpolate16_2<bitFormat,7,1>(w5, w6);
    76 #define PIXEL12_6   *(q+2+nextlineDst) = interpolate16_2<bitFormat,3,1>(w6, w5);
     74#define PIXEL12_1   *(q+2+nextlineDst) = interpolate_2<bitFormat,3,1>(w5, w6);
     75#define PIXEL12_3   *(q+2+nextlineDst) = interpolate_2<bitFormat,7,1>(w5, w6);
     76#define PIXEL12_6   *(q+2+nextlineDst) = interpolate_2<bitFormat,3,1>(w6, w5);
    7777#define PIXEL12_C   *(q+2+nextlineDst) = w5;
    7878
    79 #define PIXEL20_1M  *(q+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w7);
    80 #define PIXEL20_1D  *(q+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w8);
    81 #define PIXEL20_1L  *(q+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w4);
    82 #define PIXEL20_2   *(q+nextlineDst2) = interpolate16_3<bitFormat,2,1,1>(w5, w8, w4);
    83 #define PIXEL20_4   *(q+nextlineDst2) = interpolate16_3<bitFormat,2,7,7>(w5, w8, w4);
    84 #define PIXEL20_5   *(q+nextlineDst2) = interpolate16_2<bitFormat,1,1>(w8, w4);
     79#define PIXEL20_1M  *(q+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w7);
     80#define PIXEL20_1D  *(q+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w8);
     81#define PIXEL20_1L  *(q+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w4);
     82#define PIXEL20_2   *(q+nextlineDst2) = interpolate_3<bitFormat,2,1,1>(w5, w8, w4);
     83#define PIXEL20_4   *(q+nextlineDst2) = interpolate_3<bitFormat,2,7,7>(w5, w8, w4);
     84#define PIXEL20_5   *(q+nextlineDst2) = interpolate_2<bitFormat,1,1>(w8, w4);
    8585#define PIXEL20_C   *(q+nextlineDst2) = w5;
    8686
    87 #define PIXEL21_1   *(q+1+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w8);
    88 #define PIXEL21_3   *(q+1+nextlineDst2) = interpolate16_2<bitFormat,7,1>(w5, w8);
    89 #define PIXEL21_6   *(q+1+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w8, w5);
     87#define PIXEL21_1   *(q+1+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w8);
     88#define PIXEL21_3   *(q+1+nextlineDst2) = interpolate_2<bitFormat,7,1>(w5, w8);
     89#define PIXEL21_6   *(q+1+nextlineDst2) = interpolate_2<bitFormat,3,1>(w8, w5);
    9090#define PIXEL21_C   *(q+1+nextlineDst2) = w5;
    9191
    92 #define PIXEL22_1M  *(q+2+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w9);
    93 #define PIXEL22_1D  *(q+2+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w8);
    94 #define PIXEL22_1R  *(q+2+nextlineDst2) = interpolate16_2<bitFormat,3,1>(w5, w6);
    95 #define PIXEL22_2   *(q+2+nextlineDst2) = interpolate16_3<bitFormat,2,1,1>(w5, w6, w8);
    96 #define PIXEL22_4   *(q+2+nextlineDst2) = interpolate16_3<bitFormat,2,7,7>(w5, w6, w8);
    97 #define PIXEL22_5   *(q+2+nextlineDst2) = interpolate16_2<bitFormat,1,1>(w6, w8);
     92#define PIXEL22_1M  *(q+2+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w9);
     93#define PIXEL22_1D  *(q+2+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w8);
     94#define PIXEL22_1R  *(q+2+nextlineDst2) = interpolate_2<bitFormat,3,1>(w5, w6);
     95#define PIXEL22_2   *(q+2+nextlineDst2) = interpolate_3<bitFormat,2,1,1>(w5, w6, w8);
     96#define PIXEL22_4   *(q+2+nextlineDst2) = interpolate_3<bitFormat,2,7,7>(w5, w6, w8);
     97#define PIXEL22_5   *(q+2+nextlineDst2) = interpolate_2<bitFormat,1,1>(w6, w8);
    9898#define PIXEL22_C   *(q+2+nextlineDst2) = w5;
    9999
    100100#define YUV(x)  RGBtoYUV[w ## x]
     
    113113#undef bitFormat
    114114
    115115
    116 void HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
     116void HQ3x(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height, uint8 bytesPerPixel) {
    117117        if (gBitFormat == 565)
    118118                HQ3x_565(srcPtr, srcPitch, dstPtr, dstPitch, width, height);
    119119        else
  • graphics/scaler/thumbnail.cpp

     
    3636        uint16 colorx1y2 = *(((const uint16*)(src + srcPitch)));
    3737        uint16 colorx2y2 = *(((const uint16*)(src + srcPitch)) + 1);
    3838
    39         return interpolate32_1_1_1_1<bitFormat>(colorx1y1, colorx2y1, colorx1y2, colorx2y2);
     39        return interpolate_1_1_1_1<bitFormat>(colorx1y1, colorx2y1, colorx1y2, colorx2y2);
    4040}
    4141
    4242template<int bitFormat>
     
    6363                        uint16 downleft = quadBlockInterpolate<bitFormat>(src + srcPitch * 2 + 2 * x, srcPitch);
    6464                        uint16 downright = quadBlockInterpolate<bitFormat>(src + srcPitch * 2 + 2 * (x + 2), srcPitch);
    6565
    66                         *((uint16*)dstPtr) = interpolate32_1_1_1_1<bitFormat>(upleft, upright, downleft, downright);
     66                        *((uint16*)dstPtr) = interpolate_1_1_1_1<bitFormat>(upleft, upright, downleft, downright);
    6767                }
    6868                dstPtr += (dstPitch - 2 * width / 4);
    6969                src += 4 * srcPitch;
  • graphics/scaler/2xsai.cpp

     
    4444        return rmap[y][x];
    4545}
    4646
    47 #define interpolate_1_1         interpolate16_2<bitFormat, 1, 1>
    48 #define interpolate_3_1         interpolate16_2<bitFormat, 3, 1>
    49 #define interpolate_6_1_1       interpolate16_3<bitFormat, 6, 1, 1>
    50 #define interpolate_1_1_1_1     interpolate32_1_1_1_1<bitFormat>
     47#define interpolate_1_1         interpolate_2<bitFormat, 1, 1>
     48#define interpolate_3_1         interpolate_2<bitFormat, 3, 1>
     49#define interpolate_6_1_1       interpolate_3<bitFormat, 6, 1, 1>
     50#define interpolate_1_1_1_1     interpolate_1_1_1_1<bitFormat>
    5151
    52 template<int bitFormat>
    53 void Super2xSaITemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
    54         const uint16 *bP;
    55         uint16 *dP;
    56         const uint32 nextlineSrc = srcPitch >> 1;
     52template<int bitFormat, typename T>
     53void Super2xSaITemplate(const T *srcPtr, uint32 srcPitch, T *dstPtr, uint32 dstPitch, int width, int height) {
     54        const T *bP;
     55        T *dP;
    5756
     57        dstPitch /= sizeof(T);
     58        srcPitch /= sizeof(T);
     59
    5860        while (height--) {
    59                 bP = (const uint16 *)srcPtr;
    60                 dP = (uint16 *)dstPtr;
     61                bP = (const T *)srcPtr;
     62                dP = (T *)dstPtr;
    6163
    6264                for (int i = 0; i < width; ++i) {
    6365                        uint32 color4, color5, color6;
     
    7274//                                         1  2  3 S1
    7375//                                           A1 A2
    7476
    75                         colorB0 = *(bP - nextlineSrc - 1);
    76                         colorB1 = *(bP - nextlineSrc);
    77                         colorB2 = *(bP - nextlineSrc + 1);
    78                         colorB3 = *(bP - nextlineSrc + 2);
     77                        colorB0 = *(bP - srcPitch - 1);
     78                        colorB1 = *(bP - srcPitch);
     79                        colorB2 = *(bP - srcPitch + 1);
     80                        colorB3 = *(bP - srcPitch + 2);
    7981
    8082                        color4 = *(bP - 1);
    8183                        color5 = *(bP);
    8284                        color6 = *(bP + 1);
    8385                        colorS2 = *(bP + 2);
    8486
    85                         color1 = *(bP + nextlineSrc - 1);
    86                         color2 = *(bP + nextlineSrc);
    87                         color3 = *(bP + nextlineSrc + 1);
    88                         colorS1 = *(bP + nextlineSrc + 2);
     87                        color1 = *(bP + srcPitch - 1);
     88                        color2 = *(bP + srcPitch);
     89                        color3 = *(bP + srcPitch + 1);
     90                        colorS1 = *(bP + srcPitch + 2);
    8991
    90                         colorA0 = *(bP + 2 * nextlineSrc - 1);
    91                         colorA1 = *(bP + 2 * nextlineSrc);
    92                         colorA2 = *(bP + 2 * nextlineSrc + 1);
    93                         colorA3 = *(bP + 2 * nextlineSrc + 2);
     92                        colorA0 = *(bP + 2 * srcPitch - 1);
     93                        colorA1 = *(bP + 2 * srcPitch);
     94                        colorA2 = *(bP + 2 * srcPitch + 1);
     95                        colorA3 = *(bP + 2 * srcPitch + 2);
    9496
    9597//--------------------------------------
    9698                        if (color2 == color6 && color5 != color3) {
     
    142144                        else
    143145                                product1a = color5;
    144146
    145                         *(dP + 0) = (uint16) product1a;
    146                         *(dP + 1) = (uint16) product1b;
    147                         *(dP + dstPitch/2 + 0) = (uint16) product2a;
    148                         *(dP + dstPitch/2 + 1) = (uint16) product2b;
     147                        *(dP + 0) = (T) product1a;
     148                        *(dP + 1) = (T) product1b;
     149                        *(dP + dstPitch + 0) = (T) product2a;
     150                        *(dP + dstPitch + 1) = (T) product2b;
    149151
    150152                        bP += 1;
    151153                        dP += 2;
     
    158160
    159161MAKE_WRAPPER(Super2xSaI)
    160162
    161 template<int bitFormat>
    162 void SuperEagleTemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
    163         const uint16 *bP;
    164         uint16 *dP;
    165         const uint32 nextlineSrc = srcPitch >> 1;
     163template<int bitFormat, typename T>
     164void SuperEagleTemplate(const T *srcPtr, uint32 srcPitch, T *dstPtr, uint32 dstPitch, int width, int height) {
     165        const T *bP;
     166        T *dP;
    166167
     168        dstPitch /= sizeof(T);
     169        srcPitch /= sizeof(T);
     170
    167171        while (height--) {
    168                 bP = (const uint16 *)srcPtr;
    169                 dP = (uint16 *)dstPtr;
     172                bP = (const T *)srcPtr;
     173                dP = (T *)dstPtr;
    170174                for (int i = 0; i < width; ++i) {
    171175                        uint32 color4, color5, color6;
    172176                        uint32 color1, color2, color3;
    173177                        uint32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
    174178                        uint32 product1a, product1b, product2a, product2b;
    175179
    176                         colorB1 = *(bP - nextlineSrc);
    177                         colorB2 = *(bP - nextlineSrc + 1);
     180                        colorB1 = *(bP - srcPitch);
     181                        colorB2 = *(bP - srcPitch + 1);
    178182
    179183                        color4 = *(bP - 1);
    180184                        color5 = *(bP);
    181185                        color6 = *(bP + 1);
    182186                        colorS2 = *(bP + 2);
    183187
    184                         color1 = *(bP + nextlineSrc - 1);
    185                         color2 = *(bP + nextlineSrc);
    186                         color3 = *(bP + nextlineSrc + 1);
    187                         colorS1 = *(bP + nextlineSrc + 2);
     188                        color1 = *(bP + srcPitch - 1);
     189                        color2 = *(bP + srcPitch);
     190                        color3 = *(bP + srcPitch + 1);
     191                        colorS1 = *(bP + srcPitch + 2);
    188192
    189                         colorA1 = *(bP + 2 * nextlineSrc);
    190                         colorA2 = *(bP + 2 * nextlineSrc + 1);
     193                        colorA1 = *(bP + 2 * srcPitch);
     194                        colorA2 = *(bP + 2 * srcPitch + 1);
    191195
    192196                        // --------------------------------------
    193197                        if (color5 != color3) {
     
    247251                                }
    248252                        }
    249253
    250                         *(dP + 0) = (uint16) product1a;
    251                         *(dP + 1) = (uint16) product1b;
    252                         *(dP + dstPitch/2 + 0) = (uint16) product2a;
    253                         *(dP + dstPitch/2 + 1) = (uint16) product2b;
     254                        *(dP + 0) = (T) product1a;
     255                        *(dP + 1) = (T) product1b;
     256                        *(dP + dstPitch + 0) = (T) product2a;
     257                        *(dP + dstPitch + 1) = (T) product2b;
    254258
    255259                        bP += 1;
    256260                        dP += 2;
     
    263267
    264268MAKE_WRAPPER(SuperEagle)
    265269
    266 template<int bitFormat>
    267 void _2xSaITemplate(const uint8 *srcPtr, uint32 srcPitch, uint8 *dstPtr, uint32 dstPitch, int width, int height) {
    268         const uint16 *bP;
    269         uint16 *dP;
    270         const uint32 nextlineSrc = srcPitch >> 1;
     270template<int bitFormat, typename T>
     271void _2xSaITemplate(const T *srcPtr, uint32 srcPitch, T *dstPtr, uint32 dstPitch, int width, int height) {
     272        const T *bP;
     273        T *dP;
    271274
     275        dstPitch /= sizeof(T);
     276        srcPitch /= sizeof(T);
     277
    272278        while (height--) {
    273                 bP = (const uint16 *)srcPtr;
    274                 dP = (uint16 *)dstPtr;
     279                bP = (const T *)srcPtr;
     280                dP = (T *)dstPtr;
    275281
    276282                for (int i = 0; i < width; ++i) {
    277283
     
    285291//                                       G|A B|K
    286292//                                       H|C D|L
    287293//                                       M|N O|P
    288                         colorI = *(bP - nextlineSrc - 1);
    289                         colorE = *(bP - nextlineSrc);
    290                         colorF = *(bP - nextlineSrc + 1);
    291                         colorJ = *(bP - nextlineSrc + 2);
     294                        colorI = *(bP - srcPitch - 1);
     295                        colorE = *(bP - srcPitch);
     296                        colorF = *(bP - srcPitch + 1);
     297                        colorJ = *(bP - srcPitch + 2);
    292298
    293299                        colorG = *(bP - 1);
    294300                        colorA = *(bP);
    295301                        colorB = *(bP + 1);
    296302                        colorK = *(bP + 2);
    297303
    298                         colorH = *(bP + nextlineSrc - 1);
    299                         colorC = *(bP + nextlineSrc);
    300                         colorD = *(bP + nextlineSrc + 1);
    301                         colorL = *(bP + nextlineSrc + 2);
     304                        colorH = *(bP + srcPitch - 1);
     305                        colorC = *(bP + srcPitch);
     306                        colorD = *(bP + srcPitch + 1);
     307                        colorL = *(bP + srcPitch + 2);
    302308
    303                         colorM = *(bP + 2 * nextlineSrc - 1);
    304                         colorN = *(bP + 2 * nextlineSrc);
    305                         colorO = *(bP + 2 * nextlineSrc + 1);
    306                         colorP = *(bP + 2 * nextlineSrc + 2);
     309                        colorM = *(bP + 2 * srcPitch - 1);
     310                        colorN = *(bP + 2 * srcPitch);
     311                        colorO = *(bP + 2 * srcPitch + 1);
     312                        colorP = *(bP + 2 * srcPitch + 2);
    307313
    308314                        if ((colorA == colorD) && (colorB != colorC)) {
    309315                                if (((colorA == colorE) && (colorB == colorL)) ||
     
    383389                                }
    384390                        }
    385391
    386                         *(dP + 0) = (uint16) colorA;
    387                         *(dP + 1) = (uint16) product;
    388                         *(dP + dstPitch/2 + 0) = (uint16) product1;
    389                         *(dP + dstPitch/2 + 1) = (uint16) product2;
     392                        *(dP + 0) = (T) colorA;
     393                        *(dP + 1) = (T) product;
     394                        *(dP + dstPitch + 0) = (T) product1;
     395                        *(dP + dstPitch + 1) = (T) product2;
    390396
    391397                        bP += 1;
    392398                        dP += 2;