Changeset 3417 for libpipi


Ignore:
Timestamp:
Apr 21, 2009, 1:56:56 AM (11 years ago)
Author:
Sam Hocevar
Message:

context.c: factor some code to gain 180 lines of code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libpipi/trunk/pipi/context.c

    r3416 r3417  
    244244        ctx->images[ctx->nimages - 1] = dst;
    245245    }
    246     else if(!strcmp(cmd, "boxblur"))
    247     {
    248         pipi_image_t *src, *dst;
     246    else if(!strcmp(cmd, "boxblur") || !strcmp(cmd, "median"))
     247    {
     248        pipi_image_t *src, *dst = NULL;
    249249        char const *arg;
    250250        va_list ap;
     
    261261            h = atof(arg + 1);
    262262        src = ctx->images[ctx->nimages - 1];
    263         dst = pipi_box_blur_ext(src, w, h);
     263        switch(cmd[0])
     264        {
     265            case 'b': dst = pipi_box_blur_ext(src, w, h); break;
     266            case 'm': dst = pipi_median_ext(src, w, h); break;
     267        }
    264268        if(dst == NULL)
    265269            return -1;
     
    267271        ctx->images[ctx->nimages - 1] = dst;
    268272    }
    269     else if(!strcmp(cmd, "median"))
    270     {
    271         pipi_image_t *src, *dst;
    272         char const *arg;
    273         va_list ap;
    274         double w, h;
    275 
    276         if(ctx->nimages < 1)
    277             return -1;
    278         va_start(ap, cmd);
    279         arg = va_arg(ap, char const *);
    280         va_end(ap);
    281         w = h = atof(arg);
    282         arg = strchr(arg, 'x');
    283         if(arg)
    284             h = atof(arg + 1);
    285         src = ctx->images[ctx->nimages - 1];
    286         dst = pipi_median_ext(src, w, h);
    287         if(dst == NULL)
    288             return -1;
    289         pipi_free(src);
    290         ctx->images[ctx->nimages - 1] = dst;
    291     }
    292     else if(!strcmp(cmd, "geometry"))
    293     {
    294         pipi_image_t *src, *dst;
     273    else if(!strcmp(cmd, "geometry") || !strcmp(cmd, "tile"))
     274    {
     275        pipi_image_t *src, *dst = NULL;
    295276        char const *arg;
    296277        va_list ap;
     
    310291            return -1;
    311292        src = ctx->images[ctx->nimages - 1];
    312         dst = pipi_resize(src, w, h);
    313         if(dst == NULL)
    314             return -1;
    315         pipi_free(src);
    316         ctx->images[ctx->nimages - 1] = dst;
    317     }
    318     else if(!strcmp(cmd, "tile"))
    319     {
    320         pipi_image_t *src, *dst;
    321         char const *arg;
    322         va_list ap;
    323         int w, h;
    324 
    325         if(ctx->nimages < 1)
    326             return -1;
    327         va_start(ap, cmd);
    328         arg = va_arg(ap, char const *);
    329         va_end(ap);
    330         w = atoi(arg);
    331         arg = strchr(arg, 'x');
    332         if(!arg)
    333             return -1;
    334         h = atoi(arg + 1);
    335         if(w <= 0 || h <= 0)
    336             return -1;
    337         src = ctx->images[ctx->nimages - 1];
    338         dst = pipi_tile(src, w, h);
     293        switch(cmd[0])
     294        {
     295            case 'g': dst = pipi_resize(src, w, h); break;
     296            case 't': dst = pipi_tile(src, w, h); break;
     297        }
    339298        if(dst == NULL)
    340299            return -1;
     
    390349        pipi_free(tmp);
    391350    }
    392     else if(!strcmp(cmd, "brightness"))
    393     {
    394         pipi_image_t *src, *dst;
     351    else if(!strcmp(cmd, "brightness") || !strcmp(cmd, "contrast")
     352             || !strcmp(cmd, "threshold"))
     353    {
     354        pipi_image_t *src, *dst = NULL;
    395355        char const *arg;
    396356        va_list ap;
     
    404364        val = atof(arg);
    405365        src = ctx->images[ctx->nimages - 1];
    406         dst = pipi_brightness(src, val);
    407         if(dst == NULL)
    408             return -1;
    409         pipi_free(src);
    410         ctx->images[ctx->nimages - 1] = dst;
    411     }
    412     else if(!strcmp(cmd, "contrast"))
    413     {
    414         pipi_image_t *src, *dst;
    415         char const *arg;
    416         va_list ap;
    417         double val;
    418 
    419         if(ctx->nimages < 1)
    420             return -1;
    421         va_start(ap, cmd);
    422         arg = va_arg(ap, char const *);
    423         va_end(ap);
    424         val = atof(arg);
    425         src = ctx->images[ctx->nimages - 1];
    426         dst = pipi_contrast(src, val);
    427         if(dst == NULL)
    428             return -1;
    429         pipi_free(src);
    430         ctx->images[ctx->nimages - 1] = dst;
    431     }
    432     else if(!strcmp(cmd, "threshold"))
    433     {
    434         pipi_image_t *src, *dst;
    435         char const *arg;
    436         va_list ap;
    437         double val;
    438 
    439         if(ctx->nimages < 1)
    440             return -1;
    441         va_start(ap, cmd);
    442         arg = va_arg(ap, char const *);
    443         va_end(ap);
    444         val = atof(arg);
    445         src = ctx->images[ctx->nimages - 1];
    446         dst = pipi_threshold(src, val);
     366        switch(cmd[0])
     367        {
     368            case 'b': dst = pipi_brightness(src, val); break;
     369            case 'c': dst = pipi_contrast(src, val); break;
     370            case 't': dst = pipi_threshold(src, val); break;
     371        }
    447372        if(dst == NULL)
    448373            return -1;
     
    534459        ctx->nimages -= 2;
    535460    }
    536     else if(!strcmp(cmd, "mean"))
     461    else if(!strcmp(cmd, "merge"))
    537462    {
    538463        pipi_image_t *dst;
     464        char const *arg;
     465        va_list ap;
     466        double val;
    539467
    540468        if(ctx->nimages < 2)
    541469            return -1;
    542         dst = pipi_mean(ctx->images[ctx->nimages - 2],
    543                         ctx->images[ctx->nimages - 1]);
     470
     471        va_start(ap, cmd);
     472        arg = va_arg(ap, char const *);
     473        va_end(ap);
     474        val = atof(arg);
     475
     476        dst = pipi_merge(ctx->images[ctx->nimages - 2],
     477                         ctx->images[ctx->nimages - 1], val);
    544478        if(dst == NULL)
    545479            return -1;
     
    549483        ctx->nimages--;
    550484    }
    551     else if(!strcmp(cmd, "merge"))
    552     {
    553         pipi_image_t *dst;
    554         char const *arg;
    555         va_list ap;
    556         double val;
     485    else if(!strcmp(cmd, "mean") || !strcmp(cmd, "min") || !strcmp(cmd, "max")
     486             || !strcmp(cmd, "add") || !strcmp(cmd, "sub")
     487             || !strcmp(cmd, "difference") || !strcmp(cmd, "multiply")
     488             || !strcmp(cmd, "divide") || !strcmp(cmd, "screen")
     489             || !strcmp(cmd, "overlay"))
     490    {
     491        pipi_image_t *dst = NULL;
    557492
    558493        if(ctx->nimages < 2)
    559494            return -1;
    560 
    561         va_start(ap, cmd);
    562         arg = va_arg(ap, char const *);
    563         va_end(ap);
    564         val = atof(arg);
    565 
    566         dst = pipi_merge(ctx->images[ctx->nimages - 2],
    567                          ctx->images[ctx->nimages - 1], val);
    568         if(dst == NULL)
    569             return -1;
    570         pipi_free(ctx->images[ctx->nimages - 2]);
    571         pipi_free(ctx->images[ctx->nimages - 1]);
    572         ctx->images[ctx->nimages - 2] = dst;
    573         ctx->nimages--;
    574     }
    575     else if(!strcmp(cmd, "min"))
    576     {
    577         pipi_image_t *dst;
    578 
    579         if(ctx->nimages < 2)
    580             return -1;
    581         dst = pipi_min(ctx->images[ctx->nimages - 2],
    582                        ctx->images[ctx->nimages - 1]);
    583         if(dst == NULL)
    584             return -1;
    585         pipi_free(ctx->images[ctx->nimages - 2]);
    586         pipi_free(ctx->images[ctx->nimages - 1]);
    587         ctx->images[ctx->nimages - 2] = dst;
    588         ctx->nimages--;
    589     }
    590     else if(!strcmp(cmd, "max"))
    591     {
    592         pipi_image_t *dst;
    593 
    594         if(ctx->nimages < 2)
    595             return -1;
    596         dst = pipi_max(ctx->images[ctx->nimages - 2],
    597                        ctx->images[ctx->nimages - 1]);
    598         if(dst == NULL)
    599             return -1;
    600         pipi_free(ctx->images[ctx->nimages - 2]);
    601         pipi_free(ctx->images[ctx->nimages - 1]);
    602         ctx->images[ctx->nimages - 2] = dst;
    603         ctx->nimages--;
    604     }
    605     else if(!strcmp(cmd, "add"))
    606     {
    607         pipi_image_t *dst;
    608 
    609         if(ctx->nimages < 2)
    610             return -1;
    611         dst = pipi_add(ctx->images[ctx->nimages - 2],
    612                        ctx->images[ctx->nimages - 1]);
    613         if(dst == NULL)
    614             return -1;
    615         pipi_free(ctx->images[ctx->nimages - 2]);
    616         pipi_free(ctx->images[ctx->nimages - 1]);
    617         ctx->images[ctx->nimages - 2] = dst;
    618         ctx->nimages--;
    619     }
    620     else if(!strcmp(cmd, "sub"))
    621     {
    622         pipi_image_t *dst;
    623 
    624         if(ctx->nimages < 2)
    625             return -1;
    626         dst = pipi_sub(ctx->images[ctx->nimages - 2],
    627                        ctx->images[ctx->nimages - 1]);
    628         if(dst == NULL)
    629             return -1;
    630         pipi_free(ctx->images[ctx->nimages - 2]);
    631         pipi_free(ctx->images[ctx->nimages - 1]);
    632         ctx->images[ctx->nimages - 2] = dst;
    633         ctx->nimages--;
    634     }
    635     else if(!strcmp(cmd, "difference"))
    636     {
    637         pipi_image_t *dst;
    638 
    639         if(ctx->nimages < 2)
    640             return -1;
    641         dst = pipi_difference(ctx->images[ctx->nimages - 2],
    642                               ctx->images[ctx->nimages - 1]);
    643         if(dst == NULL)
    644             return -1;
    645         pipi_free(ctx->images[ctx->nimages - 2]);
    646         pipi_free(ctx->images[ctx->nimages - 1]);
    647         ctx->images[ctx->nimages - 2] = dst;
    648         ctx->nimages--;
    649     }
    650     else if(!strcmp(cmd, "multiply"))
    651     {
    652         pipi_image_t *dst;
    653 
    654         if(ctx->nimages < 2)
    655             return -1;
    656         dst = pipi_multiply(ctx->images[ctx->nimages - 2],
    657                             ctx->images[ctx->nimages - 1]);
    658         if(dst == NULL)
    659             return -1;
    660         pipi_free(ctx->images[ctx->nimages - 2]);
    661         pipi_free(ctx->images[ctx->nimages - 1]);
    662         ctx->images[ctx->nimages - 2] = dst;
    663         ctx->nimages--;
    664     }
    665     else if(!strcmp(cmd, "divide"))
    666     {
    667         pipi_image_t *dst;
    668 
    669         if(ctx->nimages < 2)
    670             return -1;
    671         dst = pipi_divide(ctx->images[ctx->nimages - 2],
    672                           ctx->images[ctx->nimages - 1]);
    673         if(dst == NULL)
    674             return -1;
    675         pipi_free(ctx->images[ctx->nimages - 2]);
    676         pipi_free(ctx->images[ctx->nimages - 1]);
    677         ctx->images[ctx->nimages - 2] = dst;
    678         ctx->nimages--;
    679     }
    680     else if(!strcmp(cmd, "screen"))
    681     {
    682         pipi_image_t *dst;
    683 
    684         if(ctx->nimages < 2)
    685             return -1;
    686         dst = pipi_screen(ctx->images[ctx->nimages - 2],
    687                           ctx->images[ctx->nimages - 1]);
    688         if(dst == NULL)
    689             return -1;
    690         pipi_free(ctx->images[ctx->nimages - 2]);
    691         pipi_free(ctx->images[ctx->nimages - 1]);
    692         ctx->images[ctx->nimages - 2] = dst;
    693         ctx->nimages--;
    694     }
    695     else if(!strcmp(cmd, "overlay"))
    696     {
    697         pipi_image_t *dst;
    698 
    699         if(ctx->nimages < 2)
    700             return -1;
    701         dst = pipi_overlay(ctx->images[ctx->nimages - 2],
    702                            ctx->images[ctx->nimages - 1]);
     495        switch(cmd[2])
     496        {
     497            case 'a': dst = pipi_mean(ctx->images[ctx->nimages - 2],
     498                                      ctx->images[ctx->nimages - 1]);
     499                      break;
     500            case 'n': dst = pipi_min(ctx->images[ctx->nimages - 2],
     501                                     ctx->images[ctx->nimages - 1]);
     502                      break;
     503            case 'x': dst = pipi_max(ctx->images[ctx->nimages - 2],
     504                                     ctx->images[ctx->nimages - 1]);
     505                      break;
     506            case 'd': dst = pipi_add(ctx->images[ctx->nimages - 2],
     507                                     ctx->images[ctx->nimages - 1]);
     508                      break;
     509            case 'b': dst = pipi_sub(ctx->images[ctx->nimages - 2],
     510                                     ctx->images[ctx->nimages - 1]);
     511                      break;
     512            case 'f': dst = pipi_difference(ctx->images[ctx->nimages - 2],
     513                                            ctx->images[ctx->nimages - 1]);
     514                      break;
     515            case 'l': dst = pipi_multiply(ctx->images[ctx->nimages - 2],
     516                                          ctx->images[ctx->nimages - 1]);
     517                      break;
     518            case 'v': dst = pipi_divide(ctx->images[ctx->nimages - 2],
     519                                        ctx->images[ctx->nimages - 1]);
     520                      break;
     521            case 'r': dst = pipi_screen(ctx->images[ctx->nimages - 2],
     522                                        ctx->images[ctx->nimages - 1]);
     523                      break;
     524            case 'e': dst = pipi_overlay(ctx->images[ctx->nimages - 2],
     525                                         ctx->images[ctx->nimages - 1]);
     526                      break;
     527        }
    703528        if(dst == NULL)
    704529            return -1;
Note: See TracChangeset for help on using the changeset viewer.