#include <stdio.h>
#include <stdlib.h>
#include <stdint.h> 
#include <time.h> 



/* Linux-Unix stuff */

#ifdef __linux__


	#include <SDL2/SDL.h>
	#include <SDL2/SDL_ttf.h>

	#include <geeonx_public2-133.h> 

	#include <unistd.h>


/* Windows and Microsoft Visual C stuff */

#elif __WIN32__ || _MSC_VER


	#include "include\SDL2\SDL.h"
	#include "include\SDL2\SDL_ttf.h"

	#include "include\geeonx_public_w2-133.h"
#endif

#define SDL_main main 



struct pix
{
	unsigned int x;
	unsigned int y;
	
	unsigned x_direction;
	unsigned y_direction;
	
	unsigned char r;
	unsigned char g;
	unsigned char b;
};

struct pix demo_pix[100];

unsigned int switch_gfx;

void myapp_exa_left_selected_object(struct geeonx_appdata *myapp);
void draw_gfx_pixels(struct geeonx_appdata *myapp);
void draw_gfx_boxes (struct geeonx_appdata *myapp);
void draw_gfx_lines(struct geeonx_appdata *myapp);
unsigned int random_number(unsigned int top,unsigned int bottom);


void draw_gfx_pixels(struct geeonx_appdata *myapp)
{
	
	int i;
	
	unsigned char r;
	unsigned char g;
	unsigned char b;
	
	
	
	
	gee_lock((myapp->object_data+46)->image_surface); /* first of all lock the surface */
	
	for(i=0; i<=99; i++)
	{
	
		if(demo_pix[i].x>=258)
		{
			demo_pix[i].x_direction=1;
		}
		
				
		/* Left barrier. */
		if(demo_pix[i].x<=1)
		{
			demo_pix[i].x_direction=0;
		}
		
		/* Bottom barrier. */
		if(demo_pix[i].y>=198)
		{
			demo_pix[i].y_direction=1;
		}
		
		/* Top barrier. */
		if(demo_pix[i].y<=1)
		{
			demo_pix[i].y_direction=0;
		}
		
		/* Move it. */
		
		if(demo_pix[i].x_direction==0)
		{
			demo_pix[i].x++;
		}
		
		if(demo_pix[i].x_direction==1)
		{
			demo_pix[i].x--;
		}
		if(demo_pix[i].y_direction==0)
		{
			demo_pix[i].y++;
		}
		
		if(demo_pix[i].y_direction==1)
		{
			demo_pix[i].y--;
		}
		
		r=(char)demo_pix[i].r;
		g=(char)demo_pix[i].g;
		b=(char)demo_pix[i].b;
		
		
		gee_draw_pixel_bm(myapp, 46, demo_pix[i].x, demo_pix[i].y, r, g, b);

	
	}
	gee_unlock((myapp->object_data+46)->image_surface); 
	
}



void draw_gfx_lines(struct geeonx_appdata *myapp)
{
	
	int i;
	
	unsigned char r;
	unsigned char g;
	unsigned char b;
	
	
	gee_draw_box_bm(myapp, 46, 0, 0, 260, 200, 255, 255, 255); 
	
	gee_lock((myapp->object_data+46)->image_surface); /* first of all lock the surface */
	
	for(i=0; i<=99; i++)
	{
	
		if(demo_pix[i].x>=258)
		{
			demo_pix[i].x_direction=1;
		}
		
				
		/* Left barrier. */
		if(demo_pix[i].x<=1)
		{
			demo_pix[i].x_direction=0;
		}
		
		/* Bottom barrier. */
		if(demo_pix[i].y>=198)
		{
			demo_pix[i].y_direction=1;
		}
		
		/* Top barrier. */
		if(demo_pix[i].y<=1)
		{
			demo_pix[i].y_direction=0;
		}
		
		/* Move it. */
		
		if(demo_pix[i].x_direction==0)
		{
			demo_pix[i].x++;
		}
		
		if(demo_pix[i].x_direction==1)
		{
			demo_pix[i].x--;
		}
		if(demo_pix[i].y_direction==0)
		{
			demo_pix[i].y++;
		}
		
		if(demo_pix[i].y_direction==1)
		{
			demo_pix[i].y--;
		}
		
		r=(char)demo_pix[i].r;
		g=(char)demo_pix[i].g;
		b=(char)demo_pix[i].b;
		
		if(i<99)
		{
			gee_draw_line_bm(myapp, 46, demo_pix[i].x, demo_pix[i].y, demo_pix[i+1].x, demo_pix[i+1].y, r, g, b);
		}
		else if(i==99)
		{
			gee_draw_line_bm(myapp, 46, demo_pix[i].x, demo_pix[i].y, demo_pix[0].x, demo_pix[0].y, r, g, b);
		}
	
	
	}
	gee_unlock((myapp->object_data+46)->image_surface); 
	
}

