#include<menuet/os.h>
#include "fitz.h"
#include "mupdf.h"
#include "muxps.h"
#include "pdfapp.h"



static char Title[96];
static char * filename = "/hd0/1/yand.pdf";
static pdfapp_t gapp;

void f65(unsigned x, unsigned y, unsigned w, unsigned h, char *d)
{
asm ("nop"::"c"(w*65536+h), "d"(x*65536+y), "b"(d));
asm ("xor %eax, %eax");
asm ("movl %eax, %ebp");
asm ("pushl $32");
asm ("popl %esi");
asm ("int $0x40"::"a"(65));

}

	struct blit_call
{
   int dstx;       
   int dsty;
   int w;
   int h;

   int srcx;
   int srcy;
   int srcw;
   int srch;

   unsigned char *d;
   int   stride;
};

void blit(int dstx, int dsty, int w, int h, int srcx, int srcy,int srcw, int srch, int stride, char *d)
{

struct blit_call image;
	image.dstx=dstx;
	image.dsty=dsty;
	image.w=w;
	image.h=h;
	image.srcx=srcx;
	image.srcy=srcy;
	image.srcw=srcw;
	image.srch=srch;
	image.stride=stride;
	image.d=d;
	

asm ("int $0x40"::"a"(73),"b"(0),"c"(&image));

}

void winwarn(pdfapp_t *app, char *msg)
{
	fprintf(stderr, "mupdf: %s\n", msg);
}

void winerror(pdfapp_t *app, fz_error error)
{
	fz_catch(error, "aborting");
	exit(1);
}

char *winpassword(pdfapp_t *app, char *filename)
{
	char *r = "";
	return r;
}


void wincursor(pdfapp_t *app, int curs)
{
	
}

void wintitle(pdfapp_t *app, char *s)
{

sprintf(Title,"uPDF: %s", s);	
}

void winhelp(pdfapp_t *app)
{
	
}

void winresize(pdfapp_t *app, int w, int h)
{
	//here should be something!!!
		
}


void windocopy(pdfapp_t *app)
{
}

void winreloadfile(pdfapp_t *app)
{
	pdfapp_close(app);


	pdfapp_open(app, filename, 0, 1);
}

void winopenuri(pdfapp_t *app, char *buf)
{
	/* here can be browser!
	char *browser = getenv("BROWSER");
	if (!browser)
		browser = "open";
	if (fork() == 0)
		execlp(browser, browser, buf, (char*)0);
		* */
		
}



void winclose(pdfapp_t *app)
{
	pdfapp_close(&gapp);
	__menuet__sys_exit();
}

void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c)
{
asm ("int $0x40"::"a"(13), "b"(x*65536+w), "c"(y*65536+h), "d"(c));
}


