git » fp-git.git » commit 6f6bab4

this version will probably not developed longer

author peter_k
2005-06-28 21:18:59 UTC
committer peter_k
2005-06-28 21:18:59 UTC
parent 077233dd6e5b9e9737ee6093b6b688e35e59c6f6

this version will probably not developed longer

poprecog/poprecog.c +219 -61

diff --git a/poprecog/poprecog.c b/poprecog/poprecog.c
index 66cf6f5..14cf33f 100644
--- a/poprecog/poprecog.c
+++ b/poprecog/poprecog.c
@@ -14,6 +14,7 @@
 /* Header files */
 #include <stdio.h>
 #include <stdlib.h>
+#include <time.h>
 #include <strings.h>
 #include <dirent.h>
 //#include <qsort.h>
@@ -50,6 +51,8 @@ int imagesNumber;
 
 BITMAP *screenShot, *transparentScreenShot, *DEBUGScreenShot;
 
+int DEBUGY = 0;
+
 struct sDirInfo
 {
   char dirName[16];
@@ -66,13 +69,17 @@ typedef struct sRecognized
   int imageID;
   int posX, posY;
   int goodPixels;
+  int layer;
+  int pixelsNumber;  
   int upperLayers;  
   int goodPixelsPercent;
   int ownedPixels; // for recognizeMap
 } tRecognized;
 tRecognized recognized[MAX_RECOGNIZED_ITEMS];
 int recognizedNumber;
+int totalNumberOfRecognizedImages;
 
+int actualLayer;
 int recognizeMap[320][200]; // here are stored information which 'recognize result' have this pixel
 int layerOrder[MAX_RECOGNIZED_ITEMS]; // for bitmap recognizing
 
@@ -113,7 +120,7 @@ int cmptImage(void *a, void *b)
   return 0;
 }
 
-int cmptRecognized(void *a, void *b)
+/*int cmptRecognized(void *a, void *b)
 {
   register int pxa = ((tRecognized*)(a))->goodPixelsPercent;
   register int pxb = ((tRecognized*)(b))->goodPixelsPercent;
@@ -122,6 +129,35 @@ int cmptRecognized(void *a, void *b)
   if (pxa<pxb)
     return 1;
   return 0;
+}*/
+
+int cmptRecognized(void *a, void *b)
+{
+  register int laa = ((tRecognized*)(a))->layer;
+  register int lab = ((tRecognized*)(b))->layer; 
+  register int pxa = ((tRecognized*)(a))->goodPixels;
+  register int pxb = ((tRecognized*)(b))->goodPixels;
+  register int ula = ((tRecognized*)(a))->upperLayers;
+  register int ulb = ((tRecognized*)(b))->upperLayers;  
+  register int pna = ((tRecognized*)(a))->pixelsNumber;
+  register int pnb = ((tRecognized*)(b))->pixelsNumber;  
+  /*if (laa>lab)
+    return -1;
+  if (laa<lab)
+    return 1;*/
+  if (pxa>pxb)
+    return -1;
+  if (pxa<pxb)
+    return 1;
+  /*if (ula>ulb)
+    return 1;
+  if (ula<ulb)
+    return -1;*/
+  if (pna>pnb)
+    return -1;
+  if (pna<pnb)
+    return 1;    
+  return 0;
 }
 
 inline int findImageOnScreenShotInPosition(int imageID, int posX, int posY)
@@ -132,7 +168,8 @@ inline int findImageOnScreenShotInPosition(int imageID, int posX, int posY)
   register int goodPixels;
   BITMAP *bitmap = image[imageID].bitmap;  
   register int wPer2 = bitmap->w / 2;
-  register int hPer2 = bitmap->h / 2;  
+  register int hPer2 = bitmap->h / 2;
+  int alreadyExist, newRecognized = 0;
   
   for (i = 0; i < recognizedNumber; i++)
     layerOrder[i] = 0;
@@ -165,70 +202,95 @@ inline int findImageOnScreenShotInPosition(int imageID, int posX, int posY)
       return 0;
     }  
 
-  recognized[recognizedNumber].upperLayers = 0;    
+  newRecognized = recognizedNumber;
+  alreadyExist = 0;  
   for (i = 0; i < recognizedNumber; i++)