void draw_gfx_boxes(struct geeonx_appdata *myapp)
{
	
	int i;
	
	unsigned char r;
	unsigned char g;
	unsigned char b;
	
	unsigned draw_w;
	unsigned draw_h;
	
	unsigned bottom_y;
	unsigned right_x;
	
	draw_w=20;
	draw_h=20;
	
	gee_draw_box_bm(myapp, 46, 0, 0, 260, 200, 255, 255, 255);
	
	for(i=0; i<=19; i++)
	{
		right_x=demo_pix[i].x+draw_w-1;
		bottom_y=demo_pix[i].y+draw_h-1;
		
		if(right_x>=259)
		{
			draw_w=259-demo_pix[i].x;
		}
		
		if(bottom_y>=199)
		{
			draw_h=199-demo_pix[i].y;
		}
		
		/* Right barrier. */
		
		if(right_x>=258)
		{
			demo_pix[i].x_direction=1;
		}
		
		
		/* Left  barrier. */
		if(demo_pix[i].x<=1)
		{
			demo_pix[i].x_direction=0;
		}
		
		/* Bottom barrier. */
		if(bottom_y>=198)
		{
			demo_pix[i].y_direction=1;
		}
		
		/* Top barrier. */
		if(demo_pix[i].y<=1)
		{
			demo_pix[i].y_direction=0;
		}
		
		/* Move it. */
		
		if(demo_pix[i].x_direction==0)
		{
			demo_pix[i].x++;
		}
		
		if(demo_pix[i].x_direction==1)
		{
			demo_pix[i].x--;
		}
		if(demo_pix[i].y_direction==0)
		{
			demo_pix[i].y++;
		}
		
		if(demo_pix[i].y_direction==1)
		{
			demo_pix[i].y--;
		}
		
		r=(char)demo_pix[i].r;
		g=(char)demo_pix[i].g;
		b=(char)demo_pix[i].b;
		
		
		gee_draw_box_bm(myapp, 46, demo_pix[i].x, demo_pix[i].y, draw_w, draw_h, r, g, b);

	
	}
	
	
}


 

int main(int argc, char*argv[]) /* For mac */
{

SDL_Texture *bm_texture;  /* texture for bitmap drawing    */
SDL_Rect bm_rect;               /* rectangle for bitmap drawing */


struct geeonx_object *central_pointer;       /* Pointer to structure. */
struct geeonx_window_text *g_window; /* Pointer to textblock of the windwow. */

struct geeonx_appdata *myapp;                   /* Pointer to Appdata */

char file_name[65];
char stream_name[65];

int go_out;
int buffer;
int buffer_x;
int buffer_y;

char directory_name[200];

int error;

int i;

uint32_t rmask;
uint32_t gmask;
uint32_t bmask;
uint32_t amask;

/* According to SDL migration guide */

 rmask = 0x00FF0000;
 gmask = 0x0000FF00;
 bmask = 0x000000FF;
 amask = 0xFF000000;

                                       
                                        


/* Get memory ... */

myapp=(struct geeonx_appdata *)calloc(1,sizeof(struct geeonx_appdata));


/* Set some basic values. */

myapp->numberofobjects=0;

myapp->in_new_object=0;       
          
myapp->background_r=140;
myapp->background_g=140;
myapp->background_b=140;

myapp->size_r=250;
myapp->size_g=150;
myapp->size_b=0;

myapp->scroll_r=110;
myapp->scroll_g=187;
myapp->scroll_b=245;

myapp->hole_screen.x=0;
myapp->hole_screen.y=0;
myapp->hole_screen.w=1024;
myapp->hole_screen.h=600;


myapp->screen_w=1024;  /* Set video mode. */
myapp->screen_h=600;


myapp->switch_st_scroll_size=0; /* You can size windows. */

myapp->language=1; /* Chose German language. */
myapp->insert_modus=0; /* Set insert modus.  */
myapp->scroll_speed=5; 
myapp->active_windows=0;

myapp->mode=0; /* Desktop Mode */

error=0;

/* Start SDL. */

if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK) !=0)
{
        printf("SDL can not be initialized: %s\n", SDL_GetError());

}

