/** Get amplitude for given frequency multiplied with given percentage */
uint32_t MotorVoltage::GetAmpPerc(u32fp frq, uint32_t perc)
{
   uint32_t amp = (perc * (FP_TOINT(FP_MUL(fac, frq)) + boost)) / 100;
   if (frq < minFrq)
   {
      amp = 0;
   }
   if (amp > maxAmp)
   {
      amp = maxAmp;
   }
   if (frq > (maxFrq - FRQ_DRT_STR))
   {
      s32fp diff = maxFrq - frq;
      diff = diff < 0 ? 0 : diff;
      amp = FP_TOINT(FP_MUL(FP_FROMINT(amp), FP_DIV(diff, FRQ_DRT_STR)));
   }
   return amp;
}
/** Calculate slope of u/f */
void MotorVoltage::CalcFac()
{
   fac = FP_DIV(FP_FROMINT(maxAmp - boost), endFrq);
}
/**
* Get a parameters scaled SI value
*
* @param[in] ParamNum Parameter index
* @return Parameters value
*/
s32fp parm_GetScl(PARAM_NUM ParamNum)
{
    return FP_DIV(values[ParamNum], attribs[ParamNum].fac) - attribs[ParamNum].ofs;
}
mlib_status
mlib_ZoomBlendEdge(
	mlib_image *dst,
	const mlib_image *src,
	mlib_work_image * param,
	mlib_filter filter,
	mlib_edge edge,
	mlib_s32 alp_ind)
{
	mlib_s32 schan, dchan, t_ind, bsize, i, j, k;
	mlib_blend blend = param->blend;
	mlib_edge_box *edges = param->edges;
	mlib_u8 *buff, *pbuff;

	schan = mlib_ImageGetChannels(src);
	dchan = mlib_ImageGetChannels(dst);
	t_ind = (schan - 3) + 2 * (dchan - 3);

	bsize = 0;
	for (i = 0; i < 4; i++) {
		if (edges[i].w < 0) edges[i].w = 0;
		if (edges[i].h < 0) edges[i].h = 0;
		bsize += edges[i].w * edges[i].h;
	}

	if (!bsize)
		return (MLIB_SUCCESS);

	bsize *= schan;

	mlib_ImageCopy_na((void *)edges, (void *)&(param->edges_blend),
		sizeof (param->edges_blend));

	pbuff = buff = __mlib_malloc(bsize);

	if (buff == NULL)
		return (MLIB_FAILURE);

	for (i = 0; i < 4; i++) {
		mlib_s32 dlb = schan * edges[i].w;

		edges[i].dp = pbuff;
		edges[i].dlb = dlb;
		pbuff += dlb * edges[i].h;
	}

	MLIB_EDGE_RULES;

	for (k = 0; k < 4; k++) {
		mlib_s32 ww = edges[k].w;
		mlib_s32 hh = edges[k].h;
		mlib_s32 slb = edges[k].dlb;
		mlib_s32 dlb = param->edges_blend[k].dlb;
		mlib_u8 *sp = edges[k].dp;
		mlib_u8 *dp = param->edges_blend[k].dp;

		if (ww == 0 || hh == 0)
			continue;

		if (alp_ind == -1) {
			if (schan == 4)
				sp++;
			if (dchan == 4)
				dp++;
		}

/* 33 */
		if (t_ind == 0) {
			FP_TYPE a0 = (param->alpha) * (F_ONE / 255);

			for (j = 0; j < hh; j++) {
				for (i = 0; i < 3 * ww; i++) {
					BLEND33(dp[i], sp[i]);
				}
				sp += slb;
				dp += dlb;
			}
		}

		else if (t_ind == 1) { /* 43 */
			FP_TYPE a0 = (param->alpha) * (F_ONE / 255), dalpha =
				a0 * (F_ONE / 255);

			if (edge == MLIB_EDGE_SRC_EXTEND ||
				edge == MLIB_EDGE_SRC_EXTEND_INDEF) {
				FP_TYPE a1;

				if (blend == MLIB_BLEND_GTK_SRC) {
					for (j = 0; j < hh; j++) {
						for (i = 0; i < ww; i++) {
							STORE(dp[3 * i],
								sp[4 * i]);
							STORE(dp[3 * i + 1],
								sp[4 * i + 1]);
							STORE(dp[3 * i + 2],
								sp[4 * i + 2]);
						}
						sp += slb;
						dp += dlb;
					}
				} else {
					for (j = 0; j < hh; j++) {
						for (i = 0; i < ww; i++) {
							a1 = 1 - dalpha * sp[4 *
								i + alp_ind];
							BLEND43(dp[3 * i],
								sp[4 * i]);
							BLEND43(dp[3 * i + 1],
								sp[4 * i + 1]);
							BLEND43(dp[3 * i + 2],
								sp[4 * i + 2]);
						}
						sp += slb;
						dp += dlb;
					}
				}
			} else {
				if (blend == MLIB_BLEND_GTK_SRC) {
					for (j = 0; j < hh; j++) {
						for (i = 0; i < ww; i++) {
							a0 = sp[4 * i +
								alp_ind] *
								(F_ONE / 255);
							dp[3 * i] =
								(mlib_u8)(a0 *
								sp[4 * i]);
							dp[3 * i + 1] =
								(mlib_u8)(a0 *
								sp[4 * i + 1]);
							dp[3 * i + 2] =
								(mlib_u8)(a0 *
								sp[4 * i + 2]);
						}
						sp += slb;
						dp += dlb;
					}
				} else {
					for (j = 0; j < hh; j++) {
						for (i = 0; i < ww; i++) {
							a0 = dalpha * sp[4 * i +
								alp_ind];
							BLEND33(dp[3 * i],
								sp[4 * i]);
							BLEND33(dp[3 * i + 1],
								sp[4 * i + 1]);
							BLEND33(dp[3 * i + 2],
								sp[4 * i + 2]);
						}
						sp += slb;
						dp += dlb;
					}
				}
			}
		} else if (t_ind == 2) {
/* 34 */
			FP_TYPE w0 = (FP_TYPE) param->alpha;
			FP_TYPE w1s = F_ONE - w0 * (F_ONE / 255);
			FP_TYPE w1, w, rw;

			if (blend == MLIB_BLEND_GTK_SRC_OVER2) {
				for (j = 0; j < hh; j++) {
					for (i = 0; i < ww; i++) {
						w1 = w1s * dp[4 * i + alp_ind];
						w = w0 + w1;
						FP_DIV(rw, w0, w);

						BLEND34(dp[4 * i], sp[3 * i]);
						BLEND34(dp[4 * i + 1],
							sp[3 * i + 1]);
						BLEND34(dp[4 * i + 2],
							sp[3 * i + 2]);
						dp[4 * i + alp_ind] =
							(mlib_u8)w;
					}
					sp += slb;
					dp += dlb;
				}
			} else {
				for (j = 0; j < hh; j++) {
					for (i = 0; i < ww; i++) {
						w1 = w1s * dp[4 * i + alp_ind];
						w = w0 + w1;
						FP_INV(rw, w);

						BLEND34z(dp[4 * i], sp[3 * i]);
						BLEND34z(dp[4 * i + 1],
							sp[3 * i + 1]);
						BLEND34z(dp[4 * i + 2],
							sp[3 * i + 2]);
						dp[4 * i + alp_ind] =
							(mlib_u8)w;
					}
					sp += slb;
					dp += dlb;
				}
			}
		} else if (t_ind == 3) {
/* 44 */
			FP_TYPE dalpha0 = (FP_TYPE) param->alpha,
				dalpha = dalpha0 * (F_ONE / 255);
			FP_TYPE w0, w1, w, rw;

			if (edge == MLIB_EDGE_SRC_EXTEND ||
				edge == MLIB_EDGE_SRC_EXTEND_INDEF) {
				for (j = 0; j < hh; j++) {
					if (blend == MLIB_BLEND_GTK_SRC) {
						for (i = 0; i < ww; i++) {
							w = sp[4 * i + alp_ind];
							FP_DIV(rw, 255, w);

							BLEND_GTK_SRC(dp[4 * i],
								sp[4 * i]);
							BLEND_GTK_SRC(dp[4 * i +
								1],
								sp[4 * i + 1]);
							BLEND_GTK_SRC(dp[4 * i +
								2],
								sp[4 * i + 2]);
							dp[4 * i + alp_ind] =
								sp[4 * i +
								alp_ind];
						}
					} else if (blend ==
						MLIB_BLEND_GTK_SRC_OVER2) {
						for (i = 0; i < ww; i++) {
							w0 = dalpha * sp[4 * i +
								alp_ind];
							w1 = (F_ONE -
								w0 * (F_ONE /
								255)) * dp[4 *
								i + alp_ind];
							w = w0 + w1;
							FP_INV(rw, w);

							BLEND44(dp[4 * i],
								sp[4 * i]);
							BLEND44(dp[4 * i + 1],
								sp[4 * i + 1]);
							BLEND44(dp[4 * i + 2],
								sp[4 * i + 2]);
							dp[4 * i + alp_ind] =
								(mlib_u8)w;
						}
					} else {
						for (i = 0; i < ww; i++) {
							w0 = dalpha * sp[4 * i +
								alp_ind];
							w1 = (F_ONE -
								w0 * (F_ONE /
								255)) * dp[4 *
								i + alp_ind];
							w = w0 + w1;
							FP_INV(rw, w);

							BLEND44z(dp[4 * i],
								sp[4 * i]);
							BLEND44z(dp[4 * i + 1],
								sp[4 * i + 1]);
							BLEND44z(dp[4 * i + 2],
								sp[4 * i + 2]);
							dp[4 * i + alp_ind] =
								(mlib_u8)w;
						}
					}
					sp += slb;
					dp += dlb;
				}
			} else {
				for (j = 0; j < hh; j++) {
					if (blend == MLIB_BLEND_GTK_SRC) {
						for (i = 0; i < ww; i++) {
							dp[4 * i] = sp[4 * i];
							dp[4 * i + 1] =
								sp[4 * i + 1];
							dp[4 * i + 2] =
								sp[4 * i + 2];
							dp[4 * i + alp_ind] =
								sp[4 * i +
								alp_ind];
						}
					} else if (blend ==
						MLIB_BLEND_GTK_SRC_OVER2) {
						for (i = 0; i < ww; i++) {
							w0 = dalpha * sp[4 * i +
								alp_ind];
							w1 = (F_ONE -
								w0 * (F_ONE /
								255)) * dp[4 *
								i + alp_ind];
							w = w0 + w1;
							FP_DIV(rw, w0, w);

							BLEND34(dp[4 * i],
								sp[4 * i]);
							BLEND34(dp[4 * i + 1],
								sp[4 * i + 1]);
							BLEND34(dp[4 * i + 2],
								sp[4 * i + 2]);
							dp[4 * i + alp_ind] =
								(mlib_u8)w;
						}
					} else {
						for (i = 0; i < ww; i++) {
							w0 = dalpha * sp[4 * i +
								alp_ind];
							w1 = (F_ONE -
								w0 * (F_ONE /
								255)) * dp[4 *
								i + alp_ind];
							w = w0 + w1;
							FP_INV(rw, w);

							BLEND34z(dp[4 * i],
								sp[4 * i]);
							BLEND34z(dp[4 * i + 1],
								sp[4 * i + 1]);
							BLEND34z(dp[4 * i + 2],
								sp[4 * i + 2]);
							dp[4 * i + alp_ind] =
								(mlib_u8)w;
						}
					}
					sp += slb;
					dp += dlb;
				}
			}
		}
	}

	__mlib_free(buff);

	return (MLIB_SUCCESS);
}