static void winblit(pdfapp_t *app)
{
	char yoba[32];
	int x0 = gapp.panx;
	int y0 = gapp.pany;
	int x1 = gapp.panx + gapp.image->w;
	int y1 = gapp.pany + gapp.image->h;
sprintf(yoba,"Posx: %d, posy: %d", x0, y0);
__menuet__debug_out(yoba);
__menuet__debug_out(" Window blit\n");
/*
	XSetForeground(xdpy, xgc, xbgcolor.pixel);
	fillrect(0, 0, x0, gapp.winh);
	fillrect(x1, 0, gapp.winw - x1, gapp.winh);
	fillrect(0, 0, gapp.winw, y0);
	fillrect(0, y1, gapp.winw, gapp.winh - y1);*/
	/*
	kol_paint_bar(0, 0, x0, gapp.winh, 0xFFFFFF);
	kol_paint_bar(x1, 0, gapp.winw - x1, gapp.winh, 0xFFFFFF);
	kol_paint_bar(0, 0, gapp.winw, y0, 0xFFFFFF);
	kol_paint_bar(0, y1, gapp.winw, gapp.winh - y1, 0xFFFFFF);*/
	

	/*XSetForeground(xdpy, xgc, xshcolor.pixel);
	fillrect(x0+2, y1, gapp.image->w, 2);
	fillrect(x1, y0+2, 2, gapp.image->h);*/



	if (gapp.image->n == 4)
		/*ximage_blit(xwin, xgc,
			x0, y0,
			gapp.image->samples,
			0, 0,
			gapp.image->w,
			gapp.image->h,
			gapp.image->w * gapp.image->n);*/
		//	f65(x0,y0+32,gapp.image->w,gapp.image->h,gapp.image->samples);
	 {
		 int i = gapp.image->w*gapp.image->h;
		 int tmp;
		 unsigned char *color = malloc(i*4);
		if (color != NULL)
		{
			unsigned char *s = gapp.image->samples;
			unsigned char *d = color;
			for (; i > 0 ; i--)
			{
				d[0]=*s++;
				d[1]=*s++;
				d[2] = *s++;
				d[3] = *s++;
				tmp=d[0];
				d[0]=d[2];
				d[2]=tmp;
				d += 4;
			}
		 
		 	blit(6, 24, 588, 370, x0, y0,gapp.image->w, gapp.image->h, gapp.image->w * gapp.image->n, color);
		 	free(color);
		}
		}
			
	else if (gapp.image->n == 2)
	{
		int i = gapp.image->w*gapp.image->h;
		unsigned char *color = malloc(i*4);
		if (color != NULL)
		{
			unsigned char *s = gapp.image->samples;
			unsigned char *d = color;
			for (; i > 0 ; i--)
			{
				d[2] = d[1] = d[0] = *s++;
				d[3] = *s++;
				d += 4;
			}
			/*ximage_blit(xwin, xgc,
				x0, y0,
				color,
				0, 0,
				gapp.image->w,
				gapp.image->h,
				gapp.image->w * 4); */
			//f65(x0,y0,gapp.image->w,gapp.image->h,color);
			blit(6, 24, 588, 370, x0, y0,gapp.image->w, gapp.image->h, gapp.image->w * 4, color);
			free(color);
		}
	}

}

void paint(void)
{
 __menuet__window_redraw(1);

 __menuet__define_window(10,10,600,400,0x34CFCFCF,0x800000FF,Title);
 // __menuet__write_text(3,3,0xFFFFFF,Title,strlen(Title));
 
 winblit(&gapp);
 __menuet__window_redraw(2);
}

void winrepaint(pdfapp_t *app)
{
	paint();
}

void winrepaintsearch(pdfapp_t *app)
{
	paint();
	//search!
}


int main (void)
{
	char* original_command_line = *(char**)0x1C;
	__menuet__debug_out(original_command_line);
	
	char buf[128];
	int resolution = 72;
		int pageno = 1;
		__menuet__debug_out("\nStarted\n");
		fz_accelerate();
		__menuet__debug_out("PDF init\n");
		pdfapp_init(&gapp);
	gapp.scrw = 600;
	gapp.scrh = 400;
	gapp.resolution = resolution;
	gapp.pageno = pageno;
	__menuet__debug_out("PDF Open\n");
	pdfapp_open(&gapp, original_command_line, 0, 0);
		__menuet__debug_out("PDF Opened\n");
	
	
	
 int i;
 __menuet__debug_out("Inital paint\n");
   pdfapp_onresize(&gapp, 600, 400);
 paint();
 for(;;)
 {

  i=__menuet__wait_for_event();
  
  if (gapp.image)
				{
					
						gapp.shrinkwrap = 0;
				}
  switch(i)
  {
   case 1:
    paint();
    continue;
   case 2:
    buf[0]=__menuet__getkey();
    pdfapp_onkey(&gapp, buf[0]);
    continue;
   case 3:
    if(__menuet__get_button_id()==1) __menuet__sys_exit();
    continue;
  }
 }
 return 0;
}
  
