Ignore:
Timestamp:
Jan 10, 2005, 4:31:33 PM (16 years ago)
Author:
Sam Hocevar
Message:
  • Use font_load_* for all decoders.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pwntcha/trunk/src/slashdot.c

    r446 r448  
    2121static void count_objects(struct image *img);
    2222static void rotate(struct image *img);
    23 static void cut_cells(struct image *img);
    2423static void find_glyphs(struct image *img);
    25 
    26 /* Our macros */
    27 #define FONTNAME "font_slashdot.png"
    28 
    29 struct font font;
    30 struct glyph glyphs[22];
    3124
    3225/* Global stuff */
     
    136129        }
    137130    }
    138 
    139 #if 0
    140     { CvPoint A, B;
    141       A.x = (objlist[first].xmin + objlist[first].xmax) / 2;
    142       A.y = (objlist[first].ymin + objlist[first].ymax) / 2;
    143       B.x = (objlist[last].xmin + objlist[last].xmax) / 2;
    144       B.y = (objlist[last].ymin + objlist[last].ymax) / 2;
    145       cvLine(tmp, A, B, 0, 2.0, 0);
    146     }
    147 #endif
    148131
    149132    image_swap(img, tmp);
     
    196179}
    197180
    198 static void cut_cells(struct image *img)
    199 {
    200     struct image *tmp;
    201     int x, y;
    202     int r, g, b;
    203 
    204     tmp = image_new(img->width, img->height);
    205 
    206     for(y = 0; y < img->height; y++)
    207         for(x = 0; x < img->width; x++)
    208         {
    209             getpixel(img, x, y, &r, &g, &b);
    210             setpixel(tmp, x, y, r, g, b);
    211         }
    212 
    213     for(x = 0; x < img->width; x++)
    214     {
    215         setpixel(tmp, x, 0, 255, 255, 255);
    216         setpixel(tmp, x, img->height - 1, 255, 255, 255);
    217     }
    218 
    219     for(y = 0; y < img->height; y++)
    220         for(x = 0; x < 7; x++)
    221         {
    222             setpixel(tmp, x * img->width / 7, y, 255, 255, 255);
    223             setpixel(tmp, (x + 1) * img->width / 7 - 1, y, 255, 255, 255);
    224         }
    225 
    226     image_swap(img, tmp);
    227     image_free(tmp);
    228 }
    229 
    230181static void find_glyphs(struct image *img)
    231182{
    232     char all[] = "abcdefgijkmnpqrstvwxyz";
     183    static struct font *font = NULL;
    233184    struct image *tmp;
    234185    int x, y, i = 0;
    235186    int r, g, b;
    236     int xmin, xmax, ymin, ymax, incell = 0, count = 0, startx = 0, cur = 0;
     187    int xmin, xmax, ymin, ymax, startx = 0, cur = 0;
    237188    int distmin, distx, disty, distch;
    238189
    239     if(!font.img)
    240     {
    241         char fontname[BUFSIZ];
    242         sprintf(fontname, "%s/%s", share, FONTNAME);
    243         font.img = image_load(fontname);
    244         if(!font.img)
    245         {
    246             fprintf(stderr, "cannot load font %s\n", fontname);
    247             exit(-1);
    248         }
    249         font.glyphs = glyphs;
     190    if(!font)
     191    {
     192        font = font_load_variable("font_slashdot.png", "abcdefgijkmnpqrstvwxyz");
     193        if(!font)
     194            exit(1);
    250195    }
    251196
     
    259204        }
    260205
    261     for(x = 0; x < font.img->width; x++)
    262     {
    263         int found = 0;
    264         for(y = 0; y < font.img->height; y++)
    265         {
    266             getpixel(font.img, x, y, &r, &g, &b);
    267             if(r < 128)
    268             {
    269                 found = 1;
    270                 count += (255 - r);
    271             }
    272         }
    273         if(found && !incell)
    274         {
    275             incell = 1;
    276             xmin = x;
    277         }
    278         else if(!found && incell)
    279         {
    280             incell = 0;
    281             xmax = x;
    282 #if 0
    283             ymin = font.img->height;
    284             ymax = 0;
    285             for(y = 0; y < font.img->height; y++)
    286             {
    287                 int newx;
    288                 int gotit = 0;
    289                 for(newx = xmin; newx < xmax; newx++)
    290                 {
    291                     getpixel(font.img, newx, y, &r, &g, &b);
    292                     if(r < 128)
    293                     {
    294                         gotit = 1;
    295                         break;
    296                     }
    297                 }
    298                 if(gotit)
    299                 {
    300                     if(ymin > y) ymin = y;
    301                     if(ymax <= y) ymax = y + 1;
    302                 }
    303             }
    304 #else
    305             ymin = 0;
    306             ymax = font.img->height;
    307 #endif
    308             font.glyphs[i].xmin = xmin;
    309             font.glyphs[i].xmax = xmax;
    310             font.glyphs[i].ymin = ymin;
    311             font.glyphs[i].ymax = ymax;
    312             font.glyphs[i].count = count;
    313             count = 0;
    314             i++;
    315         }
    316     }
    317 
    318     if(i != 22)
    319     {
    320         printf("error: could not find 22 glyphs in font\n");
    321         exit(-1);
    322     }
    323 
    324206    while(cur < 7)
    325207    {
    326208        /* Try to find 1st letter */
    327209        distmin = INT_MAX;
    328         for(i = 0; i < 22; i++)
     210        for(i = 0; i < font->size; i++)
    329211        {
    330212            int localmin = INT_MAX, localx, localy;
    331 //if(all[i] == 'i') continue;
    332             xmin = font.glyphs[i].xmin;
    333             ymin = font.glyphs[i].ymin;
    334             xmax = font.glyphs[i].xmax;
    335             ymax = font.glyphs[i].ymax;
    336             //printf("trying to find %c (%i×%i) - ", all[i], xmax - xmin, ymax - ymin);
     213            xmin = font->glyphs[i].xmin;
     214            ymin = font->glyphs[i].ymin;
     215            xmax = font->glyphs[i].xmax;
     216            ymax = font->glyphs[i].ymax;
    337217            for(y = -5; y < 5; y++)
    338218                for(x = startx - 5; x < startx + 5; x++)
     
    344224                        {
    345225                            int r2;
    346                             getgray(font.img, xmin + z, ymin + t, &r);
     226                            getgray(font->img, xmin + z, ymin + t, &r);
    347227                            getgray(img, x + z, y + t, &r2);
    348228                            dist += abs(r - r2);
     
    350230    //                printf("%i %i -> %i\n", x, y, dist);
    351231                    //dist /= sqrt(xmax - xmin);
    352                     dist = dist * 128 / font.glyphs[i].count;
     232                    dist = dist * 128 / font->glyphs[i].count;
    353233                    if(dist < localmin)
    354234                    {
     
    368248        }
    369249
    370         //fprintf(stderr, "%i (%i,%i)\n", distmin, distx - startx, disty);
    371         //printf("min diff: %c - %i (%i, %i)\n", all[distch], distmin, distx, disty);
    372 
    373         /* Print min glyph */
    374         xmin = font.glyphs[distch].xmin;
    375         ymin = font.glyphs[distch].ymin;
    376         xmax = font.glyphs[distch].xmax;
    377         ymax = font.glyphs[distch].ymax;
     250        /* Draw best glyph in picture (debugging purposes) */
     251        xmin = font->glyphs[distch].xmin;
     252        ymin = font->glyphs[distch].ymin;
     253        xmax = font->glyphs[distch].xmax;
     254        ymax = font->glyphs[distch].ymax;
    378255        for(y = 0; y < ymax - ymin; y++)
    379256            for(x = 0; x < xmax - xmin; x++)
    380257            {
    381                 getpixel(font.img, xmin + x, ymin + y, &r, &g, &b);
     258                getpixel(font->img, xmin + x, ymin + y, &r, &g, &b);
    382259                if(r > 128) continue;
    383260                setpixel(tmp, distx + x, disty + y, r, g, b);
     
    385262
    386263        startx = distx + xmax - xmin;
    387         result[cur++] = all[distch];
     264        result[cur++] = font->glyphs[distch].c;
    388265    }
    389266
Note: See TracChangeset for help on using the changeset viewer.