#1546 HIGH Untriag: Jotpad basic engine

Zarro Boogs per Child bugtracker at laptop.org
Sat May 19 06:12:37 EDT 2007


#1546: Jotpad basic engine
----------------------+-----------------------------------------------------
 Reporter:  prasanna  |       Owner:  jg       
     Type:  defect    |      Status:  new      
 Priority:  high      |   Milestone:  Untriaged
Component:  distro    |     Version:           
 Keywords:            |    Verified:  0        
----------------------+-----------------------------------------------------
 Jotpad
 Jotpad has been in vision for quite long for us here in OLPCNepal
 essentially because it utilizes the canvas in the XO

 what's this
 this is a fairly basic prototype of jotpad that takes the writing and then
 uses it to detect it from a list of characters.


 {{{
 #include <gtk/gtk.h>
 #include <stdio.h>
 #include <malloc.h>
 #include <math.h>
 #define part 10
 #define chno 26
 static int len,count,tm[2][16];
 static GdkPixmap *pixmap = NULL;
 float statistic_data(char *src, char *des)            // Real Core Code
 {
     int i=0,j=0,ax,ay,bx,by,sigx=0,sigy=0;
     float
 xbar,ybar,sigu,sigv=0,sigu2=0,sigv2=0,siguv=0,karl_pearson,karl_pearsony;
     float *u,*v,*u2,*v2,*uv;
     FILE *X,*Y;
     X = fopen (src,"r");                    // open test file
     Y = fopen (des,"r");                    //open template file
     while(!feof(X))                        //until test file ends
 {
     fscanf(X,"%d %d  ",&ax,&ay);                // get x y
     sigx=sigx+ax;                        // calculate sum of all x
     fscanf(Y,"%d %d  ",&bx,&by);                //    "
     sigy=sigy+bx;                        //        "
     i++;
 }
     rewind(X);                        // starting file pointer
     rewind(Y);                        //    "
     xbar=sigx/part;                        //    mean x of test
     ybar=sigy/part;                        //    mean x of template
     u = (float*)calloc (part,sizeof(float));        // create u=x- x(bar)
 table
     v = (float*)calloc (part,sizeof(float));        //    "
     u2 = (float*)calloc (part,sizeof(float));        //    u(square
     v2 = (float*)calloc (part,sizeof(float));        //    v"
     uv = (float*)calloc (part,sizeof(float));        //    uv
     for(i=1;i<=part;i++)                    // upto all chunks
     {
         fscanf(X,"%d %d  ",&ax,&ay);            // get x y of test
         fscanf(Y,"%d %d  ",&bx,&by);            // get x y of template
         *(u+i) = ax-xbar;                // put u = x-x(bar)
         sigu = sigu + *(u+i);                // sumof all u
         *(v+i) = bx-ybar;                //    "
         sigv = sigv + *(v+i);                //        "
         *(u2+i) = (*(u+i)) * (*(u+i));            // calc u(square)
         sigu2 = sigu2 + *(u2+i);            // sum of u(square)
         *(v2+i) = (*(v+i)) * (*(v+i));            //    "
         sigv2 = sigv2 + *(v2+i);            //        "
         *(uv+i) = (*(u+i)) * (*(v+i));            // calc u*v
         siguv = siguv + *(uv+i);            //sum of u*v
     }
         karl_pearson = siguv/(sqrt(sigu2) * sqrt(sigv2));    // calculate
 karlpearson
         printf("\n%f is the karl pearson coefficient",karl_pearson);
     while(!feof(X))                //similar as above but this is for y
 axis
 {
     fscanf(X,"%d %d  ",&ay,&ax);
     sigx=sigx+ax;
     fscanf(Y,"%d %d  ",&by,&bx);
     sigy=sigy+bx;
     i++;
 }
     rewind(X);
     rewind(Y);
     xbar=sigx/part;
     ybar=sigy/part;
     u = (float*)calloc (part,sizeof(float));
     v = (float*)calloc (part,sizeof(float));
     u2 = (float*)calloc (part,sizeof(float));
     v2 = (float*)calloc (part,sizeof(float));
     uv = (float*)calloc (part,sizeof(float));
     for(i=1;i<=part;i++)
     {
         fscanf(X,"%d %d  ",&ay,&ax);
         fscanf(Y,"%d %d  ",&by,&bx);
         *(u+i) = ax-xbar;
         sigu = sigu + *(u+i);
         *(v+i) = bx-ybar;
         sigv = sigv + *(v+i);
         *(u2+i) = (*(u+i)) * (*(u+i));
         sigu2 = sigu2 + *(u2+i);
         *(v2+i) = (*(v+i)) * (*(v+i));
         sigv2 = sigv2 + *(v2+i);
         *(uv+i) = (*(u+i)) * (*(v+i));
         siguv = siguv + *(uv+i);
     }
         karl_pearsony = siguv/(sqrt(sigu2) * sqrt(sigv2));
         printf("\n%f is the karl pearson coefficient",karl_pearsony);
     fclose(X);
     fclose(Y);
     free(u);            // free all pointer
     free(v);
     free(u2);
     free(v2);
     free(uv);
     return karl_pearson+karl_pearsony;    //return totoal karlpearson
 }
 void cleararea (GtkWidget *saw, gpointer data)        // this is not
 working i need to review in more detial

     {
     printf("\nuHUHUHU");
 GtkWidget *draw = GTK_WIDGET(data);
 gdk_draw_rectangle
 (pixmap,draw->style->white_gc,FALSE,0,0,draw->allocation.width,draw->allocation.height);
           gtk_widget_queue_draw_area
 (draw,0,0,draw->allocation.width,draw->allocation.height);

 printf("\n%d",draw->allocation.width);
     }
 gboolean configure_pixmap (GtkWidget *widget, gpointer data)            //
 create pixmap and adjust to drawing area
 {
     len = 0;
     count=0;
 if (pixmap)
     g_object_unref(pixmap);
     pixmap =
 gdk_pixmap_new(widget->window,widget->allocation.width,widget->allocation.height,-1);
   gdk_draw_rectangle
 (pixmap,widget->style->white_gc,TRUE,0,0,widget->allocation.width,widget->allocation.height);
   return TRUE;
 }
 gboolean draw_update(GtkWidget *widget)                        // update
 drawing in pixmap
 {
     gdk_draw_drawable
 (widget->window,widget->style->fg_gc[GTK_WIDGET_STATE
 (widget)],pixmap,0,0,0,0,widget->allocation.width,
 widget->allocation.height);
     return TRUE;
 }
 gboolean getxy (GtkWidget *area, gpointer data)            // show the
 recognition comparision
 {
     FILE *fp,*np;                        // two filepointer of all data
 and divided data
     char ch,cha[2];
     char *src = "ujwal.txt";
     char *des[26] =
 {"A.txt","B.txt","C.txt","D.txt","E.txt","F.txt","G.txt","H.txt","I.txt","J.txt","K.txt","L.txt","M.txt","N.txt","O.txt","P.txt","Q.txt","R.txt","S.txt","T.txt","U.txt","V.txt","W.txt","X.txt","Y.txt","Z.txt"};
 //list of files to compare
     int x,n,c=0,i=1,y;
     float cc,aa,bb,kar[chno];
     static int a;
     fp=fopen("tmp.txt","r");                // open all data file
     np=fopen("ujwal.txt","w+");                // open new data file
 GtkWidget *label = GTK_WIDGET(data);                // label to print
 recognised character
     c=0;
     if(len == 0)
     {
     printf("error in writing and gaining data");
     }
     else
     {
     printf("\n%d is the length\n",len);
     n=len/part;                        //divide 10 equal parts
     while(!feof(fp))                    //until file ends
         {
             fscanf(fp,"%d %d  ",&x,&y);        //get xy from file tmp.txt
             if(n * i == c)                //if that value is exact 10
 parts save in
     {
             fprintf(np,"%d %d  ",x,y);        // ujwal.txt
             i++;
     }
         c++;
         }
     }
         fclose(fp);                    //close files
         fclose(np);
     kar[0]=statistic_data(src,des[0]);
         aa = kar[0];
         ch = 65;
     for (i = 1; i < chno;i++)
     {
         kar[i] = statistic_data(src,des[i]);
         if (aa < kar[i])
         {
         aa = kar[i];
         ch = 65 + i;
         }
 }
         cha[0]=ch;
         cha[1]='\0';
 gtk_label_set_text (GTK_LABEL (label),cha);
 printf(" %c is recognised\n\n\n ",ch);
 return TRUE;
 }
 void draw (GtkWidget *draw,GdkEventButton *butto)
 //function to draw on pixmap
 {
     FILE *tmp;                //create a file pointer tmp
     int x,y;                    // x y interger variable
     tmp=fopen("tmp.txt","a+");        // open tmp.txt in append mode +
    GdkModifierType stat;            // A GDK modifier mask
           gdk_window_get_pointer (draw->window, &x, &y, &stat);    //get
 pointer x and y with mouse status
     if (stat & GDK_BUTTON1_MASK)            //check if button pressed
     {
     //g_printf("%d and %d\t",x,y);
         len++;                    // inc len var
         fprintf(tmp,"%d %d  ",x,y);
     gdk_draw_rectangle (pixmap,draw->style->black_gc,TRUE,x-5,y-5,10,10);
 //draw small rectangle
           gtk_widget_queue_draw_area (draw,x-5,y-5,10,10);        // query
 to draw in pixmap
         }
     fclose(tmp);                            //close file tmp.txt
 }
 void killall (GtkWidget *window,gpointer data)            //function to
 kill window and all
 {
     gtk_main_quit();
 }
 int main( int   argc,char *argv[] )
 {
     GtkWidget *window;                    //create a pointer window
     GtkWidget *frame;                    //    "
     GtkWidget *frame1;                    //    "
     GtkWidget *button;                    //    "
     GtkWidget *clrbut;                //    "
     GtkWidget *box;                    //    "
     GtkWidget *box1;                    //    "
     GtkWidget *hbox;                    //    "
     GtkWidget *drawing;                    //    "
     GtkWidget *label;                    //    "
     FILE *tmp;                    // file pointer tmp
     tmp=fopen("tmp.txt","w+");            // open file tmp.txt in write
 mod if exists or not
         gtk_init (&argc, &argv);            // program argument to gtk
 initiating function
      window = gtk_window_new (GTK_WINDOW_TOPLEVEL);    // create a new
 window pointed by window pointer
     box = gtk_vbox_new (FALSE, 0);            //    "
     gtk_container_add (GTK_CONTAINER (window), box);    //    add box to
 window
     button = gtk_button_new_with_label ("Recognise");    // create a
 button with label recognize
     clrbut = gtk_button_new_with_label ("Clear");    //    "
     box1 = gtk_vbox_new (TRUE, 0);            //    "
     hbox = gtk_hbox_new (TRUE,0);            //    "
     label = gtk_label_new ("ujwal");            //    "
     drawing = gtk_drawing_area_new ();            //    "
     fclose(tmp);                    // close file     (PURPOSE JUST CREATE
 A FILE)
     gtk_window_set_title (GTK_WINDOW (window), "Handwriting recognition");
 //set title
     gtk_widget_set_size_request (window, 300, 300);                // set
 size
     gtk_widget_set_size_request (drawing, 100, 100);                //
 "
     frame = gtk_frame_new (NULL);                        // create new
 frame
     frame1 = gtk_frame_new (NULL);                        //
     gtk_box_pack_start (GTK_BOX (box), hbox, TRUE, TRUE, 0);            //
 pack hbox in box
     gtk_box_pack_start (GTK_BOX (hbox), frame ,TRUE,TRUE, 0);
 //    "
     gtk_box_pack_start (GTK_BOX (hbox), frame1 ,TRUE,TRUE, 0);
 //    "
     gtk_container_add (GTK_CONTAINER (box1), button);                //
 add button to box
     gtk_container_add (GTK_CONTAINER (box1), clrbut);                //
 "
     gtk_container_add (GTK_CONTAINER (frame1),label);                //
 "
     gtk_box_pack_start (GTK_BOX (box), box1, TRUE, TRUE,0);            //
 "
     gtk_container_add (GTK_CONTAINER (frame), drawing);                //
 "
     gtk_frame_set_label (GTK_FRAME (frame), "Main area");            //
 set frame name
     gtk_frame_set_label (GTK_FRAME (frame1), "Recog");                //
 "
     g_signal_connect (G_OBJECT(drawing),
 "expose_event",G_CALLBACK(draw_update),NULL);    //connect window expose
 to draw_update function
     g_signal_connect (G_OBJECT (drawing), "configure_event",G_CALLBACK
 (configure_pixmap), NULL);    //connect initial configuration to
 configure_pixmap function
     g_signal_connect (G_OBJECT (button), "clicked",G_CALLBACK (getxy),
 label);        // RECOGnize button clicked - start recognising
   g_signal_connect (G_OBJECT (clrbut), "clicked",G_CALLBACK (cleararea),
 drawing);    // clear drawing area
     g_signal_connect (G_OBJECT (drawing), "motion_notify_event",
 G_CALLBACK (draw), NULL);    // mouse in motion connect to draw function
     g_signal_connect (G_OBJECT(window),"destroy",G_CALLBACK
 (killall),NULL);    // close button in window
     gtk_widget_set_events (drawing,GDK_EXPOSURE_MASK
              | GDK_LEAVE_NOTIFY_MASK
              | GDK_BUTTON_PRESS_MASK
              | GDK_POINTER_MOTION_MASK
              | GDK_POINTER_MOTION_HINT_MASK);
 // mask for the drawing area
     gtk_widget_show (label);                // show label
     gtk_widget_show (frame);                //    "
     gtk_widget_show (frame1);                //    "
     gtk_widget_show (button);                //    "
     gtk_widget_show (clrbut);            //    "
     gtk_widget_show (box);                //    "
     gtk_widget_show (hbox);                //    "
     gtk_widget_show (drawing);                //    "
     gtk_widget_show (box1);                //    "
         gtk_widget_show (window);            //    "
            gtk_main ();                    // run gtk all events and guis
     return 0;                    // function end return value
 }


 #compiling really makes me mad for a long time but now it's ok i used this
 command
 # gcc -o handwriting  handwritingrecognition.c -I/usr/include/gtk-2.0
 -I/usr/lib/gtk-2.0/include #-I/usr/include/atk-1.0 -I/usr/include/cairo
 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0
 #-I/usr/lib/glib-2.0/include  -L/usr/lib -lgtk-x11-2.0 -lgdk-x11-2.0
 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 #-lpango-1.0 -lcairo
 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
 #you can use `pkg-config --cflags --libs gtk+-2.0` or this command echo as
 above.
 }}}

-- 
Ticket URL: <http://dev.laptop.org/ticket/1546>
One Laptop Per Child <http://laptop.org/>



More information about the Bugs mailing list