forked from enlightenment/efl
evas: NEON scaling up fixed
Summary: Previous implementation loaded data from memory first and then checked the borders. Here I check the borders first as it is for C implementation. This prevents read of non-accessible memory. Reviewers: cedric, jypark, Hermet, jiin.moon, jpeg Reviewed By: jpeg Projects: #efl Differential Revision: https://phab.enlightenment.org/D3809
This commit is contained in:
parent
f9e6550468
commit
b82382e958
|
@ -234,6 +234,7 @@
|
||||||
uint32x2x2_t vp0, vp1;
|
uint32x2x2_t vp0, vp1;
|
||||||
uint16x8_t vax;
|
uint16x8_t vax;
|
||||||
uint16x8_t vax1;
|
uint16x8_t vax1;
|
||||||
|
DATA32 pa[2][4];
|
||||||
#else
|
#else
|
||||||
DATA32 p0, p1, p2, p3;
|
DATA32 p0, p1, p2, p3;
|
||||||
#endif
|
#endif
|
||||||
|
@ -242,30 +243,34 @@
|
||||||
ax = 1 + ((sxx - (sx << 16)) >> 8);
|
ax = 1 + ((sxx - (sx << 16)) >> 8);
|
||||||
p = psrc + sx; q = p + src_w;
|
p = psrc + sx; q = p + src_w;
|
||||||
#ifdef SCALE_USING_NEON
|
#ifdef SCALE_USING_NEON
|
||||||
vax = vdupq_n_u16(ax);
|
pa[0][0] = pa[0][1] = pa[0][2] = pa[0][3] = *p;
|
||||||
vp0.val[0] = vld1_u32(p);
|
if ((sx + 1) < srw)
|
||||||
vp0.val[1] = vld1_u32(q);
|
pa[0][1] = *(p + 1);
|
||||||
if ((sx + 1) >= srw)
|
if ((sy + 1) < srh)
|
||||||
{
|
{
|
||||||
vp0.val[0] = vdup_lane_u32(vp0.val[0], 0); // p0, p1
|
pa[0][2] = *q; pa[0][3] = pa[0][2];
|
||||||
vp0.val[1] = vdup_lane_u32(vp0.val[1], 0); // p2, p3
|
if ((sx + 1) < srw)
|
||||||
|
pa[0][3] = *(q + 1);
|
||||||
}
|
}
|
||||||
if ((sy + 1) >= srh)
|
vax = vdupq_n_u16(ax);
|
||||||
vp0.val[1] = vdup_lane_u32(vp0.val[0], 0);
|
vp0.val[0] = vld1_u32(&pa[0][0]);
|
||||||
|
vp0.val[1] = vld1_u32(&pa[0][2]);
|
||||||
sxx += dsxx;
|
sxx += dsxx;
|
||||||
sx = sxx >> 16;
|
sx = sxx >> 16;
|
||||||
ax1 = 1 + ((sxx - (sx << 16)) >> 8);
|
ax1 = 1 + ((sxx - (sx << 16)) >> 8);
|
||||||
vax1 = vdupq_n_u16(ax1);
|
|
||||||
p1 = psrc + sx; q1 = p1 + src_w;
|
p1 = psrc + sx; q1 = p1 + src_w;
|
||||||
vp1.val[0] = vld1_u32(p1);
|
pa[1][0] = pa[1][1] = pa[1][2] = pa[1][3] = *p1;
|
||||||
vp1.val[1] = vld1_u32(q1);
|
if ((sx + 1) < srw)
|
||||||
if ((sx + 1) >= srw)
|
pa[1][1] = *(p1 + 1);
|
||||||
|
if ((sy + 1) < srh)
|
||||||
{
|
{
|
||||||
vp1.val[0] = vdup_lane_u32(vp1.val[0], 0); // p4, p5
|
pa[1][2] = *q1; pa[1][3] = pa[1][2];
|
||||||
vp1.val[1] = vdup_lane_u32(vp1.val[1], 0); // p6, p7
|
if ((sx + 1) < srw)
|
||||||
|
pa[1][3] = *(q1 + 1);
|
||||||
}
|
}
|
||||||
if ((sy + 1) >= srh)
|
vax1 = vdupq_n_u16(ax1);
|
||||||
vp1.val[1] = vdup_lane_u32(vp1.val[0], 0);
|
vp1.val[0] = vld1_u32(&pa[1][0]);
|
||||||
|
vp1.val[1] = vld1_u32(&pa[1][2]);
|
||||||
#else
|
#else
|
||||||
p0 = p1 = p2 = p3 = *p;
|
p0 = p1 = p2 = p3 = *p;
|
||||||
if ((sx + 1) < srw)
|
if ((sx + 1) < srw)
|
||||||
|
|
Loading…
Reference in New Issue