Improved biadapt scaling, from fOSSiL
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@509 8092fc87-c524-0410-9efc-e669fe64eaf9
This commit is contained in:
@@ -201,8 +201,8 @@ TFB_Pure_InitGraphics (int driver, int flags, int width, int height, int bpp)
|
|||||||
|
|
||||||
|
|
||||||
// blends two pixels with ratio 50% - 50%
|
// blends two pixels with ratio 50% - 50%
|
||||||
static Uint32
|
__inline__ Uint32
|
||||||
Scale_BlendPixels(SDL_PixelFormat* fmt, Uint32 pix1, Uint32 pix2)
|
Scale_BlendPixels (SDL_PixelFormat* fmt, Uint32 pix1, Uint32 pix2)
|
||||||
{
|
{
|
||||||
return ((((pix1 & fmt->Rmask) +
|
return ((((pix1 & fmt->Rmask) +
|
||||||
(pix2 & fmt->Rmask)
|
(pix2 & fmt->Rmask)
|
||||||
@@ -215,7 +215,6 @@ Scale_BlendPixels(SDL_PixelFormat* fmt, Uint32 pix1, Uint32 pix2)
|
|||||||
) >> 1) & fmt->Bmask);
|
) >> 1) & fmt->Bmask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// biadapt scaling to 2x
|
// biadapt scaling to 2x
|
||||||
static void
|
static void
|
||||||
Scale_BiAdaptFilter (SDL_Surface *src, SDL_Surface *dst)
|
Scale_BiAdaptFilter (SDL_Surface *src, SDL_Surface *dst)
|
||||||
@@ -226,435 +225,594 @@ Scale_BiAdaptFilter (SDL_Surface *src, SDL_Surface *dst)
|
|||||||
|
|
||||||
switch (fmt->BytesPerPixel)
|
switch (fmt->BytesPerPixel)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2: // 16bpp scaling
|
||||||
|
#define BIADAPT_GETPIX(p) ( *(Uint16 *)(p) )
|
||||||
|
#define BIADAPT_SETPIX(p, c) ( *(Uint16 *)(p) = (c) )
|
||||||
|
#define BIADAPT_BUF Uint16
|
||||||
|
#define BIADAPT_CLR Uint16
|
||||||
{
|
{
|
||||||
Uint16 *src_p = (Uint16 *)src->pixels;
|
BIADAPT_BUF *src_p = (BIADAPT_BUF *)src->pixels;
|
||||||
Uint16 *dst_p = (Uint16 *)dst->pixels;
|
BIADAPT_BUF *dst_p = (BIADAPT_BUF *)dst->pixels;
|
||||||
Uint16 pixval_tl, pixval_tr, pixval_bl, pixval_br;
|
BIADAPT_CLR pixval_tl, pixval_tr, pixval_bl, pixval_br;
|
||||||
|
|
||||||
for (y = 0; y < h; ++y)
|
for (y = 0; y < h; y++, dst_p += dw)
|
||||||
{
|
{
|
||||||
for (x = 0; x < w; ++x)
|
for (x = 0; x < w; x++, src_p++, dst_p++)
|
||||||
{
|
{
|
||||||
pixval_tl = *src_p;
|
pixval_tl = BIADAPT_GETPIX (src_p);
|
||||||
|
|
||||||
*dst_p = pixval_tl;
|
BIADAPT_SETPIX (dst_p, pixval_tl);
|
||||||
|
|
||||||
if (y + 1 < h)
|
if (y + 1 < h)
|
||||||
{
|
{
|
||||||
// check pixel below the current one
|
// check pixel below the current one
|
||||||
pixval_bl = src_p[w];
|
pixval_bl = BIADAPT_GETPIX (src_p + w);
|
||||||
|
|
||||||
if (pixval_tl == pixval_bl)
|
if (pixval_tl == pixval_bl)
|
||||||
dst_p[dw] = pixval_tl;
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
else
|
else
|
||||||
dst_p[dw] = Scale_BlendPixels (fmt, pixval_tl, pixval_bl);
|
BIADAPT_SETPIX (dst_p + dw, Scale_BlendPixels (
|
||||||
|
fmt, pixval_tl, pixval_bl)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// last pixel in column - propagate
|
// last pixel in column - propagate
|
||||||
dst_p[dw] = pixval_tl;
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
}
|
}
|
||||||
dst_p++;
|
dst_p++;
|
||||||
src_p++;
|
|
||||||
|
|
||||||
if (x + 1 < w)
|
|
||||||
|
if (x + 1 >= w)
|
||||||
{
|
{
|
||||||
// check pixel to the right from the current one
|
// last pixel in row - propagate
|
||||||
pixval_tr = *src_p;
|
BIADAPT_SETPIX (dst_p, pixval_tl);
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check pixel to the right from the current one
|
||||||
|
pixval_tr = BIADAPT_GETPIX (src_p + 1);
|
||||||
|
|
||||||
|
if (pixval_tl == pixval_tr)
|
||||||
|
BIADAPT_SETPIX (dst_p, pixval_tr);
|
||||||
|
else
|
||||||
|
BIADAPT_SETPIX (dst_p, Scale_BlendPixels (
|
||||||
|
fmt, pixval_tl, pixval_tr)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (y + 1 >= h)
|
||||||
|
{
|
||||||
|
// last pixel in column - propagate
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check pixel to the bottom-right
|
||||||
|
pixval_br = BIADAPT_GETPIX (src_p + 1 + w);
|
||||||
|
|
||||||
|
if (pixval_tl == pixval_br && pixval_tr == pixval_bl)
|
||||||
|
{
|
||||||
|
int cl, cr;
|
||||||
|
BIADAPT_CLR clr;
|
||||||
|
|
||||||
if (pixval_tl == pixval_tr)
|
if (pixval_tl == pixval_tr)
|
||||||
*dst_p = pixval_tr;
|
|
||||||
else
|
|
||||||
*dst_p = Scale_BlendPixels (fmt, pixval_tl, pixval_tr);
|
|
||||||
|
|
||||||
if (y + 1 < h)
|
|
||||||
{
|
{
|
||||||
// check pixel to the bottom-right
|
// all 4 are equal - propagate
|
||||||
pixval_br = src_p[w];
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
if (pixval_tl == pixval_br && pixval_tr == pixval_bl)
|
|
||||||
{
|
|
||||||
// both pairs are equal, have to resolve
|
|
||||||
// the contention; we try detecting which
|
|
||||||
// color is background by looking for
|
|
||||||
// a line or a simple join
|
|
||||||
int cl = 1, cr = 1;
|
|
||||||
|
|
||||||
if (x > 0)
|
|
||||||
{
|
|
||||||
if (src_p[-2] == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
if (src_p[-2 + w] == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (y > 0)
|
|
||||||
{
|
|
||||||
if (src_p[-1 - w] == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
if (src_p[-w] == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x + 2 < w && src_p[1] == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
|
|
||||||
if (y + 2 < h && src_p[1 + w] == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
// least count wins
|
|
||||||
if (cl > cr)
|
|
||||||
dst_p[dw] = pixval_tr;
|
|
||||||
else if (cr > cl)
|
|
||||||
dst_p[dw] = pixval_tl;
|
|
||||||
else
|
|
||||||
dst_p[dw] = Scale_BlendPixels (fmt, pixval_tl, pixval_tr);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (pixval_tl == pixval_br)
|
|
||||||
{
|
|
||||||
// main diagonal is same color
|
|
||||||
// use its value
|
|
||||||
dst_p[dw] = pixval_tl;
|
|
||||||
}
|
|
||||||
else if (pixval_tr == pixval_bl)
|
|
||||||
{
|
|
||||||
// 2nd diagonal is same color
|
|
||||||
// use its value
|
|
||||||
dst_p[dw] = pixval_tr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// blend all 4
|
|
||||||
dst_p[dw] =
|
|
||||||
((((pixval_tl & fmt->Rmask) +
|
|
||||||
(pixval_bl & fmt->Rmask) +
|
|
||||||
(pixval_tr & fmt->Rmask) +
|
|
||||||
(pixval_br & fmt->Rmask)
|
|
||||||
) >> 2) & fmt->Rmask) |
|
|
||||||
((((pixval_tl & fmt->Gmask) +
|
|
||||||
(pixval_bl & fmt->Gmask) +
|
|
||||||
(pixval_tr & fmt->Gmask) +
|
|
||||||
(pixval_br & fmt->Gmask)
|
|
||||||
) >> 2) & fmt->Gmask) |
|
|
||||||
((((pixval_tl & fmt->Bmask) +
|
|
||||||
(pixval_bl & fmt->Bmask) +
|
|
||||||
(pixval_tr & fmt->Bmask) +
|
|
||||||
(pixval_br & fmt->Bmask)
|
|
||||||
) >> 2) & fmt->Bmask);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// both pairs are equal, have to resolve the pixel
|
||||||
|
// race; we try detecting which color is
|
||||||
|
// the background by looking for a line or an edge
|
||||||
|
// examine 8 pixels surrounding the current quad
|
||||||
|
|
||||||
|
cl = cr = 1;
|
||||||
|
|
||||||
|
if (x > 0)
|
||||||
{
|
{
|
||||||
// last pixel in column - propagate
|
clr = BIADAPT_GETPIX (src_p - 1);
|
||||||
dst_p[dw] = pixval_tl;
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p - 1 + w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (y > 0)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p - w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 1 - w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x + 2 < w)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2 + w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y + 2 < h)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2 * w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 1 + 2 * w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// least count wins
|
||||||
|
if (cl > cr)
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tr);
|
||||||
|
else if (cr > cl)
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
else
|
||||||
|
BIADAPT_SETPIX (dst_p + dw,
|
||||||
|
Scale_BlendPixels (fmt, pixval_tl,
|
||||||
|
pixval_tr));
|
||||||
|
}
|
||||||
|
else if (pixval_tl == pixval_br)
|
||||||
|
{
|
||||||
|
// main diagonal is same color
|
||||||
|
// use its value
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
}
|
||||||
|
else if (pixval_tr == pixval_bl)
|
||||||
|
{
|
||||||
|
// 2nd diagonal is same color
|
||||||
|
// use its value
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// last pixel in row - propagate
|
// blend all 4
|
||||||
*dst_p = pixval_tl;
|
BIADAPT_SETPIX (dst_p + dw,
|
||||||
dst_p[dw] = pixval_tl;
|
((((pixval_tl & fmt->Rmask) +
|
||||||
|
(pixval_bl & fmt->Rmask) +
|
||||||
|
(pixval_tr & fmt->Rmask) +
|
||||||
|
(pixval_br & fmt->Rmask)
|
||||||
|
) >> 2) & fmt->Rmask) |
|
||||||
|
((((pixval_tl & fmt->Gmask) +
|
||||||
|
(pixval_bl & fmt->Gmask) +
|
||||||
|
(pixval_tr & fmt->Gmask) +
|
||||||
|
(pixval_br & fmt->Gmask)
|
||||||
|
) >> 2) & fmt->Gmask) |
|
||||||
|
((((pixval_tl & fmt->Bmask) +
|
||||||
|
(pixval_bl & fmt->Bmask) +
|
||||||
|
(pixval_tr & fmt->Bmask) +
|
||||||
|
(pixval_br & fmt->Bmask)
|
||||||
|
) >> 2) & fmt->Bmask));
|
||||||
}
|
}
|
||||||
dst_p++;
|
|
||||||
}
|
}
|
||||||
dst_p += dw;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3:
|
#undef BIADAPT_GETPIX
|
||||||
|
#undef BIADAPT_SETPIX
|
||||||
|
#undef BIADAPT_BUF
|
||||||
|
#undef BIADAPT_CLR
|
||||||
|
|
||||||
|
case 3: // 24bpp scaling
|
||||||
|
#define BIADAPT_GETPIX(p) GET_PIX_24BIT(p)
|
||||||
|
#define BIADAPT_SETPIX(p, c) SET_PIX_24BIT(p, c)
|
||||||
|
#define BIADAPT_BUF PIXEL_24BIT
|
||||||
|
#define BIADAPT_CLR Uint32
|
||||||
{
|
{
|
||||||
PIXEL_24BIT *src_p = (PIXEL_24BIT *)src->pixels;
|
BIADAPT_BUF *src_p = (BIADAPT_BUF *)src->pixels;
|
||||||
PIXEL_24BIT *dst_p = (PIXEL_24BIT *)dst->pixels;
|
BIADAPT_BUF *dst_p = (BIADAPT_BUF *)dst->pixels;
|
||||||
Uint32 pixval_tl, pixval_tr, pixval_bl, pixval_br;
|
BIADAPT_CLR pixval_tl, pixval_tr, pixval_bl, pixval_br;
|
||||||
|
|
||||||
for (y = 0; y < h; ++y)
|
for (y = 0; y < h; y++, dst_p += dw)
|
||||||
{
|
{
|
||||||
for (x = 0; x < w; ++x)
|
for (x = 0; x < w; x++, src_p++, dst_p++)
|
||||||
{
|
{
|
||||||
pixval_tl = GET_PIX_24BIT (src_p);
|
pixval_tl = BIADAPT_GETPIX (src_p);
|
||||||
|
|
||||||
SET_PIX_24BIT (dst_p, pixval_tl);
|
BIADAPT_SETPIX (dst_p, pixval_tl);
|
||||||
|
|
||||||
if (y + 1 < h)
|
if (y + 1 < h)
|
||||||
{
|
{
|
||||||
// check pixel below the current one
|
// check pixel below the current one
|
||||||
pixval_bl = GET_PIX_24BIT (src_p + w);
|
pixval_bl = BIADAPT_GETPIX (src_p + w);
|
||||||
|
|
||||||
if (pixval_tl == pixval_bl)
|
if (pixval_tl == pixval_bl)
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tl);
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
else
|
else
|
||||||
SET_PIX_24BIT (dst_p + dw,
|
BIADAPT_SETPIX (dst_p + dw, Scale_BlendPixels (
|
||||||
Scale_BlendPixels (
|
fmt, pixval_tl, pixval_bl)
|
||||||
fmt, pixval_tl, pixval_bl
|
);
|
||||||
));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// last pixel in column - propagate
|
// last pixel in column - propagate
|
||||||
SET_PIX_24BIT(dst_p + dw, pixval_tl);
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
}
|
}
|
||||||
dst_p++;
|
dst_p++;
|
||||||
src_p++;
|
|
||||||
|
|
||||||
if (x + 1 < w)
|
|
||||||
|
if (x + 1 >= w)
|
||||||
{
|
{
|
||||||
// check pixel to the right from the current one
|
// last pixel in row - propagate
|
||||||
pixval_tr = GET_PIX_24BIT (src_p);
|
BIADAPT_SETPIX (dst_p, pixval_tl);
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check pixel to the right from the current one
|
||||||
|
pixval_tr = BIADAPT_GETPIX (src_p + 1);
|
||||||
|
|
||||||
|
if (pixval_tl == pixval_tr)
|
||||||
|
BIADAPT_SETPIX (dst_p, pixval_tr);
|
||||||
|
else
|
||||||
|
BIADAPT_SETPIX (dst_p, Scale_BlendPixels (
|
||||||
|
fmt, pixval_tl, pixval_tr)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (y + 1 >= h)
|
||||||
|
{
|
||||||
|
// last pixel in column - propagate
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check pixel to the bottom-right
|
||||||
|
pixval_br = BIADAPT_GETPIX (src_p + 1 + w);
|
||||||
|
|
||||||
|
if (pixval_tl == pixval_br && pixval_tr == pixval_bl)
|
||||||
|
{
|
||||||
|
int cl, cr;
|
||||||
|
BIADAPT_CLR clr;
|
||||||
|
|
||||||
if (pixval_tl == pixval_tr)
|
if (pixval_tl == pixval_tr)
|
||||||
SET_PIX_24BIT (dst_p, pixval_tr);
|
|
||||||
else
|
|
||||||
SET_PIX_24BIT (dst_p, Scale_BlendPixels (
|
|
||||||
fmt, pixval_tl, pixval_tr
|
|
||||||
));
|
|
||||||
|
|
||||||
if (y + 1 < h)
|
|
||||||
{
|
{
|
||||||
// check pixel to the bottom-right
|
// all 4 are equal - propagate
|
||||||
pixval_br = GET_PIX_24BIT (src_p + w);
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
if (pixval_tl == pixval_br && pixval_tr == pixval_bl)
|
|
||||||
{
|
|
||||||
// both pairs are equal, have to resolve
|
|
||||||
// the contention; we try detecting which
|
|
||||||
// color is background by looking for
|
|
||||||
// a line or a simple join
|
|
||||||
int cl = 1, cr = 1;
|
|
||||||
|
|
||||||
if (x > 0)
|
|
||||||
{
|
|
||||||
if (GET_PIX_24BIT (src_p - 2) == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
if (GET_PIX_24BIT (src_p - 2 + w) == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (y > 0)
|
|
||||||
{
|
|
||||||
if (GET_PIX_24BIT(src_p - 1 - w) == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
if (GET_PIX_24BIT (src_p - w) == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x + 2 < w && GET_PIX_24BIT (src_p + 1) == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
|
|
||||||
if (y + 2 < h && GET_PIX_24BIT (src_p + 1 + w) == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
// least count wins
|
|
||||||
if (cl > cr)
|
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tr);
|
|
||||||
else if (cr > cl)
|
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tl);
|
|
||||||
else
|
|
||||||
SET_PIX_24BIT (dst_p + dw,
|
|
||||||
Scale_BlendPixels (
|
|
||||||
fmt, pixval_tl, pixval_tr
|
|
||||||
));
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (pixval_tl == pixval_br)
|
|
||||||
{
|
|
||||||
// main diagonal is same color
|
|
||||||
// use it value
|
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tl);
|
|
||||||
}
|
|
||||||
else if (pixval_tr == pixval_bl)
|
|
||||||
{
|
|
||||||
// 2nd diagonal is same color
|
|
||||||
// use it value
|
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// blend all 4
|
|
||||||
SET_PIX_24BIT (dst_p + dw,
|
|
||||||
((((pixval_tl & fmt->Rmask) +
|
|
||||||
(pixval_bl & fmt->Rmask) +
|
|
||||||
(pixval_tr & fmt->Rmask) +
|
|
||||||
(pixval_br & fmt->Rmask)
|
|
||||||
) >> 2) & fmt->Rmask) |
|
|
||||||
((((pixval_tl & fmt->Gmask) +
|
|
||||||
(pixval_bl & fmt->Gmask) +
|
|
||||||
(pixval_tr & fmt->Gmask) +
|
|
||||||
(pixval_br & fmt->Gmask)
|
|
||||||
) >> 2) & fmt->Gmask) |
|
|
||||||
((((pixval_tl & fmt->Bmask) +
|
|
||||||
(pixval_bl & fmt->Bmask) +
|
|
||||||
(pixval_tr & fmt->Bmask) +
|
|
||||||
(pixval_br & fmt->Bmask)
|
|
||||||
) >> 2) & fmt->Bmask)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// both pairs are equal, have to resolve the pixel
|
||||||
|
// race; we try detecting which color is
|
||||||
|
// the background by looking for a line or an edge
|
||||||
|
// examine 8 pixels surrounding the current quad
|
||||||
|
|
||||||
|
cl = cr = 1;
|
||||||
|
|
||||||
|
if (x > 0)
|
||||||
{
|
{
|
||||||
// last pixel in column - propagate
|
clr = BIADAPT_GETPIX (src_p - 1);
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tl);
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p - 1 + w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (y > 0)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p - w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 1 - w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x + 2 < w)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2 + w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y + 2 < h)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2 * w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 1 + 2 * w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// least count wins
|
||||||
|
if (cl > cr)
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tr);
|
||||||
|
else if (cr > cl)
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
else
|
||||||
|
BIADAPT_SETPIX (dst_p + dw,
|
||||||
|
Scale_BlendPixels (fmt, pixval_tl,
|
||||||
|
pixval_tr));
|
||||||
|
}
|
||||||
|
else if (pixval_tl == pixval_br)
|
||||||
|
{
|
||||||
|
// main diagonal is same color
|
||||||
|
// use its value
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
}
|
||||||
|
else if (pixval_tr == pixval_bl)
|
||||||
|
{
|
||||||
|
// 2nd diagonal is same color
|
||||||
|
// use its value
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// last pixel in row - propagate
|
// blend all 4
|
||||||
SET_PIX_24BIT (dst_p, pixval_tl);
|
BIADAPT_SETPIX (dst_p + dw,
|
||||||
SET_PIX_24BIT (dst_p + dw, pixval_tl);
|
((((pixval_tl & fmt->Rmask) +
|
||||||
|
(pixval_bl & fmt->Rmask) +
|
||||||
|
(pixval_tr & fmt->Rmask) +
|
||||||
|
(pixval_br & fmt->Rmask)
|
||||||
|
) >> 2) & fmt->Rmask) |
|
||||||
|
((((pixval_tl & fmt->Gmask) +
|
||||||
|
(pixval_bl & fmt->Gmask) +
|
||||||
|
(pixval_tr & fmt->Gmask) +
|
||||||
|
(pixval_br & fmt->Gmask)
|
||||||
|
) >> 2) & fmt->Gmask) |
|
||||||
|
((((pixval_tl & fmt->Bmask) +
|
||||||
|
(pixval_bl & fmt->Bmask) +
|
||||||
|
(pixval_tr & fmt->Bmask) +
|
||||||
|
(pixval_br & fmt->Bmask)
|
||||||
|
) >> 2) & fmt->Bmask));
|
||||||
}
|
}
|
||||||
dst_p++;
|
|
||||||
}
|
}
|
||||||
dst_p += dw;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 4:
|
#undef BIADAPT_GETPIX
|
||||||
|
#undef BIADAPT_SETPIX
|
||||||
|
#undef BIADAPT_BUF
|
||||||
|
#undef BIADAPT_CLR
|
||||||
|
|
||||||
|
case 4: // 32bpp scaling
|
||||||
|
#define BIADAPT_GETPIX(p) ( *(Uint32 *)(p) )
|
||||||
|
#define BIADAPT_SETPIX(p, c) ( *(Uint32 *)(p) = (c) )
|
||||||
|
#define BIADAPT_BUF Uint32
|
||||||
|
#define BIADAPT_CLR Uint32
|
||||||
{
|
{
|
||||||
Uint32 *src_p = (Uint32 *)src->pixels;
|
BIADAPT_BUF *src_p = (BIADAPT_BUF *)src->pixels;
|
||||||
Uint32 *dst_p = (Uint32 *)dst->pixels;
|
BIADAPT_BUF *dst_p = (BIADAPT_BUF *)dst->pixels;
|
||||||
Uint32 pixval_tl, pixval_tr, pixval_bl, pixval_br;
|
BIADAPT_CLR pixval_tl, pixval_tr, pixval_bl, pixval_br;
|
||||||
|
|
||||||
for (y = 0; y < h; ++y)
|
for (y = 0; y < h; y++, dst_p += dw)
|
||||||
{
|
{
|
||||||
for (x = 0; x < w; ++x)
|
for (x = 0; x < w; x++, src_p++, dst_p++)
|
||||||
{
|
{
|
||||||
pixval_tl = *src_p;
|
pixval_tl = BIADAPT_GETPIX (src_p);
|
||||||
|
|
||||||
*dst_p = pixval_tl;
|
BIADAPT_SETPIX (dst_p, pixval_tl);
|
||||||
|
|
||||||
if (y + 1 < h)
|
if (y + 1 < h)
|
||||||
{
|
{
|
||||||
// check pixel below the current one
|
// check pixel below the current one
|
||||||
pixval_bl = src_p[w];
|
pixval_bl = BIADAPT_GETPIX (src_p + w);
|
||||||
|
|
||||||
if (pixval_tl == pixval_bl)
|
if (pixval_tl == pixval_bl)
|
||||||
dst_p[dw] = pixval_tl;
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
else
|
else
|
||||||
dst_p[dw] = Scale_BlendPixels (fmt, pixval_tl, pixval_bl);
|
BIADAPT_SETPIX (dst_p + dw, Scale_BlendPixels (
|
||||||
|
fmt, pixval_tl, pixval_bl)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// last pixel in column - propagate
|
// last pixel in column - propagate
|
||||||
dst_p[dw] = pixval_tl;
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
}
|
}
|
||||||
dst_p++;
|
dst_p++;
|
||||||
src_p++;
|
|
||||||
|
|
||||||
if (x + 1 < w)
|
|
||||||
|
if (x + 1 >= w)
|
||||||
{
|
{
|
||||||
// check pixel to the right from the current one
|
// last pixel in row - propagate
|
||||||
pixval_tr = *src_p;
|
BIADAPT_SETPIX (dst_p, pixval_tl);
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check pixel to the right from the current one
|
||||||
|
pixval_tr = BIADAPT_GETPIX (src_p + 1);
|
||||||
|
|
||||||
|
if (pixval_tl == pixval_tr)
|
||||||
|
BIADAPT_SETPIX (dst_p, pixval_tr);
|
||||||
|
else
|
||||||
|
BIADAPT_SETPIX (dst_p, Scale_BlendPixels (
|
||||||
|
fmt, pixval_tl, pixval_tr)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (y + 1 >= h)
|
||||||
|
{
|
||||||
|
// last pixel in column - propagate
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check pixel to the bottom-right
|
||||||
|
pixval_br = BIADAPT_GETPIX (src_p + 1 + w);
|
||||||
|
|
||||||
|
if (pixval_tl == pixval_br && pixval_tr == pixval_bl)
|
||||||
|
{
|
||||||
|
int cl, cr;
|
||||||
|
BIADAPT_CLR clr;
|
||||||
|
|
||||||
if (pixval_tl == pixval_tr)
|
if (pixval_tl == pixval_tr)
|
||||||
*dst_p = pixval_tr;
|
|
||||||
else
|
|
||||||
*dst_p = Scale_BlendPixels (fmt, pixval_tl, pixval_tr);
|
|
||||||
|
|
||||||
if (y + 1 < h)
|
|
||||||
{
|
{
|
||||||
// check pixel to the bottom-right
|
// all 4 are equal - propagate
|
||||||
pixval_br = src_p[w];
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
continue;
|
||||||
if (pixval_tl == pixval_br && pixval_tr == pixval_bl)
|
|
||||||
{
|
|
||||||
// both pairs are equal, have to resolve
|
|
||||||
// the contention; we try detecting which
|
|
||||||
// color is background by looking for
|
|
||||||
// a line or a simple join
|
|
||||||
int cl = 1, cr = 1;
|
|
||||||
|
|
||||||
if (x > 0)
|
|
||||||
{
|
|
||||||
if (src_p[-2] == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
if (src_p[-2 + w] == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (y > 0)
|
|
||||||
{
|
|
||||||
if (src_p[-1 - w] == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
if (src_p[-w] == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x + 2 < w && src_p[1] == pixval_tr)
|
|
||||||
cr++;
|
|
||||||
|
|
||||||
if (y + 2 < h && src_p[1 + w] == pixval_tl)
|
|
||||||
cl++;
|
|
||||||
|
|
||||||
// least count wins
|
|
||||||
if (cl > cr)
|
|
||||||
dst_p[dw] = pixval_tr;
|
|
||||||
else if (cr > cl)
|
|
||||||
dst_p[dw] = pixval_tl;
|
|
||||||
else
|
|
||||||
dst_p[dw] = Scale_BlendPixels (fmt, pixval_tl, pixval_tr);
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (pixval_tl == pixval_br)
|
|
||||||
{
|
|
||||||
// main diagonal is same color
|
|
||||||
// use its value
|
|
||||||
dst_p[dw] = pixval_tl;
|
|
||||||
}
|
|
||||||
else if (pixval_tr == pixval_bl)
|
|
||||||
{
|
|
||||||
// 2nd diagonal is same color
|
|
||||||
// use its value
|
|
||||||
dst_p[dw] = pixval_tr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// blend all 4
|
|
||||||
dst_p[dw] =
|
|
||||||
((((pixval_tl & fmt->Rmask) +
|
|
||||||
(pixval_bl & fmt->Rmask) +
|
|
||||||
(pixval_tr & fmt->Rmask) +
|
|
||||||
(pixval_br & fmt->Rmask)
|
|
||||||
) >> 2) & fmt->Rmask) |
|
|
||||||
((((pixval_tl & fmt->Gmask) +
|
|
||||||
(pixval_bl & fmt->Gmask) +
|
|
||||||
(pixval_tr & fmt->Gmask) +
|
|
||||||
(pixval_br & fmt->Gmask)
|
|
||||||
) >> 2) & fmt->Gmask) |
|
|
||||||
((((pixval_tl & fmt->Bmask) +
|
|
||||||
(pixval_bl & fmt->Bmask) +
|
|
||||||
(pixval_tr & fmt->Bmask) +
|
|
||||||
(pixval_br & fmt->Bmask)
|
|
||||||
) >> 2) & fmt->Bmask);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// both pairs are equal, have to resolve the pixel
|
||||||
|
// race; we try detecting which color is
|
||||||
|
// the background by looking for a line or an edge
|
||||||
|
// examine 8 pixels surrounding the current quad
|
||||||
|
|
||||||
|
cl = cr = 1;
|
||||||
|
|
||||||
|
if (x > 0)
|
||||||
{
|
{
|
||||||
// last pixel in column - propagate
|
clr = BIADAPT_GETPIX (src_p - 1);
|
||||||
dst_p[dw] = pixval_tl;
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p - 1 + w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (y > 0)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p - w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 1 - w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x + 2 < w)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2 + w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (y + 2 < h)
|
||||||
|
{
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 2 * w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
|
||||||
|
clr = BIADAPT_GETPIX (src_p + 1 + 2 * w);
|
||||||
|
if (clr == pixval_tl)
|
||||||
|
cl++;
|
||||||
|
else if (clr == pixval_tr)
|
||||||
|
cr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// least count wins
|
||||||
|
if (cl > cr)
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tr);
|
||||||
|
else if (cr > cl)
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
else
|
||||||
|
BIADAPT_SETPIX (dst_p + dw,
|
||||||
|
Scale_BlendPixels (fmt, pixval_tl,
|
||||||
|
pixval_tr));
|
||||||
|
}
|
||||||
|
else if (pixval_tl == pixval_br)
|
||||||
|
{
|
||||||
|
// main diagonal is same color
|
||||||
|
// use its value
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tl);
|
||||||
|
}
|
||||||
|
else if (pixval_tr == pixval_bl)
|
||||||
|
{
|
||||||
|
// 2nd diagonal is same color
|
||||||
|
// use its value
|
||||||
|
BIADAPT_SETPIX (dst_p + dw, pixval_tr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// last pixel in row - propagate
|
// blend all 4
|
||||||
*dst_p = pixval_tl;
|
BIADAPT_SETPIX (dst_p + dw,
|
||||||
dst_p[dw] = pixval_tl;
|
((((pixval_tl & fmt->Rmask) +
|
||||||
|
(pixval_bl & fmt->Rmask) +
|
||||||
|
(pixval_tr & fmt->Rmask) +
|
||||||
|
(pixval_br & fmt->Rmask)
|
||||||
|
) >> 2) & fmt->Rmask) |
|
||||||
|
((((pixval_tl & fmt->Gmask) +
|
||||||
|
(pixval_bl & fmt->Gmask) +
|
||||||
|
(pixval_tr & fmt->Gmask) +
|
||||||
|
(pixval_br & fmt->Gmask)
|
||||||
|
) >> 2) & fmt->Gmask) |
|
||||||
|
((((pixval_tl & fmt->Bmask) +
|
||||||
|
(pixval_bl & fmt->Bmask) +
|
||||||
|
(pixval_tr & fmt->Bmask) +
|
||||||
|
(pixval_br & fmt->Bmask)
|
||||||
|
) >> 2) & fmt->Bmask));
|
||||||
}
|
}
|
||||||
dst_p++;
|
|
||||||
}
|
}
|
||||||
dst_p += dw;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#undef BIADAPT_GETPIX
|
||||||
|
#undef BIADAPT_SETPIX
|
||||||
|
#undef BIADAPT_BUF
|
||||||
|
#undef BIADAPT_CLR
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user