/* Get video surface. */

myapp->geeonx_window = SDL_CreateWindow("Geeonx Demo",SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, myapp->screen_w,myapp->screen_h, SDL_WINDOW_SHOWN |  SDL_WINDOW_RESIZABLE);

myapp->screen= SDL_CreateRGBSurface(0, myapp->screen_w, myapp->screen_h, 32, rmask, gmask, bmask, amask);

SDL_SetSurfaceBlendMode(myapp->screen, SDL_BLENDMODE_NONE); 

/* Connect window with renderer. */

myapp->renderer = SDL_CreateRenderer(myapp->geeonx_window, -1, 0);

SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");  // make the scaled rendering look smoother.

SDL_RenderSetLogicalSize(myapp->renderer, myapp->screen_w, myapp->screen_h); 

myapp->texture= SDL_CreateTexture(myapp->renderer,SDL_PIXELFORMAT_ARGB8888,SDL_TEXTUREACCESS_STREAMING, myapp->screen_w, myapp->screen_h);




if (myapp->screen == NULL)
{
        printf("Error.");
}

/* Start SDL TTF */

if(TTF_Init()==-1)
{
    printf("TTF_Init: %s\n", TTF_GetError());
   
}



#ifdef __linux__


	getcwd(directory_name,sizeof(directory_name));
	
	printf("Geeonx_demo:Working directory %s \n",directory_name);
	
	error=chdir("/usr/local/bin/geeonx");
	
	
	if(error==-1)
	{
		printf("geeonx_demo: Can't change directory.\n");
		
		
		
	}
	
	error=0;

#endif


#ifdef _MSC_VER
	
#endif

/* Start geeonx ! */
gee_start_geeonx(myapp, 0,0,"29.gee", "29.gew");

/* Horizontal alignment of the chain_objects. */

(myapp->object_data+32)->text_align=1;


/* Set application font */

gee_copy_st_last_part("DroidSans.ttf",myapp->font_name);


myapp->font_size=12;

myapp->font=TTF_OpenFont(myapp->font_name, myapp->font_size);

if(!myapp->font) 
{
    printf("TTF_OpenFont: %s\n", TTF_GetError());
    // handle error
	
	gee_close(myapp);
	exit(0);
	
	
}



/* ******** Create a bitmap for gfx ! ****************** */

(myapp->object_data+46)->image_surface=SDL_CreateRGBSurface(0, (myapp->object_data+46)->obj_w, (myapp->object_data+46)->obj_h, 32,rmask, gmask, bmask, amask);


/* SDL_SetSurfaceBlendMode((myapp->object_data+46)->image_surface, SDL_BLENDMODE_NONE); */

 if ((myapp->object_data+46)->image_surface == NULL)
  {
        SDL_Log("SDL_CreateRGBSurface() failed: %s", SDL_GetError());
        exit(1);
  }

gee_set_operators(myapp);

gee_draw_box(myapp,0,0,myapp->screen_w,myapp->screen_h,myapp->background_r,myapp->background_g,myapp->background_b);

error=0;

error=gee_prepare_chain_mother(myapp, 32,20000);

if(error==-1)
{

	printf("Can't get enough memory for chain mother ! \n \n ");	
	gee_close(myapp);
	exit(0);
}

error=0;

gee_read_external_stream_copy_to_object(myapp,"input.txt",32);

if(error==-1)
{

	printf("Can't load chain mother ! \n \n ");	
	gee_close(myapp);
	exit(0);
}

/* Definitions for bitmap trials */

(myapp->object_data+46)->obj_status=10;
/* (myapp->object_data+46)->disabled=0; */




/* Building random start values. */

for(i=0; i<=99; i++)
{
	

	demo_pix[i].x=random_number(1, 259);
	
	
		
	demo_pix[i].y=random_number(1, 199);
	
	
	
	demo_pix[i].r=random_number(0, 255);
	
	
	
	demo_pix[i].g=random_number(0, 255);
	
	
	
	demo_pix[i].b=random_number(0, 255);
	
	

	
}





