#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>

#include "inc/ysmalloc.h"
#include "inc/ysmacro.h"
#include "inc/strvalue.h"

#include "inc/pixdata.h"
#include "inc/ysansi.h"
#include "inc/ysgui.h"
#include "inc/main.h"

#include "inc/filter.h"


extern int Ys11Id;   /* 使わないけど一応 ^_^;  */



void UserFilterMove()
{
	int x,y,wid,hei,r;

	if(PxGetResolution(&wid,&hei)!=PX_NOERR)
	{
		return;
	}

	r = (wid>hei ? wid : hei);
	x=0;
	y=0;
	if(YsInputIpoint2(Ys11Id,&x,&y,"移動量",-r,+r)!=YSYES)
	{
		return;
	}

	UserFilterMoveFunc(x,y);
}

int UserFilterMoveCmd(int ac,char *av[])
{
	int x,y;
	extern int StrValueError;

	if(ac!=3)
	{
		return FLT_ILLPARAM;
	}

	x=StrValue(av[1]);
	if(StrValueError!=SVL_NOERR)
	{
		return FLT_FAILED;
	}

	y=StrValue(av[2]);
	if(StrValueError!=SVL_NOERR)
	{
		return FLT_FAILED;
	}

	return UserFilterMoveFunc(x,y);
}


static int UserFilterMoveFunc(int vx,int vy)
{
	int x,y,wid,hei;
	PIXEL *tmp;

	/* 解像度取得 */
	if(PxGetResolution(&wid,&hei)!=PX_NOERR)
	{
		return FLT_NOCURRENT;
	}

	/* vxとvyを補正(負の値はまずい) */
	while(vx<0)vx+=wid;
	while(vy<0)vy+=hei;

	/* 横の平行移動 */
	tmp=(PIXEL *)MALLOCFUNC(sizeof(PIXEL)*wid);
	for(y=0; y<hei; y++)
	{
		PxGetBlock(tmp,0,y,wid,1);
		for(x=0; x<wid; x++)
		{
			PxSetOnePix(x,y,&tmp[(x+vx)%wid]);
		}
	}
	FREEFUNC(tmp);

	/* 縦の平行移動 */
	tmp=(PIXEL *)MALLOCFUNC(sizeof(PIXEL)*hei);
	for(x=0; x<wid; x++)
	{
		PxGetBlock(tmp,x,0,1,hei);
		for(y=0; y<hei; y++)
		{
			PxSetOnePix(x,y,&tmp[(y+vy)%hei]);
		}
	}
	FREEFUNC(tmp);

	return FLT_NOERR;
}
