chiark / gitweb /
Store full-colour image with every screenshot
[ypp-sc-tools.db-test.git] / pctb / structure.c
index 6ccbb5e76b217518c54b7dcd66c84cb66e1554c4..bf4fcbd6399c496e0e800b3d05f5f16ad12d7129 100644 (file)
@@ -92,10 +92,16 @@ const CanonColourInfo canoncolourinfos[]= {
 
 static void mustfail1(const char *file, int line, const char *what) {
   fprintf(stderr,
-         "\n\n"
-         "Unable to figure out contents of YPP client display.\n"
-         " Check that your client is logged in has the correct display.\n"
-         " If that isn't the problem, please report this as a fault.\n\n"
+ "\n\n"
+ "Unable to figure out contents of YPP client display.\n"
+ "Please check the following:\n"
+ "   * YPP client is showing commodity listing screen\n"
+ "   * YPP client has antialiased text turned off (Ye / Options / General)\n"
+ "   * YPP client window is on top (we try to raise it but your window\n"
+ "      manager might have prevented that from succeeding)\n"
+ "   * Your X display is 24bpp (NB some VNC servers use 16bpp by default)\n"
+ "\n"
+ "If all of these are true, please report this as a fault.\n\n"
          "Technical details:"
          " %s:%d: requirement failed:\n"
          " %s\n",
@@ -127,20 +133,23 @@ static void mustfail2(void) {
 #define REQUIRE_RECTANGLE(tlx,tly,brx,bry,ok) \
  require_rectangle(tlx, tly, brx, bry, ok, __LINE__);
 
-static void require_rectangle(int tlx, int tly, int brx, int bry,
-                             const char *ok, int lineno) {
+#define FOR_P_RECT(p,rect)                             \
+  for ((p).x=(rr).tl.x; (p).x<=(rr).br.x; (p).x++)     \
+    for ((p).y=(rr).tl.y; (p).y<=(rr).br.y; (p).y++)
+
+static void require_rectangle_r(Rect rr, const char *ok, int lineno) {
   Point p;
-  for (p.x=tlx; p.x<=brx; p.x++)
-    for (p.y=tly; p.y<=bry; p.y++) {
-      int c= get_p(p);
-      MUST( strchr(ok,c), ({
-            Rect rm={{tlx,tly},{brx,bry}};
-            MI(lineno),MR(rm);MP(p);MS(ok);
-      }));
-    }
+  FOR_P_RECT(p,rr) {
+    int c= get_p(p);
+    MUST( strchr(ok,c), ({
+      MI(lineno),MR(rr);MP(p);MS(ok);
+    }));
+  }
 }
-static void require_rectangle_r(Rect rr, const char *ok, int lineno) {
-  require_rectangle(rr.tl.x,rr.tl.y, rr.br.x,rr.br.y, ok, lineno);
+static void require_rectangle(int tlx, int tly, int brx, int bry,
+                             const char *ok, int lineno) {
+  Rect rr= {{tlx,tly},{brx,bry}};
+  require_rectangle_r(rr, ok, lineno);
 }
 
 static void debug_rect(const char *what, int whati, Rect rr) {
@@ -369,7 +378,6 @@ static void file_read_image_ppm(FILE *f) {
   struct pam inpam;
   unsigned char rgb_buf[3];
   CanonImage *im;
-  RgbImage *ri=0;
 
   pnm_readpaminit(f, &inpam, sizeof(inpam));
   if (!(inpam.maxval == 255 &&
@@ -377,9 +385,6 @@ static void file_read_image_ppm(FILE *f) {
        inpam.format == RPPM_FORMAT))
     fatal("PNM screenshot(s) file must be 8bpp 1 byte per sample RGB");
 
-  if (!npages)
-    page0_rgbimage= ri= alloc_rgb_image(inpam.width, inpam.height);
-
   CANONICALISE_IMAGE(im, inpam.width, inpam.height, {
     int r= fread(&rgb_buf,1,3,f);
     sysassert(!ferror(f));
@@ -390,8 +395,6 @@ static void file_read_image_ppm(FILE *f) {
        ((unsigned long)rgb_buf[1]<<8) |
                       (rgb_buf[2]);
 
-    if (ri)
-      CANONIMG_ALSO_STORERGB(ri);
   });
 
   sysassert(!ferror(screenshot_file));
@@ -525,23 +528,9 @@ void analyse(FILE *tsv_output) {
 
 DEBUG_DEFINE_SOME_DEBUGF(structcolon,colondebugf)
 
-void find_islandname(void) {
+Rect find_sunshine_widget(void) {
   Rect sunshiner;
-  char sunshine[MAXIMGIDENT], archisland[MAXIMGIDENT];
 
-  RgbImage *ri= alloc_rgb_image(page0_rgbimage->w, page0_rgbimage->h);
-  const unsigned char *srcp;
-  unsigned char *destp, *endp;
-  for (srcp=page0_rgbimage->data, destp=ri->data,
-        endp= ri->data + 3 * ri->w * ri->h;
-       destp < endp;
-       srcp++, destp++) {
-    unsigned char c= *srcp & 0xf0;
-    *destp= c | (c>>4);
-  }
-
-  cim= page_images[0];
-  
   sunshiner.tl.x= cim->w - 1034 +  885;
   sunshiner.br.x= cim->w - 1034 + 1020;
   sunshiner.tl.y= 227;
@@ -557,6 +546,24 @@ void find_islandname(void) {
   ADJUST_BOX(sunshiner,"o",20, (cim->w - 1034 + 700), MUST, tl,x,-1);
   ADJUST_BOX(sunshiner,"o",20,  cim->w,               MUST, br,x,+1);
   debug_rect("sunshiner",1, sunshiner);
+  return sunshiner;
+}
+
+void find_islandname(RgbImage *ri) {
+  find_structure(page_images[0], 0);
+
+  Rect sunshiner= find_sunshine_widget();
+  char sunshine[MAXIMGIDENT], archisland[MAXIMGIDENT];
+
+  const unsigned char *srcp;
+  unsigned char *destp, *endp;
+  for (srcp=page_images[0]->rgb->data, destp=ri->data,
+        endp= ri->data + 3 * ri->w * ri->h;
+       destp < endp;
+       srcp++, destp++) {
+    unsigned char c= *srcp & 0xf0;
+    *destp= c | (c>>4);
+  }
 
   identify_rgbimage(ri, sunshiner, sunshine, "sunshine widget");
   
@@ -626,6 +633,7 @@ void find_islandname(void) {
     Point p;
     int nspaces=1, might_be_colon=0;
     uint32_t colon_pattern= 0;
+    p.y=-1;
 
     for (p.x=islandnamer.br.x; p.x>islandnamer.tl.x; p.x--) {
       colondebugf("structcolon: x=%4d nsp=%2d mbc=%d cp=%08"PRIx32" ",
@@ -677,8 +685,6 @@ void find_islandname(void) {
     islandnamer.br.x= p.x;
 
     identify_rgbimage(ri, islandnamer, archisland, "island");
-
-    assert(!"not vessel");
   }
 
   char *delim= strstr(archisland," - ");