myapp->in_new_object=44;
gee_activate_window(myapp); 


gee_draw_all_objects(myapp,1,1);    /* dito !! */




go_out=0;     			/* If 1 than exit */

while(go_out==0)
{
	if (!SDL_PollEvent(&(myapp->event)))
	{
		if(myapp->selected_window==44)
        {
			if(switch_gfx==0)
			{
				draw_gfx_boxes(myapp);
			}
			else if(switch_gfx==1)
			{
				draw_gfx_lines(myapp);
			}
			else if(switch_gfx==2)
			{
				draw_gfx_pixels(myapp);
			}
			SDL_Delay(5);
			gee_draw_and_screenup_selected_window(myapp);
        }
        
		
	}
        
			
    switch (myapp->event.type)
    {
				
					
		case SDL_MOUSEBUTTONDOWN:
		
		              
		if(myapp->event.button.button==SDL_BUTTON_LEFT)
		{ 
						
			buffer=1;
				 
			buffer_x=myapp->event.button.x;
			buffer_y=myapp->event.button.y;
		}	
		
		break;
	                      
        case SDL_MOUSEBUTTONUP:
        
        buffer=0; /* Reset pressed buffer */
                
        if(myapp->event.button.button==SDL_BUTTON_LEFT && myapp->event.button.state==SDL_RELEASED)
		{
						
						
			myapp->in_new_object=gee_test_all_objects(myapp, myapp->event.button.x, myapp->event.button.y); /* Test all objects. */
			
			/* Check geeonx events. */ 
			
			gee_exa_left_released(myapp);
			
			/* Check your own events ! */
						
			myapp_exa_left_selected_object(myapp);
						
			/* Erase old content of button. */
						
			myapp->event.button.type=0;
						

			myapp->in_new_object=0;
		}
                
		break;
		
		case SDL_MOUSEWHEEL:
		
		gee_exa_wheel(myapp);
		
		break;
		
		case SDL_TEXTINPUT:
		
		/* New input system in SDL 2.x */ 
                
		case SDL_KEYDOWN:
		
		/* Get geeonx key data. */
                 
		gee_getfirstkeyinformation(myapp);
				
		break;
				
		case SDL_KEYUP:
		
		/* Get geeonx key and text data. */
		
		gee_getfinalkeyinformation(myapp);
				
		gee_get_text(myapp);
               
        break; 
        
        case SDL_QUIT:
        
		SDL_FreeSurface((myapp->object_data + 46)->image_surface);
		gee_close(myapp);
		exit(0);
		
		break;
       
		case SDL_WINDOWEVENT:
           
            
		if(myapp->event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
        {
			gee_draw_all_objects(myapp,0,1);
		}
            
        break;
        
        
        
	}   /* switch */
	
		
	if(buffer==1) /* left plus pressed */
	{
					
		myapp->in_new_object=gee_test_all_objects(myapp, buffer_x, buffer_y); /* Test all objects. */
					
										
		gee_exa_left_pressed(myapp);
					
		gee_select_window(myapp); 
						
		myapp->in_new_object=0; /* Reset in. */
			
	
				
	}
	
}


return(0);
}