+  {
+    if ((recognized[i].imageID == imageID) &&
+        (recognized[i].posX == posX) &&
+        (recognized[i].posY == posY))
+      {  
+        newRecognized = i;
+        alreadyExist = 1;        
+        break;
+      }  
+  }
+
+  recognized[newRecognized].upperLayers = 0;    
+  for (i = 0; i < newRecognized; i++)
+    //if ((layerOrder[i] > 0) && (image[recognized[i].imageID].pixelsNumber > image[imageID].pixelsNumber))
+    //if ((layerOrder[i] > 0) && ((recognized[i].layer > actualLayer) || (layerOrder[i] == image[recognized[i].imageID].pixelsNumber)))
     if (layerOrder[i] > 0)
       goodPixels += layerOrder[i];
     else
     if (layerOrder[i] < 0)
-      recognized[recognizedNumber].upperLayers++;
-      
-  ///printf("Maybe %s (%d,%d) -> goodPixels = %d (max %d)\n", image[imageID].filePath, posX, posY, goodPixels, image[imageID].pixelsNumber);
-//  rest(100);
+      recognized[newRecognized].upperLayers++;
       
   if (((goodPixels*100)/image[imageID].pixelsNumber) < dirInfo[image[imageID].dirID].optMinImagePercent) return 0;
-//   dir[image[imageID].dirID].recognizedNumber++;  
+  
+  if ((!strcmp(image[imageID].filePath, "pop1swords\\image00714.bmp")) && (posY == 32))
+  {
+    printf("%03d Maybe %s (%d,%d) -> goodPixels = %d (max %d)\n", goodPixels, image[imageID].filePath, posX, posY, goodPixels, image[imageID].pixelsNumber);
+    rest(200);
+  }  
+//   dir[image[imageID].dirID].newRecognized++;  
   ///printf("Added!\n");
   //return goodPixels;
   
-  recognized[recognizedNumber].imageID = imageID;
-  recognized[recognizedNumber].posX = posX;  
-  recognized[recognizedNumber].posY = posY;
-  recognized[recognizedNumber].goodPixels = goodPixels;
-  recognized[recognizedNumber].goodPixelsPercent = (recognized[recognizedNumber].goodPixels*100)/image[imageID].pixelsNumber;
-  recognized[recognizedNumber].ownedPixels = 0;
+  recognized[newRecognized].imageID = imageID;
+  recognized[newRecognized].posX = posX;  
+  recognized[newRecognized].posY = posY;
+  recognized[newRecognized].goodPixels = goodPixels;
+  recognized[newRecognized].pixelsNumber = image[imageID].pixelsNumber;
+  recognized[newRecognized].goodPixelsPercent = (recognized[newRecognized].goodPixels*100)/image[imageID].pixelsNumber;
+  recognized[newRecognized].ownedPixels = 0;
+  if (!alreadyExist) recognized[newRecognized].layer = actualLayer;
   
-  for (x = 0; x < bitmap->w; x++)
+  /*for (x = 0; x < bitmap->w; x++)
     for (y = 0; y < bitmap->h; y++)  
     {
       value = recognizeMap[posX+x][posY+y];
       if ((((short *)bitmap->line[y])[x] != transparentPixel) &&       
           (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
       {
-        if (value == -1)
+        if ((value == -1) || (value = newRecognized))
         {
-          recognizeMap[posX+x][posY+y] = recognizedNumber;
-          recognized[recognizedNumber].ownedPixels++;
+          recognizeMap[posX+x][posY+y] = newRecognized;
+          recognized[newRecognized].ownedPixels++;
         }
         else
         if (layerOrder[value] >= 0)
         {
-          if (recognized[value].goodPixels < recognized[recognizedNumber].goodPixels)
+          if (recognized[value].goodPixels < recognized[newRecognized].goodPixels)
           {
             recognized[value].ownedPixels--;
-            recognizeMap[posX+x][posY+y] = recognizedNumber;
-            recognized[recognizedNumber].ownedPixels++;
+            recognizeMap[posX+x][posY+y] = newRecognized;
+            recognized[newRecognized].ownedPixels++;
           }
           else
-          if ((recognized[value].goodPixels == recognized[recognizedNumber].goodPixels) && (recognized[value].upperLayers > recognized[recognizedNumber].upperLayers))
+          if ((recognized[value].goodPixels == recognized[newRecognized].goodPixels) && (recognized[value].upperLayers > recognized[newRecognized].upperLayers))
           {
             recognized[value].ownedPixels--;
-            recognizeMap[posX+x][posY+y] = recognizedNumber;
-            recognized[recognizedNumber].ownedPixels++;
+            recognizeMap[posX+x][posY+y] = newRecognized;
+            recognized[newRecognized].ownedPixels++;
           }          
         }  
       }
     }
- ///printf("Recognize map result-> %d\n", recognized[recognizedID].ownedPixels);
+  ///printf("Recognize map result-> %d\n", recognized[recognizedID].ownedPixels);
+  
  
   if (recognized[recognizedNumber].ownedPixels > 0)
-  {
-    recognizedNumber++;
-    dirInfo[image[imageID].dirID].recognizedNumber++; 
-    return recognized[recognizedNumber].ownedPixels;    
-  }
+  {*/
+    if (!alreadyExist)
+    {
+      recognizedNumber++;
+      dirInfo[image[imageID].dirID].recognizedNumber++; 
+    }
+    return recognized[newRecognized].ownedPixels;
+  /*}
   else
-    return 0;
+    return 0;*/
 }
 
 inline int putImageOnRecognizeMap(BITMAP *bitmap, int posX, int posY, int recognizedID)
