scaling: Various trivial changes

This commit is contained in:
Kim Woelders 2023-08-05 20:27:50 +02:00
parent a88b95c289
commit 29397453e4
1 changed files with 36 additions and 54 deletions

View File

@ -24,16 +24,12 @@ struct _imlib_scale_info {
#define YAP (yapoints[dyy + y]) #define YAP (yapoints[dyy + y])
static int * static int *
__imlib_CalcPoints(int sw, int dw, int b1, int b2) __imlib_CalcPoints(int sw, int dw_, int b1, int b2)
{ {
int *p, i; int *p, i;
int val, inc, rv = 0; int val, inc, dw, ss, dd;
if (dw < 0) dw = (dw_ >= 0) ? dw_ : -dw_;
{
dw = -dw;
rv = 1;
}
p = malloc(dw * sizeof(int)); p = malloc(dw * sizeof(int));
if (!p) if (!p)
@ -48,19 +44,16 @@ __imlib_CalcPoints(int sw, int dw, int b1, int b2)
} }
/* Border 1 */ /* Border 1 */
val = 0;
inc = 1 << 16;
for (i = 0; i < b1; i++) for (i = 0; i < b1; i++)
{ p[i] = i;
p[i] = val >> 16;
val += inc;
}
/* Center */ /* Center */
if (i < dw - b2) ss = sw - (b1 + b2);
dd = dw - (b1 + b2);
if (dd > 0)
{ {
val = b1 << 16; val = b1 << 16;
inc = ((sw - (b1 + b2)) << 16) / (dw - (b1 + b2)); inc = (ss << 16) / dd;
for (; i < dw - b2; i++) for (; i < dw - b2; i++)
{ {
p[i] = val >> 16; p[i] = val >> 16;
@ -69,15 +62,11 @@ __imlib_CalcPoints(int sw, int dw, int b1, int b2)
} }
/* Border 2 */ /* Border 2 */
val = (sw - b2) << 16; val = sw - b2;
inc = 1 << 16;
for (; i < dw; i++) for (; i < dw; i++)
{ p[i] = val++;
p[i] = val >> 16;
val += inc;
}
if (rv) if (dw_ < 0)
for (i = dw / 2; --i >= 0;) for (i = dw / 2; --i >= 0;)
{ {
int tmp = p[i]; int tmp = p[i];
@ -90,22 +79,18 @@ __imlib_CalcPoints(int sw, int dw, int b1, int b2)
} }
static int * static int *
__imlib_CalcApoints(int s, int d, int b1, int b2, int up) __imlib_CalcApoints(int sw, int dw_, int b1, int b2, int up)
{ {
int *p, i, rv = 0; int *p, i;
int val, inc; int val, inc, dw, ss, dd;
if (d < 0) dw = (dw_ >= 0) ? dw_ : -dw_;
{
rv = 1;
d = -d;
}
p = malloc(d * sizeof(int)); p = malloc(dw * sizeof(int));
if (!p) if (!p)
return NULL; return NULL;
val = MIN(s, d); val = MIN(sw, dw);
inc = b1 + b2; inc = b1 + b2;
if (val < inc) if (val < inc)
{ {
@ -113,6 +98,8 @@ __imlib_CalcApoints(int s, int d, int b1, int b2, int up)
b2 = val - b1; b2 = val - b1;
} }
ss = sw - (b1 + b2);
dd = dw - (b1 + b2);
if (up) if (up)
{ {
/* Scaling up */ /* Scaling up */
@ -122,25 +109,21 @@ __imlib_CalcApoints(int s, int d, int b1, int b2, int up)
p[i] = 0; p[i] = 0;
/* Center */ /* Center */
if (d > b1 + b2) if (dd > 0)
{ {
int ss, dd;
ss = s - (b1 + b2);
dd = d - (b1 + b2);
val = 0; val = 0;
inc = (ss << 16) / dd; inc = (ss << 16) / dd;
for (; i < d - b2; i++) for (; i < dw - b2; i++)
{ {
p[i] = (val >> 8) - ((val >> 8) & 0xffffff00); p[i] = (val >> 8) - ((val >> 8) & 0xffffff00);
if (((val >> 16) + b1) >= (s - 1)) if (((val >> 16) + b1) >= (sw - 1))
p[i] = 0; p[i] = 0;
val += inc; val += inc;
} }
} }
/* Border 2 */ /* Border 2 */
for (; i < d; i++) for (; i < dw; i++)
p[i] = 0; p[i] = 0;
} }
else else
@ -152,16 +135,14 @@ __imlib_CalcApoints(int s, int d, int b1, int b2, int up)
p[i] = (1 << (16 + 14)) + (1 << 14); p[i] = (1 << (16 + 14)) + (1 << 14);
/* Center */ /* Center */
if (d > b1 + b2) if (dd > 0)
{ {
int ss, dd, ap, Cp; int ap, Cp;
ss = s - (b1 + b2);
dd = d - (b1 + b2);
val = 0; val = 0;
inc = (ss << 16) / dd; inc = (ss << 16) / dd;
Cp = ((dd << 14) / ss) + 1; Cp = ((dd << 14) / ss) + 1;
for (; i < d - b2; i++) for (; i < dw - b2; i++)
{ {
ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8; ap = ((0x100 - ((val >> 8) & 0xff)) * Cp) >> 8;
p[i] = ap | (Cp << 16); p[i] = ap | (Cp << 16);
@ -170,18 +151,18 @@ __imlib_CalcApoints(int s, int d, int b1, int b2, int up)
} }
/* Border 2 */ /* Border 2 */
for (; i < d; i++) for (; i < dw; i++)
p[i] = (1 << (16 + 14)) + (1 << 14); p[i] = (1 << (16 + 14)) + (1 << 14);
} }
if (rv) if (dw_ < 0)
{ {
for (i = d / 2; --i >= 0;) for (i = dw / 2; --i >= 0;)
{ {
int tmp = p[i]; int tmp = p[i];
p[i] = p[d - i - 1]; p[i] = p[dw - i - 1];
p[d - i - 1] = tmp; p[dw - i - 1] = tmp;
} }
} }
@ -232,13 +213,14 @@ __imlib_CalcScaleInfo(ImlibImage * im, int sw, int sh, int dw, int dh, bool aa)
if (aa) if (aa)
{ {
isi->xapoints = __imlib_CalcApoints(im->w, scw, im->border.left, isi->xapoints = __imlib_CalcApoints(im->w, scw,
im->border.right, isi->xup_yup & 1); im->border.left, im->border.right,
isi->xup_yup & 1);
if (!isi->xapoints) if (!isi->xapoints)
goto bail; goto bail;
isi->yapoints = __imlib_CalcApoints(im->h, sch, im->border.top, isi->yapoints = __imlib_CalcApoints(im->h, sch,
im->border.bottom, im->border.top, im->border.bottom,
isi->xup_yup & 2); isi->xup_yup & 2);
if (!isi->yapoints) if (!isi->yapoints)
goto bail; goto bail;