Annotation of embedaddon/php/ext/gd/libgd/gd_filter.c, revision 1.1

1.1     ! misho       1: #if HAVE_GD_BUNDLED
        !             2: # include "gd.h"
        !             3: #else
        !             4: # include <gd.h>
        !             5: #endif
        !             6: 
        !             7: #include "gd_intern.h"
        !             8: 
        !             9: /* Filters function added on 2003/12
        !            10:  * by Pierre-Alain Joye (pierre@php.net)
        !            11:  **/
        !            12: /* Begin filters function */
        !            13: #define GET_PIXEL_FUNCTION(src)(src->trueColor?gdImageGetTrueColorPixel:gdImageGetPixel)
        !            14: 
        !            15: /* invert src image */
        !            16: int gdImageNegate(gdImagePtr src)
        !            17: {
        !            18:        int x, y;
        !            19:        int r,g,b,a;
        !            20:        int new_pxl, pxl;
        !            21:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !            22:        FuncPtr f;
        !            23: 
        !            24:        if (src==NULL) {
        !            25:                return 0;
        !            26:        }
        !            27: 
        !            28:        f = GET_PIXEL_FUNCTION(src);
        !            29: 
        !            30:        for (y=0; y<src->sy; ++y) {
        !            31:                for (x=0; x<src->sx; ++x) {
        !            32:                        pxl = f (src, x, y);
        !            33:                        r = gdImageRed(src, pxl);
        !            34:                        g = gdImageGreen(src, pxl);
        !            35:                        b = gdImageBlue(src, pxl);
        !            36:                        a = gdImageAlpha(src, pxl);
        !            37: 
        !            38:                        new_pxl = gdImageColorAllocateAlpha(src, 255-r, 255-g, 255-b, a);
        !            39:                        if (new_pxl == -1) {
        !            40:                                new_pxl = gdImageColorClosestAlpha(src, 255-r, 255-g, 255-b, a);
        !            41:                        }
        !            42:                        gdImageSetPixel (src, x, y, new_pxl);
        !            43:                }
        !            44:        }
        !            45:        return 1;
        !            46: }
        !            47: 
        !            48: /* Convert the image src to a grayscale image */
        !            49: int gdImageGrayScale(gdImagePtr src)
        !            50: {
        !            51:        int x, y;
        !            52:        int r,g,b,a;
        !            53:        int new_pxl, pxl;
        !            54:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !            55:        FuncPtr f;
        !            56:        f = GET_PIXEL_FUNCTION(src);
        !            57: 
        !            58:        if (src==NULL) {
        !            59:                return 0;
        !            60:        }
        !            61: 
        !            62:        for (y=0; y<src->sy; ++y) {
        !            63:                for (x=0; x<src->sx; ++x) {
        !            64:                        pxl = f (src, x, y);
        !            65:                        r = gdImageRed(src, pxl);
        !            66:                        g = gdImageGreen(src, pxl);
        !            67:                        b = gdImageBlue(src, pxl);
        !            68:                        a = gdImageAlpha(src, pxl);
        !            69:                        r = g = b = (int) (.299 * r + .587 * g + .114 * b);
        !            70: 
        !            71:                        new_pxl = gdImageColorAllocateAlpha(src, r, g, b, a);
        !            72:                        if (new_pxl == -1) {
        !            73:                                new_pxl = gdImageColorClosestAlpha(src, r, g, b, a);
        !            74:                        }
        !            75:                        gdImageSetPixel (src, x, y, new_pxl);
        !            76:                }
        !            77:        }
        !            78:        return 1;
        !            79: }
        !            80: 
        !            81: /* Set the brightness level <level> for the image src */
        !            82: int gdImageBrightness(gdImagePtr src, int brightness)
        !            83: {
        !            84:        int x, y;
        !            85:        int r,g,b,a;
        !            86:        int new_pxl, pxl;
        !            87:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !            88:        FuncPtr f;
        !            89:        f = GET_PIXEL_FUNCTION(src);
        !            90: 
        !            91:        if (src==NULL || (brightness < -255 || brightness>255)) {
        !            92:                return 0;
        !            93:        }
        !            94: 
        !            95:        if (brightness==0) {
        !            96:                return 1;
        !            97:        }
        !            98: 
        !            99:        for (y=0; y<src->sy; ++y) {
        !           100:                for (x=0; x<src->sx; ++x) {
        !           101:                        pxl = f (src, x, y);
        !           102: 
        !           103:                        r = gdImageRed(src, pxl);
        !           104:                        g = gdImageGreen(src, pxl);
        !           105:                        b = gdImageBlue(src, pxl);
        !           106:                        a = gdImageAlpha(src, pxl);
        !           107: 
        !           108:                        r = r + brightness;
        !           109:                        g = g + brightness;
        !           110:                        b = b + brightness;
        !           111: 
        !           112:                        r = (r > 255)? 255 : ((r < 0)? 0:r);
        !           113:                        g = (g > 255)? 255 : ((g < 0)? 0:g);
        !           114:                        b = (b > 255)? 255 : ((b < 0)? 0:b);
        !           115: 
        !           116:                        new_pxl = gdImageColorAllocateAlpha(src, (int)r, (int)g, (int)b, a);
        !           117:                        if (new_pxl == -1) {
        !           118:                                new_pxl = gdImageColorClosestAlpha(src, (int)r, (int)g, (int)b, a);
        !           119:                        }
        !           120:                        gdImageSetPixel (src, x, y, new_pxl);
        !           121:                }
        !           122:        }
        !           123:        return 1;
        !           124: }
        !           125: 
        !           126: 
        !           127: int gdImageContrast(gdImagePtr src, double contrast)
        !           128: {
        !           129:        int x, y;
        !           130:        int r,g,b,a;
        !           131:        double rf,gf,bf;
        !           132:        int new_pxl, pxl;
        !           133:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !           134: 
        !           135:        FuncPtr f;
        !           136:        f = GET_PIXEL_FUNCTION(src);
        !           137: 
        !           138:        if (src==NULL) {
        !           139:                return 0;
        !           140:        }
        !           141: 
        !           142:        contrast = (double)(100.0-contrast)/100.0;
        !           143:        contrast = contrast*contrast;
        !           144: 
        !           145:        for (y=0; y<src->sy; ++y) {
        !           146:                for (x=0; x<src->sx; ++x) {
        !           147:                        pxl = f(src, x, y);
        !           148: 
        !           149:                        r = gdImageRed(src, pxl);
        !           150:                        g = gdImageGreen(src, pxl);
        !           151:                        b = gdImageBlue(src, pxl);
        !           152:                        a = gdImageAlpha(src, pxl);
        !           153: 
        !           154:                        rf = (double)r/255.0;
        !           155:                        rf = rf-0.5;
        !           156:                        rf = rf*contrast;
        !           157:                        rf = rf+0.5;
        !           158:                        rf = rf*255.0;
        !           159: 
        !           160:                        bf = (double)b/255.0;
        !           161:                        bf = bf-0.5;
        !           162:                        bf = bf*contrast;
        !           163:                        bf = bf+0.5;
        !           164:                        bf = bf*255.0;
        !           165: 
        !           166:                        gf = (double)g/255.0;
        !           167:                        gf = gf-0.5;
        !           168:                        gf = gf*contrast;
        !           169:                        gf = gf+0.5;
        !           170:                        gf = gf*255.0;
        !           171: 
        !           172:                        rf = (rf > 255.0)? 255.0 : ((rf < 0.0)? 0.0:rf);
        !           173:                        gf = (gf > 255.0)? 255.0 : ((gf < 0.0)? 0.0:gf);
        !           174:                        bf = (bf > 255.0)? 255.0 : ((bf < 0.0)? 0.0:bf);
        !           175: 
        !           176:                        new_pxl = gdImageColorAllocateAlpha(src, (int)rf, (int)gf, (int)bf, a);
        !           177:                        if (new_pxl == -1) {
        !           178:                                new_pxl = gdImageColorClosestAlpha(src, (int)rf, (int)gf, (int)bf, a);
        !           179:                        }
        !           180:                        gdImageSetPixel (src, x, y, new_pxl);
        !           181:                }
        !           182:        }
        !           183:        return 1;
        !           184: }
        !           185: 
        !           186: 
        !           187: int gdImageColor(gdImagePtr src, const int red, const int green, const int blue, const int alpha)
        !           188: {
        !           189:        int x, y;
        !           190:        int new_pxl, pxl;
        !           191:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !           192:        FuncPtr f;
        !           193: 
        !           194:        if (src == NULL) {
        !           195:                return 0;
        !           196:        }
        !           197: 
        !           198:        f = GET_PIXEL_FUNCTION(src);
        !           199: 
        !           200:        for (y=0; y<src->sy; ++y) {
        !           201:                for (x=0; x<src->sx; ++x) {
        !           202:                        int r,g,b,a;
        !           203: 
        !           204:                        pxl = f(src, x, y);
        !           205:                        r = gdImageRed(src, pxl);
        !           206:                        g = gdImageGreen(src, pxl);
        !           207:                        b = gdImageBlue(src, pxl);
        !           208:                        a = gdImageAlpha(src, pxl);
        !           209: 
        !           210:                        r = r + red;
        !           211:                        g = g + green;
        !           212:                        b = b + blue;
        !           213:                        a = a + alpha;
        !           214: 
        !           215:                        r = (r > 255)? 255 : ((r < 0)? 0 : r);
        !           216:                        g = (g > 255)? 255 : ((g < 0)? 0 : g);
        !           217:                        b = (b > 255)? 255 : ((b < 0)? 0 : b);
        !           218:                        a = (a > 127)? 127 : ((a < 0)? 0 : a);
        !           219: 
        !           220:                        new_pxl = gdImageColorAllocateAlpha(src, r, g, b, a);
        !           221:                        if (new_pxl == -1) {
        !           222:                                new_pxl = gdImageColorClosestAlpha(src, r, g, b, a);
        !           223:                        }
        !           224:                        gdImageSetPixel (src, x, y, new_pxl);
        !           225:                }
        !           226:        }
        !           227:        return 1;
        !           228: }
        !           229: 
        !           230: int gdImageConvolution(gdImagePtr src, float filter[3][3], float filter_div, float offset)
        !           231: {
        !           232:        int         x, y, i, j, new_a;
        !           233:        float       new_r, new_g, new_b;
        !           234:        int         new_pxl, pxl=0;
        !           235:        gdImagePtr  srcback;
        !           236:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !           237:        FuncPtr f;
        !           238: 
        !           239:        if (src==NULL) {
        !           240:                return 0;
        !           241:        }
        !           242: 
        !           243:        /* We need the orinal image with each safe neoghb. pixel */
        !           244:        srcback = gdImageCreateTrueColor (src->sx, src->sy);
        !           245:        if (srcback==NULL) {
        !           246:                return 0;
        !           247:        }
        !           248: 
        !           249:        gdImageSaveAlpha(srcback, 1);
        !           250:        new_pxl = gdImageColorAllocateAlpha(srcback, 0, 0, 0, 127);
        !           251:        gdImageFill(srcback, 0, 0, new_pxl);
        !           252: 
        !           253:        gdImageCopy(srcback, src,0,0,0,0,src->sx,src->sy);
        !           254: 
        !           255:        f = GET_PIXEL_FUNCTION(src);
        !           256: 
        !           257:        for ( y=0; y<src->sy; y++) {
        !           258:                for(x=0; x<src->sx; x++) {
        !           259:                        new_r = new_g = new_b = 0;
        !           260:                        new_a = gdImageAlpha(srcback, pxl);
        !           261: 
        !           262:                        for (j=0; j<3; j++) {
        !           263:                                int yv = MIN(MAX(y - 1 + j, 0), src->sy - 1);
        !           264:                                for (i=0; i<3; i++) {
        !           265:                                        pxl = f(srcback, MIN(MAX(x - 1 + i, 0), src->sx - 1), yv);
        !           266:                                        new_r += (float)gdImageRed(srcback, pxl) * filter[j][i];
        !           267:                                        new_g += (float)gdImageGreen(srcback, pxl) * filter[j][i];
        !           268:                                        new_b += (float)gdImageBlue(srcback, pxl) * filter[j][i];
        !           269:                                }
        !           270:                        }
        !           271: 
        !           272:                        new_r = (new_r/filter_div)+offset;
        !           273:                        new_g = (new_g/filter_div)+offset;
        !           274:                        new_b = (new_b/filter_div)+offset;
        !           275: 
        !           276:                        new_r = (new_r > 255.0f)? 255.0f : ((new_r < 0.0f)? 0.0f:new_r);
        !           277:                        new_g = (new_g > 255.0f)? 255.0f : ((new_g < 0.0f)? 0.0f:new_g);
        !           278:                        new_b = (new_b > 255.0f)? 255.0f : ((new_b < 0.0f)? 0.0f:new_b);
        !           279: 
        !           280:                        new_pxl = gdImageColorAllocateAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
        !           281:                        if (new_pxl == -1) {
        !           282:                                new_pxl = gdImageColorClosestAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
        !           283:                        }
        !           284:                        gdImageSetPixel (src, x, y, new_pxl);
        !           285:                }
        !           286:        }
        !           287:        gdImageDestroy(srcback);
        !           288:        return 1;
        !           289: }
        !           290: 
        !           291: int gdImageSelectiveBlur( gdImagePtr src)
        !           292: {
        !           293:        int         x, y, i, j;
        !           294:        float       new_r, new_g, new_b;
        !           295:        int         new_pxl, cpxl, pxl, new_a=0;
        !           296:        float flt_r [3][3];
        !           297:        float flt_g [3][3];
        !           298:        float flt_b [3][3];
        !           299:        float flt_r_sum, flt_g_sum, flt_b_sum;
        !           300: 
        !           301:        gdImagePtr srcback;
        !           302:        typedef int (*FuncPtr)(gdImagePtr, int, int);
        !           303:        FuncPtr f;
        !           304: 
        !           305:        if (src==NULL) {
        !           306:                return 0;
        !           307:        }
        !           308: 
        !           309:        /* We need the orinal image with each safe neoghb. pixel */
        !           310:        srcback = gdImageCreateTrueColor (src->sx, src->sy);
        !           311:        if (srcback==NULL) {
        !           312:                return 0;
        !           313:        }
        !           314:        gdImageCopy(srcback, src,0,0,0,0,src->sx,src->sy);
        !           315: 
        !           316:        f = GET_PIXEL_FUNCTION(src);
        !           317: 
        !           318:        for(y = 0; y<src->sy; y++) {
        !           319:                for (x=0; x<src->sx; x++) {
        !           320:                      flt_r_sum = flt_g_sum = flt_b_sum = 0.0;
        !           321:                        cpxl = f(src, x, y);
        !           322: 
        !           323:                        for (j=0; j<3; j++) {
        !           324:                                for (i=0; i<3; i++) {
        !           325:                                        if ((j == 1) && (i == 1)) {
        !           326:                                                flt_r[1][1] = flt_g[1][1] = flt_b[1][1] = 0.5;
        !           327:                                        } else {
        !           328:                                                pxl = f(src, x-(3>>1)+i, y-(3>>1)+j);
        !           329:                                                new_a = gdImageAlpha(srcback, pxl);
        !           330: 
        !           331:                                                new_r = ((float)gdImageRed(srcback, cpxl)) - ((float)gdImageRed (srcback, pxl));
        !           332: 
        !           333:                                                if (new_r < 0.0f) {
        !           334:                                                        new_r = -new_r;
        !           335:                                                }
        !           336:                                                if (new_r != 0) {
        !           337:                                                        flt_r[j][i] = 1.0f/new_r;
        !           338:                                                } else {
        !           339:                                                        flt_r[j][i] = 1.0f;
        !           340:                                                }
        !           341: 
        !           342:                                                new_g = ((float)gdImageGreen(srcback, cpxl)) - ((float)gdImageGreen(srcback, pxl));
        !           343: 
        !           344:                                                if (new_g < 0.0f) {
        !           345:                                                        new_g = -new_g;
        !           346:                                                }
        !           347:                                                if (new_g != 0) {
        !           348:                                                        flt_g[j][i] = 1.0f/new_g;
        !           349:                                                } else {
        !           350:                                                        flt_g[j][i] = 1.0f;
        !           351:                                                }
        !           352: 
        !           353:                                                new_b = ((float)gdImageBlue(srcback, cpxl)) - ((float)gdImageBlue(srcback, pxl));
        !           354: 
        !           355:                                                if (new_b < 0.0f) {
        !           356:                                                        new_b = -new_b;
        !           357:                                                }
        !           358:                                                if (new_b != 0) {
        !           359:                                                        flt_b[j][i] = 1.0f/new_b;
        !           360:                                                } else {
        !           361:                                                        flt_b[j][i] = 1.0f;
        !           362:                                                }
        !           363:                                        }
        !           364: 
        !           365:                                        flt_r_sum += flt_r[j][i];
        !           366:                                        flt_g_sum += flt_g[j][i];
        !           367:                                        flt_b_sum += flt_b [j][i];
        !           368:                                }
        !           369:                        }
        !           370: 
        !           371:                        for (j=0; j<3; j++) {
        !           372:                                for (i=0; i<3; i++) {
        !           373:                                        if (flt_r_sum != 0.0) {
        !           374:                                                flt_r[j][i] /= flt_r_sum;
        !           375:                                        }
        !           376:                                        if (flt_g_sum != 0.0) {
        !           377:                                                flt_g[j][i] /= flt_g_sum;
        !           378:                                        }
        !           379:                                        if (flt_b_sum != 0.0) {
        !           380:                                                flt_b [j][i] /= flt_b_sum;
        !           381:                                        }
        !           382:                                }
        !           383:                        }
        !           384: 
        !           385:                        new_r = new_g = new_b = 0.0;
        !           386: 
        !           387:                        for (j=0; j<3; j++) {
        !           388:                                for (i=0; i<3; i++) {
        !           389:                                        pxl = f(src, x-(3>>1)+i, y-(3>>1)+j);
        !           390:                                        new_r += (float)gdImageRed(srcback, pxl) * flt_r[j][i];
        !           391:                                        new_g += (float)gdImageGreen(srcback, pxl) * flt_g[j][i];
        !           392:                                        new_b += (float)gdImageBlue(srcback, pxl) * flt_b[j][i];
        !           393:                                }
        !           394:                        }
        !           395: 
        !           396:                        new_r = (new_r > 255.0f)? 255.0f : ((new_r < 0.0f)? 0.0f:new_r);
        !           397:                        new_g = (new_g > 255.0f)? 255.0f : ((new_g < 0.0f)? 0.0f:new_g);
        !           398:                        new_b = (new_b > 255.0f)? 255.0f : ((new_b < 0.0f)? 0.0f:new_b);
        !           399:                        new_pxl = gdImageColorAllocateAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
        !           400:                        if (new_pxl == -1) {
        !           401:                                new_pxl = gdImageColorClosestAlpha(src, (int)new_r, (int)new_g, (int)new_b, new_a);
        !           402:                        }
        !           403:                        gdImageSetPixel (src, x, y, new_pxl);
        !           404:                }
        !           405:        }
        !           406:        gdImageDestroy(srcback);
        !           407:        return 1;
        !           408: }
        !           409: 
        !           410: int gdImageEdgeDetectQuick(gdImagePtr src)
        !           411: {
        !           412:        float filter[3][3] =    {{-1.0,0.0,-1.0},
        !           413:                                {0.0,4.0,0.0},
        !           414:                                {-1.0,0.0,-1.0}};
        !           415: 
        !           416:        return gdImageConvolution(src, filter, 1, 127);
        !           417: }
        !           418: 
        !           419: int gdImageGaussianBlur(gdImagePtr im)
        !           420: {
        !           421:        float filter[3][3] =    {{1.0,2.0,1.0},
        !           422:                                {2.0,4.0,2.0},
        !           423:                                {1.0,2.0,1.0}};
        !           424: 
        !           425:        return gdImageConvolution(im, filter, 16, 0);
        !           426: }
        !           427: 
        !           428: int gdImageEmboss(gdImagePtr im)
        !           429: {
        !           430: /*
        !           431:        float filter[3][3] =    {{1.0,1.0,1.0},
        !           432:                                {0.0,0.0,0.0},
        !           433:                                {-1.0,-1.0,-1.0}};
        !           434: */
        !           435:        float filter[3][3] =    {{ 1.5, 0.0, 0.0},
        !           436:                                 { 0.0, 0.0, 0.0},
        !           437:                                 { 0.0, 0.0,-1.5}};
        !           438: 
        !           439:        return gdImageConvolution(im, filter, 1, 127);
        !           440: }
        !           441: 
        !           442: int gdImageMeanRemoval(gdImagePtr im)
        !           443: {
        !           444:        float filter[3][3] =    {{-1.0,-1.0,-1.0},
        !           445:                                {-1.0,9.0,-1.0},
        !           446:                                {-1.0,-1.0,-1.0}};
        !           447: 
        !           448:        return gdImageConvolution(im, filter, 1, 0);
        !           449: }
        !           450: 
        !           451: int gdImageSmooth(gdImagePtr im, float weight)
        !           452: {
        !           453:        float filter[3][3] =    {{1.0,1.0,1.0},
        !           454:                                {1.0,0.0,1.0},
        !           455:                                {1.0,1.0,1.0}};
        !           456: 
        !           457:        filter[1][1] = weight;
        !           458: 
        !           459:        return gdImageConvolution(im, filter, weight+8, 0);
        !           460: }
        !           461: /* End filters function */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>