@@ -297,18 +359,52 @@ inline int putImageOnRecognizeMap(BITMAP *bitmap, int posX, int posY, int recogn
  return recognized[recognizedID].ownedPixels;  
 }
 
-int removeImageFromRecognizeMap(BITMAP *bitmap, int posX, int posY)
+inline int putAndCheck(int recognizedID, int posX, int posY)
 {
   register int x, y, value;
   register short transparentPixel = makecol16(0, 0, 0);
   register short screenShotTransparentPixel = makecol16(255, 0, 255);
+  BITMAP *bitmap = image[recognized[recognizedID].imageID].bitmap;
+  int newPixels = 0;
+  
+  for (x = 0; x < bitmap->w; x++)
+    for (y = 0; y < bitmap->h; y++)  
+    {
+      value = recognizeMap[posX+x][posY+y];
+      if ((((short *)bitmap->line[y])[x] != transparentPixel) &&       
+          (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
+      {
+        if (recognized[value].layer == recognized[recognizedID].layer) return 0;
+        if ((value == -1) || (value == recognizedID))
+        {
+          recognizeMap[posX+x][posY+y] = recognizedID;
+          recognized[recognizedID].ownedPixels++;
+          newPixels++;          
+        }
+      }
+    }    
+   
+  ///printf("Recognize map result-> %d\n", recognized[recognizedID].ownedPixels);
+  if (newPixels > 0)
+    return 1;
+  else
+    return 0;
+  //return recognized[recognizedID].ownedPixels;  
+}
+
+int removeImageFromRecognizeMap(int recognizedID, int posX, int posY)
+{
+  register int x, y, value;
+  register short transparentPixel = makecol16(0, 0, 0);
+  register short screenShotTransparentPixel = makecol16(255, 0, 255);
+  BITMAP *bitmap = image[recognized[recognizedID].imageID].bitmap;  
 
   for (x = 0; x < bitmap->w; x++)
     for (y = 0; y < bitmap->h; y++)  
     {
       if ((((short *)bitmap->line[y])[x] != transparentPixel) &&       
           (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
-        recognizeMap[posX+x][posY+y] = -1;
+        recognizeMap[posX+x][posY+y] = recognizedID;
     }  
 }
 
@@ -352,7 +448,7 @@ int cutImageFromScreenShot(BITMAP *bitmap, int posX, int posY)
 
 int cutImageFromDEBUGScreenShot(BITMAP *bitmap, int posX, int posY)
 {
-  register int x, y, c;
+  register int x, y, c, i;
   register int transparentPixel = makecol16(0, 0, 0);
   register int randomColour = makecol16(rand()%256, rand()%256, rand()%256);  
   char buf[100];
@@ -362,8 +458,13 @@ int cutImageFromDEBUGScreenShot(BITMAP *bitmap, int posX, int posY)
     {
       if ((((short *)bitmap->line[y])[x] != transparentPixel) && 
           (((short *)bitmap->line[y])[x] == ((short *)screenShot->line[posY+y])[posX+x]))
-        ((short *)DEBUGScreenShot->line[posY+y])[posX+x] = randomColour;
+        {  
+          ((short *)DEBUGScreenShot->line[posY+y])[posX+x] = randomColour;
+        }
+      if ((((short *)bitmap->line[y])[x] != transparentPixel) && (DEBUGY < 1000))
+        ((short *)DEBUGScreenShot->line[400+DEBUGY+y+posY])[x+posX] = makecol(255, 0, 255);
     }
+  DEBUGY += bitmap->h + 10;
   //sprintf(buf, "ss_%05d.bmp", rand()%9999);
   //save_bitmap(buf, actualScreenShot, 0);    
   //rest(500);
@@ -542,11 +643,11 @@ void recognizeScreenShot(int screenShotID)
   char buf[100];
   int x, y;  
   int i, j, k, l, tmp;
-  int layerNumber = 0;
-  int totalNumberOfRecognizedImages = 0;
   short transparentPixel = makecol(0, 0, 0);
   register short screenShotTransparentPixel = makecol(255, 0, 255);  
   int maxPixelsPercent, maxPixelsID;
+  int TMP = 0;
+  int recognizedNow, recognizedBefore;
   //int maxImages, tmp, nrOfRecognizedImages, nrOfRecognizedImagesThisSession;
   
   printf("Recognizing %s\n", screenShotList[screenShotID].fileName);
@@ -554,8 +655,12 @@ void recognizeScreenShot(int screenShotID)
   sprintf(buf, "%s\\%s", screenShotsDir, screenShotList[screenShotID].fileName);
   screenShot = load_bmp(buf, 0);
   transparentScreenShot = load_bmp(buf, 0);  
-  DEBUGScreenShot = load_bmp(buf, 0);
+  DEBUGScreenShot = create_bitmap(320, 2000);
+  clear_to_color(DEBUGScreenShot, makecol(50, 50, 50));
+  blit(screenShot, DEBUGScreenShot, 0, 0, 0, 200, 320, 200);  
+  totalNumberOfRecognizedImages = 0;  
   recognizedNumber = 0;
+  actualLayer = 0;
   for (i = 0; i < 320; i++)
     for (j = 0; j < 200; j++)
     {
@@ -564,54 +669,105 @@ void recognizeScreenShot(int screenShotID)
   for (i = 0; i < dirsNumber; i++)
     dirInfo[i].recognizedNumber = 0;
     
+  recognizedNow = 0;
   do
   {
-    if ((optMaxLayers != 0) && (layerNumber+1 > optMaxLayers)) break;
-    printf("# Checking layer %d\n", layerNumber);
-//    i = 0;
-//    for (y = 0; y < recognizedNumber; y++)
-//      if (recognized[y].ownedPixels != 0) i++;
-    i = recognizedNumber;
+    recognizedBefore = recognizedNow;
+    recognizedNow = 0;
+    /* TODO (#1#): delete TMP variable */
+    TMP++;
+    if (TMP > 3) break;
+    //if ((optMaxLayers != 0) && (layerNumber+1 > optMaxLayers)) break;   
+   
+    i = recognizedNumber;   
+    printf("# Checking layer %d\n", actualLayer);
+    //i = 0;
+    //for (y = 0; y < recognizedNumber; y++)
+    //if (recognized[y].ownedPixels != 0) i++;
+    
     for (x = 0; x < imagesNumber; x++)
     {
-      if (dirInfo[image[x].dirID].recognizedNumber < dirInfo[image[x].dirID].optMaxRecognizedNumber)
-        findImageOnScreenShot(x);
+      /* TODO (#1#): delete // below */
+      //if (dirInfo[image[x].dirID].recognizedNumber < dirInfo[image[x].dirID].optMaxRecognizedNumber)
+      findImageOnScreenShot(x);
     }
-    for (x = 0; x < recognizedNumber; x++)
-      cutImageFromTransparentScreenShot(image[recognized[x].imageID].bitmap, recognized[x].posX, recognized[x].posY);
-//    j = 0;
-//    for (y = 0; y < recognizedNumber; y++)
-//      if (recognized[y].ownedPixels != 0) j++;    
+    
+    qsort(recognized, recognizedNumber, sizeof(tRecognized), cmptRecognized);
+    
+    /*for (i = 0; i < 320; i++)
+      for (j = 0; j < 200; j++)
+      {
+        recognizeMap[i][j] = -1;
+      }   
+    recognizedNumber = 0;*/
+    for (i = 0; i < 320; i++)
+      for (j = 0; j < 200; j++)
+      {
+        recognizeMap[i][j] = -1;
+      }    
+    totalNumberOfRecognizedImages = 0;
+    for (i = 0; i < recognizedNumber; i++)
+      recognized[i].ownedPixels = 0;
+    for (i = 0; i < recognizedNumber; i++)
+    {
+      //recognized[i].ownedPixels = 0;
+      if (putAndCheck(i, recognized[i].posX, recognized[i].posY))
+      {
+        totalNumberOfRecognizedImages++;       
+        cutImageFromTransparentScreenShot(image[recognized[i].imageID].bitmap, recognized[i].posX, recognized[i].posY);
+        removeImageFromRecognizeMap(i, recognized[i].posX, recognized[i].posY);
+        printf("Hmm %s d%c l%d x%d y%d (OW:%d / GO:%d / TO:%d / UL:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].layer, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, image[recognized[i].imageID].pixelsNumber, recognized[i].upperLayers);
+
+        /*blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200);
+        blit(image[recognized[i].imageID].bitmap, DEBUGScreenShot, 0, 0, recognized[i].posX, recognized[i].posY, image[recognized[i].imageID].bitmap->w, image[recognized[i].imageID].bitmap->h);
+        sprintf(buf, "ss_new_%02d_%03d.bmp", screenShotID, totalNumberOfRecognizedImages);
+        save_bitmap(buf, DEBUGScreenShot, 0);*/
+      }
+    }  
+
+    //j = 0;
+    //for (y = 0; y < recognizedNumber; y++)
+    //if (recognized[y].ownedPixels != 0) j++;    
     j = recognizedNumber;
-    sprintf(buf, "ss_db_%02d_s_%d.bmp", screenShotID, layerNumber);
-    save_bitmap(buf, transparentScreenShot, 0);      
+//    sprintf(buf, "ss_db_%02d_s_%d.bmp", screenShotID, actualLayer);
+//    save_bitmap(buf, transparentScreenShot, 0);      
     
-    layerNumber++;    
+    actualLayer++;    
+        
+    /* TODO (#1#): delete this two lines below */
+    j=1;
+    i=0;
   }
   while (j - i != 0);
   
+  //return 13+13;
+  
 //  for (i = 0; i < 320; i++)
 //    for (j = 0; j < 200; j++)
 //    {
 //      recognizeMap[i][j] = -1;
 //    }
     
-  qsort(recognized, recognizedNumber, sizeof(tRecognized), cmptRecognized);    
   totalNumberOfRecognizedImages = 0;  
   for (i = 0; i < recognizedNumber; i++)
   {
     if (recognized[i].ownedPixels)
     {
       totalNumberOfRecognizedImages++;
-      printf("Found %s %c %d %d (OW:%d / GO:%d / PR: %d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, recognized[i].goodPixelsPercent, image[recognized[i].imageID].pixelsNumber);
-      fprintf(outputFile, "Found %s %c %d %d (OW:%d / GO:%d / PR: %d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, recognized[i].goodPixelsPercent, image[recognized[i].imageID].pixelsNumber);
+      printf("Found %s d%c l%d x%d y%d (OW:%d / GO:%d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].layer, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, image[recognized[i].imageID].pixelsNumber);
+      fprintf(outputFile, "Found %s d%c l%d x%d y%d (OW:%d / GO:%d / TO:%d)\n", image[recognized[i].imageID].filePath, image[recognized[i].imageID].direction, recognized[i].layer, recognized[i].posX, recognized[i].posY, recognized[i].ownedPixels, recognized[i].goodPixels, image[recognized[i].imageID].pixelsNumber);
       
-      blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200);
+      /*blit(transparentScreenShot, DEBUGScreenShot, 0, 0, 0, 0, 320, 200);
       blit(image[recognized[i].imageID].bitmap, DEBUGScreenShot, 0, 0, recognized[i].posX, recognized[i].posY, image[recognized[i].imageID].bitmap->w, image[recognized[i].imageID].bitmap->h);
       sprintf(buf, "ss_ds_%02d_%03d.bmp", screenShotID, totalNumberOfRecognizedImages);
-      save_bitmap(buf, DEBUGScreenShot, 0);
-    }  
-  }  
+      save_bitmap(buf, DEBUGScreenShot, 0);*/
+      
+      cutImageFromDEBUGScreenShot(image[recognized[i].imageID].bitmap, recognized[i].posX, recognized[i].posY);
+    }
+  }
+  sprintf(buf, "ss_debug_%s.bmp", screenShotList[screenShotID]);
+  save_bitmap(buf, DEBUGScreenShot, 0);  
+  
   return 13;
 
   for(;;)
@@ -932,6 +1088,8 @@ int main(int argc, char *argv[])
   int i;
   long timeBefore, timeAfter;
   
+  srand((unsigned int)time((time_t *)NULL));  
+  
   allegro_init();
   set_color_depth(16);
   set_color_conversion(COLORCONV_TOTAL);