void myapp_exa_left_selected_object(struct geeonx_appdata *myapp)
{
	
unsigned int selection;
	
selection=0;
	
/* Start examination of left click events. */
		
	
	
	
	if(myapp->in_new_object==20)
	{
		/* Close window. */
			
		gee_close_win(myapp,0);
			
			
		/* Do complete redraw. */ 
		gee_draw_all_objects(myapp,0,1);
		
	
			
	}	
			
	/* Application. */
		
	else if(myapp->in_new_object==27) 
	{
		/* Check menu selection. */
		
		selection=gee_move_out_menu(myapp, 23);
			
			
		if(selection==24)  /* Close. */
		{
			SDL_FreeSurface((myapp->object_data + 46)->image_surface);
			gee_close(myapp);
			exit(0);
			
		}
		else if(selection==25)  /* About. */
		{
			
			myapp->in_new_object=8;
					
			/* Activate window. */
					
			gee_activate_window(myapp);
			
		}
			
			
		gee_draw_all_objects(myapp,0,1);    /* dito !! */
  
	}
	
	
	else if(myapp->in_new_object==48)
	{
		if(switch_gfx<2)
		{
			switch_gfx++;
			
			if(switch_gfx==2)
			{
				gee_draw_box_bm(myapp, 46, 0, 0, 260, 200, 255, 255, 255);
			}
		}
		else if(switch_gfx==2)
		{
			switch_gfx=0;
		}
	
	}
	
	/* Windows. */
		
	else if(myapp->in_new_object==28) 
	{
		/* Check menu selection. */
			
		selection=gee_move_out_menu(myapp, 29);
			
			
		/* Input */
			
		if(selection==30)  
		{
					
			myapp->in_new_object=10;
					
			/* Activate window. */
					
			gee_activate_window(myapp);
		}
			
		/* Content. */
			
		else if(selection==31)  
		{
				
			/* Activate window. */					
				
			myapp->in_new_object=9;
						
			gee_activate_window(myapp);

			
		}
		
		else if(selection==37)  
		{
				
			/* Activate window. */					
				
			myapp->in_new_object=36;
						
			gee_activate_window(myapp);

			
		}
		
		else if(selection==47)  
		{
					
			/* Activate window. */					
					
			myapp->in_new_object=44;
							
			gee_activate_window(myapp);

		}
			
		gee_draw_all_objects(myapp,0,1);    /* dito !! */
			
			
	}
		
	/* Apply. */
	
	else if(myapp->in_new_object==12)
	{
		strcpy((myapp->object_data+16)->obj_text, (myapp->object_data+11)->obj_text);
			
		/* Format new text. */
			
		gee_format_small_obj(myapp,16);
			
		/* After that do a window update. */
			              
        gee_draw_and_screenup_selected_window(myapp);                   
			
	}
	
	else if (myapp->in_new_object==39) /* PopUp Menu */
	{
		selection=gee_move_out_menu(myapp, 40);
		
		
		
		if(selection==41)
		{
			/* Dark grey */
		
			myapp->background_r=150;
			myapp->background_g=150;
			myapp->background_b=150;
			
			gee_draw_box(myapp,0,0,myapp->screen_w,myapp->screen_h,myapp->background_r,myapp->background_g,myapp->background_b);
			
			/* Update entry. */
			
			gee_copy_st_last_part("Dark Grey",&(myapp->object_data+39)->obj_text[0]);
			
			gee_format_small_obj(myapp,39);
			
			/* Redraw and screen update. */
			gee_draw_all_objects(myapp,0,1);    /* dito !! */
			
			
			
		
		}
		else if(selection==42)
		{
			/* white */
		
			myapp->background_r=255;
			myapp->background_g=255;
			myapp->background_b=255;
			
			gee_draw_box(myapp,0,0,myapp->screen_w,myapp->screen_h,myapp->background_r,myapp->background_g,myapp->background_b);
			
						
			/* Update entry. */
			
			gee_copy_st_last_part("White",&(myapp->object_data+39)->obj_text[0]);
			
			gee_format_small_obj(myapp,39);
			
			/* Redraw and screen update. */
			gee_draw_all_objects(myapp,0,1);    /* dito !! */
			
			
			
		}
		else if(selection==43)
		{
			/* Blue */
			myapp->background_r=030;
			myapp->background_g=144;
			myapp->background_b=255;
			
			gee_draw_box(myapp,0,0,myapp->screen_w,myapp->screen_h,myapp->background_r,myapp->background_g,myapp->background_b);
			
			
			/* Update entry. */
			
			gee_copy_st_last_part("Blue",&(myapp->object_data+39)->obj_text[0]);
			
			gee_format_small_obj(myapp,39);
			
			/* Redraw and screen update. */
			gee_draw_all_objects(myapp,0,1);    /* dito !! */
			
			/* Redraw and screen update. */
			gee_draw_all_objects(myapp,0,1);    /* dito !! */
			
			
			
		}
		else
		{
			/* Redraw and screen update. */
			gee_draw_all_objects(myapp,0,1);    /* dito !! */
		}
		selection=0;
			
	}
}

unsigned int random_number(unsigned int top, unsigned int bottom)
{
	unsigned int number;


    
    number = (rand() % (bottom - top + 1)) + top;
 
    return(number);
}




