diff options
Diffstat (limited to 'morphos/morphos_scaler.cpp')
-rw-r--r-- | morphos/morphos_scaler.cpp | 823 |
1 files changed, 0 insertions, 823 deletions
diff --git a/morphos/morphos_scaler.cpp b/morphos/morphos_scaler.cpp deleted file mode 100644 index dca4383016..0000000000 --- a/morphos/morphos_scaler.cpp +++ /dev/null @@ -1,823 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2002 The ScummVM project - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * $Header$ - */ - -#include "stdafx.h" -#include "scumm.h" - -#include <exec/types.h> -#include <cybergraphics/cybergraphics.h> - -#include <proto/cybergraphics.h> - -#include "morphos.h" -#include "morphos_scaler.h" - -#define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D)) -#define INTERPOLATE(A, B) (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask)) -#define Q_INTERPOLATE(A, B, C, D) ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2) + ((((A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask)) >> 2) & qlowpixelMask) -#define SWAP_WORD(word) word = ((word & 0xff) << 8) | (word >> 8) - -MorphOSScaler::GfxScaler MorphOSScaler::ScummScalers[11] - = { { "none", "normal", ST_NONE }, - { "Point", "2x", ST_POINT }, - { "AdvMame2x", "advmame2x", ST_ADVMAME2X }, - { "SuperEagle", "supereagle", ST_SUPEREAGLE }, - { "Super2xSaI", "super2xsai", ST_SUPER2XSAI }, - { NULL, NULL, ST_INVALID }, - { NULL, NULL, ST_INVALID }, - { NULL, NULL, ST_INVALID }, - { NULL, NULL, ST_INVALID }, - { NULL, NULL, ST_INVALID }, - // This is the end marker ... do not assign a scaler to it! - { NULL, NULL, ST_INVALID } - }; - -MorphOSScaler::MorphOSScaler(APTR buffer, int width, int height, ULONG *col_table, UWORD *col_table16, BitMap *bmap) -{ - dest = NULL; - handle = NULL; - - Buffer = buffer; - BufferWidth = width; - BufferHeight = height; - - ScummColors = col_table; - ScummColors16 = col_table16; - - /* Initialize scaling stuff */ - int minr, ming, minb; - ULONG depth = GetCyberMapAttr(bmap, CYBRMATTR_DEPTH); - - if (depth > 16) - { - minr = 1 << 16; - ming = 1 << 8; - minb = 1; - } - else - { - minr = 1 << ((depth == 15) ? 10 : 11); - ming = 1 << 5; - minb = 1; - } - - int pixfmt = GetCyberMapAttr(bmap, CYBRMATTR_PIXFMT); - - ScummPCMode = false; - if (pixfmt == PIXFMT_RGB15PC || pixfmt == PIXFMT_BGR15PC || - pixfmt == PIXFMT_RGB16PC || pixfmt == PIXFMT_BGR16PC) - ScummPCMode = true; - - colorMask = (MakeColor(pixfmt, 255, 0, 0) - minr) | (MakeColor(pixfmt, 0, 255, 0) - ming) | (MakeColor(pixfmt, 0, 0, 255) - minb); - lowPixelMask = minr | ming | minb; - qcolorMask = (MakeColor(pixfmt, 255, 0, 0) - 3*minr) | (MakeColor(pixfmt, 0, 255, 0) - 3*ming) | (MakeColor(pixfmt, 0, 0, 255) - 3*minb); - qlowpixelMask = (minr * 3) | (ming * 3) | (minb * 3); - redblueMask = MakeColor(pixfmt, 255, 0, 255); - greenMask = MakeColor(pixfmt, 0, 255, 0); - - PixelsPerMask = (depth <= 16) ? 2 : 1; - - if (PixelsPerMask == 2) - { - colorMask |= (colorMask << 16); - qcolorMask |= (qcolorMask << 16); - lowPixelMask |= (lowPixelMask << 16); - qlowpixelMask |= (qlowpixelMask << 16); - } -} - -MorphOSScaler::~MorphOSScaler() -{ - Finish(); -} - -MorphOSScaler *MorphOSScaler::Create(SCALERTYPE scaler_type, APTR buffer, int width, int height, ULONG *col_table, UWORD *col_table16, BitMap *bmap) -{ - MorphOSScaler *new_scaler = NULL; - - switch (scaler_type) - { - case ST_POINT: - new_scaler = new PointScaler(buffer, width, height, col_table, col_table16, bmap); - break; - - case ST_ADVMAME2X: - new_scaler = new AdvMame2xScaler(buffer, width, height, col_table, col_table16, bmap); - break; - - case ST_SUPEREAGLE: - new_scaler = new SuperEagleScaler(buffer, width, height, col_table, col_table16, bmap); - break; - - case ST_SUPER2XSAI: - new_scaler = new Super2xSaIScaler(buffer, width, height, col_table, col_table16, bmap); - break; - - default: - warning("Invalid scaler requested - falling back to Super2xSaI"); - new_scaler = new Super2xSaIScaler(buffer, width, height, col_table, col_table16, bmap); - break; - } - - return new_scaler; -} - -bool MorphOSScaler::Prepare(BitMap *render_bmap) -{ - handle = LockBitMapTags(render_bmap, LBMI_BYTESPERPIX, &dest_bpp, - LBMI_BYTESPERROW, &dest_pitch, - LBMI_BASEADDRESS, &dest, - LBMI_PIXFMT, &dest_pixfmt, - TAG_DONE); - - return handle != NULL; -} - -void MorphOSScaler::Finish() -{ - if (handle) - { - UnLockBitMap(handle); - handle = NULL; - } -} - -uint32 MorphOSScaler::MakeColor(int pixfmt, int r, int g, int b) -{ - uint32 col = 0; - - switch (pixfmt) - { - case PIXFMT_RGB15: - case PIXFMT_RGB15PC: - col = (((r*31)/255) << 10) | (((g*31)/255) << 5) | ((b*31)/255); - break; - - case PIXFMT_BGR15: - case PIXFMT_BGR15PC: - col = (((b*31)/255) << 10) | (((g*31)/255) << 5) | ((r*31)/255); - break; - - case PIXFMT_RGB16: - case PIXFMT_RGB16PC: - col = (((r*31)/255) << 11) | (((g*63)/255) << 5) | ((b*31)/255); - break; - - case PIXFMT_BGR16: - case PIXFMT_BGR16PC: - col = (((b*31)/255) << 11) | (((g*63)/255) << 5) | ((r*31)/255); - break; - - case PIXFMT_RGB24: - case PIXFMT_ARGB32: - col = (r << 16) | (g << 8) | b; - break; - - case PIXFMT_BGR24: - col = (b << 16) | (g << 8) | r; - break; - - case PIXFMT_BGRA32: - col = (b << 24) | (g << 16) | (r << 8); - break; - - case PIXFMT_RGBA32: - col = (r << 24) | (g << 16) | (b << 8); - break; - - default: - error("Unsupported pixel format: %d. Please contact author at tomjoad@muenster.de.", pixfmt); - } - - return col; -} - -void Super2xSaIScaler::Scale(uint32 src_x, uint32 src_y, uint32 dest_x, uint32 dest_y, uint32 width, uint32 height) -{ - unsigned int x, y; - unsigned long color[16]; - byte *src; - - if (!handle) - return; - - src = ((byte *)Buffer)+src_y*BufferWidth+src_x; - - /* Point to the first 3 lines. */ - src_line[0] = src; - src_line[1] = src; - src_line[2] = src + BufferWidth; - src_line[3] = src + BufferWidth * 2; - - dst_line[0] = dest+dest_y*2*dest_pitch+dest_x*2*dest_bpp; - dst_line[1] = dst_line[0]+dest_pitch; - - if (PixelsPerMask == 2) - { - byte *sbp; - sbp = src_line[0]; - color[0] = ScummColors16[*sbp]; color[1] = color[0]; color[2] = color[0]; color[3] = color[0]; - color[4] = color[0]; color[5] = color[0]; color[6] = ScummColors16[*(sbp+1)]; color[7] = ScummColors16[*(sbp+2)]; - sbp = src_line[2]; - color[8] = ScummColors16[*sbp]; color[9] = color[8]; color[10] = ScummColors16[*(sbp+1)]; color[11] = ScummColors16[*(sbp+2)]; - sbp = src_line[3]; - color[12] = ScummColors16[*sbp]; color[13] = color[12]; color[14] = ScummColors16[*(sbp+1)]; color[15] = ScummColors16[*(sbp+2)]; - } - else - { - byte *lbp; - lbp = src_line[0]; - color[0] = ScummColors[*lbp]; color[1] = color[0]; color[2] = color[0]; color[3] = color[0]; - color[4] = color[0]; color[5] = color[0]; color[6] = ScummColors[*(lbp+1)]; color[7] = ScummColors[*(lbp+2)]; - lbp = src_line[2]; - color[8] = ScummColors[*lbp]; color[9] = color[8]; color[10] = ScummColors[*(lbp+1)]; color[11] = ScummColors[*(lbp+2)]; - lbp = src_line[3]; - color[12] = ScummColors[*lbp]; color[13] = color[12]; color[14] = ScummColors[*(lbp+1)]; color[15] = ScummColors[*(lbp+2)]; - } - - for (y = 0; y < height; y++) - { - for (x = 0; x < width; x++) - { - unsigned long product1a, product1b, product2a, product2b; - -//--------------------------------------- B0 B1 B2 B3 0 1 2 3 -// 4 5* 6 S2 -> 4 5* 6 7 -// 1 2 3 S1 8 9 10 11 -// A0 A1 A2 A3 12 13 14 15 -//-------------------------------------- - if (color[9] == color[6] && color[5] != color[10]) - { - product2b = color[9]; - product1b = product2b; - } - else if (color[5] == color[10] && color[9] != color[6]) - { - product2b = color[5]; - product1b = product2b; - } - else if (color[5] == color[10] && color[9] == color[6]) - { - int r = 0; - - r += GET_RESULT(color[6], color[5], color[8], color[13]); - r += GET_RESULT(color[6], color[5], color[4], color[1]); - r += GET_RESULT(color[6], color[5], color[14], color[11]); - r += GET_RESULT(color[6], color[5], color[2], color[7]); - - if (r > 0) - product1b = color[6]; - else if (r < 0) - product1b = color[5]; - else - product1b = INTERPOLATE(color[5], color[6]); - - product2b = product1b; - - } - else - { - if (color[6] == color[10] && color[10] == color[13] && color[9] != color[14] && color[10] != color[12]) - product2b = Q_INTERPOLATE(color[10], color[10], color[10], color[9]); - else if (color[5] == color[9] && color[9] == color[14] && color[13] != color[10] && color[9] != color[15]) - product2b = Q_INTERPOLATE(color[9], color[9], color[9], color[10]); - else - product2b = INTERPOLATE(color[9], color[10]); - - if (color[6] == color[10] && color[6] == color[1] && color[5] != color[2] && color[6] != color[0]) - product1b = Q_INTERPOLATE(color[6], color[6], color[6], color[5]); - else if (color[5] == color[9] && color[5] == color[2] && color[1] != color[6] && color[5] != color[3]) - product1b = Q_INTERPOLATE(color[6], color[5], color[5], color[5]); - else - product1b = INTERPOLATE(color[5], color[6]); - } - - if (color[5] == color[10] && color[9] != color[6] && color[4] == color[5] && color[5] != color[14]) - product2a = INTERPOLATE(color[9], color[5]); - else if (color[5] == color[8] && color[6] == color[5] && color[4] != color[9] && color[5] != color[12]) - product2a = INTERPOLATE(color[9], color[5]); - else - product2a = color[9]; - - if (color[9] == color[6] && color[5] != color[10] && color[8] == color[9] && color[9] != color[2]) - product1a = INTERPOLATE(color[9], color[5]); - else if (color[4] == color[9] && color[10] == color[9] && color[8] != color[5] && color[9] != color[0]) - product1a = INTERPOLATE(color[9], color[5]); - else - product1a = color[5]; - - if (PixelsPerMask == 2) - { - if (ScummPCMode) - { - SWAP_WORD(product1a); - SWAP_WORD(product1b); - SWAP_WORD(product2a); - SWAP_WORD(product2b); - } - *((unsigned long *) (&dst_line[0][x * 4])) = (product1a << 16) | product1b; - *((unsigned long *) (&dst_line[1][x * 4])) = (product2a << 16) | product2b; - } - else - { - *((unsigned long *) (&dst_line[0][x * 8])) = product1a; - *((unsigned long *) (&dst_line[0][x * 8 + 4])) = product1b; - *((unsigned long *) (&dst_line[1][x * 8])) = product2a; - *((unsigned long *) (&dst_line[1][x * 8 + 4])) = product2b; - } - - /* Move color matrix forward */ - color[0] = color[1]; color[4] = color[5]; color[8] = color[9]; color[12] = color[13]; - color[1] = color[2]; color[5] = color[6]; color[9] = color[10]; color[13] = color[14]; - color[2] = color[3]; color[6] = color[7]; color[10] = color[11]; color[14] = color[15]; - - if (src_x+x < BufferWidth-3) - { - x += 3; - if (PixelsPerMask == 2) - { - color[3] = ScummColors16[*(src_line[0] + x) ]; - color[7] = ScummColors16[*(src_line[1] + x) ]; - color[11] = ScummColors16[*(src_line[2] + x) ]; - color[15] = ScummColors16[*(src_line[3] + x) ]; - } - else - { - color[3] = ScummColors[*(src_line[0] + x)]; - color[7] = ScummColors[*(src_line[1] + x)]; - color[11] = ScummColors[*(src_line[2] + x)]; - color[15] = ScummColors[*(src_line[3] + x)]; - } - x -= 3; - } - } - - /* We're done with one line, so we shift the source lines up */ - src_line[0] = src_line[1]; - src_line[1] = src_line[2]; - src_line[2] = src_line[3]; - - /* Read next line */ - if (src_y + y + 3 >= BufferHeight) - src_line[3] = src_line[2]; - else - src_line[3] = src_line[2] + BufferWidth; - - /* Then shift the color matrix up */ - if (PixelsPerMask == 2) - { - byte *sbp; - sbp = src_line[0]; - color[0] = ScummColors16[*sbp]; color[1] = color[0]; color[2] = ScummColors16[ *(sbp + 1) ]; color[3] = ScummColors16[*(sbp + 2)]; - sbp = src_line[1]; - color[4] = ScummColors16[*sbp]; color[5] = color[4]; color[6] = ScummColors16[ *(sbp + 1) ]; color[7] = ScummColors16[*(sbp + 2)]; - sbp = src_line[2]; - color[8] = ScummColors16[*sbp]; color[9] = color[8]; color[10] = ScummColors16[ *(sbp + 1) ]; color[11] = ScummColors16[*(sbp + 2)]; - sbp = src_line[3]; - color[12] = ScummColors16[*sbp]; color[13] = color[12]; color[14] = ScummColors16[ *(sbp + 1) ]; color[15] = ScummColors16[*(sbp + 2)]; - - if (src_x + x > 0) - { - color[0] = ScummColors16[src_line[0][-1]]; - color[4] = ScummColors16[src_line[1][-1]]; - color[8] = ScummColors16[src_line[2][-1]]; - color[12] = ScummColors16[src_line[3][-1]]; - } - } - else - { - byte *lbp; - lbp = src_line[0]; - color[0] = ScummColors[*lbp]; color[1] = color[0]; color[2] = ScummColors[ *(lbp + 1) ]; color[3] = ScummColors[*(lbp+2)]; - lbp = src_line[1]; - color[4] = ScummColors[*lbp]; color[5] = color[4]; color[6] = ScummColors[ *(lbp + 1) ]; color[7] = ScummColors[*(lbp+2)]; - lbp = src_line[2]; - color[8] = ScummColors[*lbp]; color[9] = color[8]; color[10] = ScummColors[ *(lbp + 1) ]; color[11] = ScummColors[*(lbp+2)]; - lbp = src_line[3]; - color[12] = ScummColors[*lbp]; color[13] = color[12]; color[14] = ScummColors[ *(lbp + 1) ]; color[15] = ScummColors[*(lbp+2)]; - } - - if (src_y + y < BufferHeight - 1) - { - dst_line[0] = dst_line[1]+dest_pitch; - dst_line[1] = dst_line[0]+dest_pitch; - } - } -} - -void SuperEagleScaler::Scale(uint32 src_x, uint32 src_y, uint32 dest_x, uint32 dest_y, uint32 width, uint32 height) -{ - unsigned int x, y; - unsigned long color[12]; - byte *src; - - if (!handle) - return; - - src = (byte *)Buffer+src_y*BufferWidth+src_x; - - /* Point to the first 3 lines. */ - src_line[0] = src; - src_line[1] = src; - src_line[2] = src + BufferWidth; - src_line[3] = src + BufferWidth * 2; - - dst_line[0] = dest+dest_y*2*dest_pitch+dest_x*2*dest_bpp; - dst_line[1] = dst_line[0]+dest_pitch; - - x = 0, y = 0; - - if (PixelsPerMask == 2) - { - byte *sbp; - sbp = src_line[0]; - color[0] = ScummColors16[*sbp]; color[1] = color[0]; color[2] = color[0]; color[3] = color[0]; - color[4] = ScummColors16[*(sbp+1)]; color[5] = ScummColors16[*(sbp+2)]; - sbp = src_line[2]; - color[6] = ScummColors16[*sbp]; color[7] = color[6]; color[8] = ScummColors16[*(sbp+1)]; color[9] = ScummColors16[*(sbp+2)]; - sbp = src_line[3]; - color[10] = ScummColors16[*sbp]; color[11] = ScummColors16[*(sbp+1)]; - } - else - { - byte *lbp; - lbp = src_line[0]; - color[0] = ScummColors[*lbp]; color[1] = color[0]; color[2] = color[0]; color[3] = color[0]; - color[4] = ScummColors[*(lbp+1)]; color[5] = ScummColors[*(lbp+2)]; - lbp = src_line[2]; - color[6] = ScummColors[*lbp]; color[7] = color[6]; color[8] = ScummColors[*(lbp+1)]; color[9] = ScummColors[*(lbp+2)]; - lbp = src_line[3]; - color[10] = ScummColors[*lbp]; color[11] = ScummColors[*(lbp+1)]; - } - - for (y = 0; y < height; y++) - { - /* Todo: x = width - 2, x = width - 1 */ - - for (x = 0; x < width; x++) - { - unsigned long product1a, product1b, product2a, product2b; - -//--------------------------------------- B1 B2 0 1 -// 4 5 6 S2 -> 2 3 4 5 -// 1 2 3 S1 6 7 8 9 -// A1 A2 10 11 - - if (color[7] == color[4] && color[3] != color[8]) - { - product1b = product2a = color[7]; - - if ((color[6] == color[7]) || (color[4] == color[1])) - product1a = INTERPOLATE(color[7], INTERPOLATE(color[7], color[3])); - else - product1a = INTERPOLATE(color[3], color[4]); - - if ((color[4] == color[5]) || (color[7] == color[10])) - product2b = INTERPOLATE(color[7], INTERPOLATE(color[7], color[8])); - else - product2b = INTERPOLATE(color[7], color[8]); - } - else if (color[3] == color[8] && color[7] != color[4]) - { - product2b = product1a = color[3]; - - if ((color[0] == color[3]) || (color[5] == color[9])) - product1b = INTERPOLATE(color[3], INTERPOLATE(color[3], color[4])); - else - product1b = INTERPOLATE(color[3], color[1]); - - if ((color[8] == color[11]) || (color[2] == color[3])) - product2a = INTERPOLATE(color[3], INTERPOLATE(color[3], color[2])); - else - product2a = INTERPOLATE(color[7], color[8]); - - } - else if (color[3] == color[8] && color[7] == color[4]) - { - register int r = 0; - - r += GET_RESULT(color[4], color[3], color[6], color[10]); - r += GET_RESULT(color[4], color[3], color[2], color[0]); - r += GET_RESULT(color[4], color[3], color[11], color[9]); - r += GET_RESULT(color[4], color[3], color[1], color[5]); - - if (r > 0) - { - product1b = product2a = color[7]; - product1a = product2b = INTERPOLATE(color[3], color[4]); - } - else if (r < 0) - { - product2b = product1a = color[3]; - product1b = product2a = INTERPOLATE(color[3], color[4]); - } - else - { - product2b = product1a = color[3]; - product1b = product2a = color[7]; - } - } - else - { - product2b = product1a = INTERPOLATE(color[7], color[4]); - product2b = Q_INTERPOLATE(color[8], color[8], color[8], product2b); - product1a = Q_INTERPOLATE(color[3], color[3], color[3], product1a); - - product2a = product1b = INTERPOLATE(color[3], color[8]); - product2a = Q_INTERPOLATE(color[7], color[7], color[7], product2a); - product1b = Q_INTERPOLATE(color[4], color[4], color[4], product1b); - } - - if (PixelsPerMask == 2) - { - if (ScummPCMode) - { - SWAP_WORD(product1a); - SWAP_WORD(product1b); - SWAP_WORD(product2a); - SWAP_WORD(product2b); - } - *((unsigned long *) (&dst_line[0][x * 4])) = (product1a << 16) | product1b; - *((unsigned long *) (&dst_line[1][x * 4])) = (product2a << 16) | product2b; - } - else - { - *((unsigned long *) (&dst_line[0][x * 8])) = product1a; - *((unsigned long *) (&dst_line[0][x * 8 + 4])) = product1b; - *((unsigned long *) (&dst_line[1][x * 8])) = product2a; - *((unsigned long *) (&dst_line[1][x * 8 + 4])) = product2b; - } - - /* Move color matrix forward */ - color[0] = color[1]; - color[2] = color[3]; color[3] = color[4]; color[4] = color[5]; - color[6] = color[7]; color[7] = color[8]; color[8] = color[9]; - color[10] = color[11]; - - if (src_x+x < BufferWidth - 2) - { - x += 2; - if (PixelsPerMask == 2) - { - color[1] = ScummColors16[ *(src_line[0] + x) ]; - if (src_x+x < BufferWidth-1) - { - color[5] = ScummColors16[*(src_line[1]+x+1)]; - color[9] = ScummColors16[*(src_line[2]+x+1)]; - } - color[11] = ScummColors16[*(src_line[3]+x)]; - } - else - { - color[1] = ScummColors[*(src_line[0]+x)]; - if (src_x+x < BufferWidth-1) - { - color[5] = ScummColors[*(src_line[1]+x+1)]; - color[9] = ScummColors[ *(src_line[2]+x+1)]; - } - color[11] = ScummColors[*(src_line[3]+x)]; - } - x -= 2; - } - } - - /* We're done with one line, so we shift the source lines up */ - src_line[0] = src_line[1]; - src_line[1] = src_line[2]; - src_line[2] = src_line[3]; - - /* Read next line */ - if (src_y+y+3 >= BufferHeight) - src_line[3] = src_line[2]; - else - src_line[3] = src_line[2] + BufferWidth; - - /* Then shift the color matrix up */ - if (PixelsPerMask == 2) - { - byte *sbp; - sbp = src_line[0]; - color[0] = ScummColors16[*sbp]; color[1] = ScummColors16[*(sbp+1)]; - sbp = src_line[1]; - color[2] = ScummColors16[*sbp]; color[3] = color[2]; color[4] = ScummColors16[*(sbp+1)]; color[5] = ScummColors16[*(sbp+2)]; - sbp = src_line[2]; - color[6] = ScummColors16[*sbp]; color[7] = color[6]; color[8] = ScummColors16[*(sbp+1)]; color[9] = ScummColors16[*(sbp+2)]; - sbp = src_line[3]; - color[10] = ScummColors16[*sbp]; color[11] = ScummColors16[*(sbp+1)]; - } - else - { - byte *lbp; - lbp = src_line[0]; - color[0] = ScummColors[*lbp]; color[1] = ScummColors[*(lbp+1)]; - lbp = src_line[1]; - color[2] = ScummColors[*lbp]; color[3] = color[2]; color[4] = ScummColors[*(lbp+1)]; color[5] = ScummColors[*(lbp+2)]; - lbp = src_line[2]; - color[6] = ScummColors[*lbp]; color[7] = color[6]; color[8] = ScummColors[*(lbp+1)]; color[9] = ScummColors[*(lbp+2)]; - lbp = src_line[3]; - color[10] = ScummColors[*lbp]; color[11] = ScummColors[*(lbp+1)]; - } - - - if (src_y + y < BufferHeight - 1) - { - dst_line[0] = dst_line[1]+dest_pitch; - dst_line[1] = dst_line[0]+dest_pitch; - } - } -} - -void AdvMame2xScaler::Scale(uint32 src_x, uint32 src_y, uint32 dest_x, uint32 dest_y, uint32 width, uint32 height) -{ - if (!handle) - return; - - byte *src = (byte *)Buffer+src_y*BufferWidth+src_x; - - src_line[0] = src; - src_line[1] = src; - src_line[2] = src + BufferWidth; - - dst_line[0] = dest+dest_y*2*dest_pitch+dest_x*2*dest_bpp; - dst_line[1] = dst_line[0]+dest_pitch; - - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - uint32 B, D, E, F, H; - - if (PixelsPerMask == 2) - { - // short A = *(src + i - nextlineSrc - 1); - B = ScummColors16[src_line[0][x]]; - // short C = *(src + i - nextlineSrc + 1); - D = ScummColors16[src_line[1][x-1]]; - E = ScummColors16[src_line[1][x]]; - F = ScummColors16[src_line[1][x+1]]; - // short G = *(src + i + nextlineSrc - 1); - H = ScummColors16[src_line[2][x]]; - // short I = *(src + i + nextlineSrc + 1); - } - else - { - // short A = *(src + i - nextlineSrc - 1); - B = ScummColors[src_line[0][x]]; - // short C = *(src + i - nextlineSrc + 1); - D = ScummColors[src_line[1][x-1]]; - E = ScummColors[src_line[1][x]]; - F = ScummColors[src_line[1][x+1]]; - // short G = *(src + i + nextlineSrc - 1); - H = ScummColors[src_line[2][x]]; - // short I = *(src + i + nextlineSrc + 1); - } - - - if (PixelsPerMask == 2) - { - if (ScummPCMode) - { - SWAP_WORD(B); - SWAP_WORD(D); - SWAP_WORD(E); - SWAP_WORD(F); - SWAP_WORD(H); - } - *((unsigned long *) (&dst_line[0][x * 4])) = ((D == B && B != F && D != H ? D : E) << 16) | (B == F && B != D && F != H ? F : E); - *((unsigned long *) (&dst_line[1][x * 4])) = ((D == H && D != B && H != F ? D : E) << 16) | (H == F && D != H && B != F ? F : E); - } - else - { - *((unsigned long *) (&dst_line[0][x * 8])) = D == B && B != F && D != H ? D : E; - *((unsigned long *) (&dst_line[0][x * 8 + 4])) = B == F && B != D && F != H ? F : E; - *((unsigned long *) (&dst_line[1][x * 8])) = D == H && D != B && H != F ? D : E; - *((unsigned long *) (&dst_line[1][x * 8 + 4])) = H == F && D != H && B != F ? F : E; - } - } - - src_line[0] = src_line[1]; - src_line[1] = src_line[2]; - if (src_y+y+2 >= BufferHeight) - src_line[2] = src_line[1]; - else - src_line[2] = src_line[1] + BufferWidth; - - if (src_y+y < BufferHeight-1) - { - dst_line[0] = dst_line[1]+dest_pitch; - dst_line[1] = dst_line[0]+dest_pitch; - } - } -} - -void PointScaler::Scale(uint32 src_x, uint32 src_y, uint32 dest_x, uint32 dest_y, uint32 width, uint32 height) -{ - byte *src; - uint32 color; - uint32 r, g, b; - uint32 x, y; - - if (!handle) - return; - - src = (byte *)Buffer+src_y*BufferWidth+src_x; - - dst_line[0] = dest+dest_y*2*dest_pitch+dest_x*2*dest_bpp; - dst_line[1] = dst_line[0]+dest_pitch; - - for (y = 0; y < height; y++) - { - for (x = 0; x < width; x++) - { - r = (ScummColors[*(src+x)] >> 16) & 0xff; - g = (ScummColors[*(src+x)] >> 8) & 0xff; - b = ScummColors[*(src+x)] & 0xff; - - color = MakeColor(dest_pixfmt, r, g, b); - if (PixelsPerMask == 2) - { - if (ScummPCMode) - SWAP_WORD(color); - - *((unsigned long *) (&dst_line[0][x * 4])) = (color << 16) | color; - *((unsigned long *) (&dst_line[1][x * 4])) = (color << 16) | color; - } - else - { - *((unsigned long *) (&dst_line[0][x * 8])) = color; - *((unsigned long *) (&dst_line[0][x * 8 + 4])) = color; - *((unsigned long *) (&dst_line[1][x * 8])) = color; - *((unsigned long *) (&dst_line[1][x * 8 + 4])) = color; - } - } - - src += BufferWidth; - - if (src_y+y < BufferHeight-1) - { - dst_line[0] = dst_line[1]+dest_pitch; - dst_line[1] = dst_line[0]+dest_pitch; - } - } -} - -SCALERTYPE MorphOSScaler::FindByName(const char *ScalerName) -{ - int scaler = 0; - - while (ScummScalers[scaler].gs_Name) - { - if (!stricmp(ScalerName, ScummScalers[scaler].gs_Name)) - return ScummScalers[scaler].gs_Type; - scaler++; - } - - if (ScummScalers[scaler].gs_Name == NULL) - { - puts("Invalid scaler name. Please use one of the following:"); - for (scaler = 0; ScummScalers[scaler].gs_Name != NULL; scaler++) - printf(" %s\n", ScummScalers[scaler].gs_Name); - } - - return ST_INVALID; -} - -SCALERTYPE MorphOSScaler::FindByIndex(int index) -{ - if (index >= 0 && index < 10 && ScummScalers[index].gs_Name) - return ScummScalers[index].gs_Type; - - return ST_INVALID; -} - -const char *MorphOSScaler::GetParamName(SCALERTYPE type) -{ - int scaler = 0; - - while (ScummScalers[scaler].gs_Name) - { - if (ScummScalers[scaler].gs_Type == type) - return ScummScalers[scaler].gs_ParamName; - scaler++; - } - - return NULL; -} - |