[q-lang-cvs] q/modules/magick magick.c,1.28,1.29 magick.q,1.26,1.27
Brought to you by:
agraef
From: <ag...@us...> - 2003-12-31 00:22:56
|
Update of /cvsroot/q-lang/q/modules/magick In directory sc8-pr-cvs1:/tmp/cvs-serv31482 Modified Files: magick.c magick.q Log Message: added missing client_data initalizations, drawing ops Index: magick.c =================================================================== RCS file: /cvsroot/q-lang/q/modules/magick/magick.c,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** magick.c 30 Dec 2003 20:29:58 -0000 1.28 --- magick.c 31 Dec 2003 00:22:52 -0000 1.29 *************** *** 290,294 **** } ImageData; ! static ImageData *init_data(void) { ImageData *data = malloc(sizeof(ImageData)); --- 290,294 ---- } ImageData; ! static inline ImageData *init_data(void) { ImageData *data = malloc(sizeof(ImageData)); *************** *** 300,303 **** --- 300,314 ---- } + static inline DrawInfo *get_draw_info(Image *img) + { + ImageData *data = (ImageData*)img->client_data; + if (data) { + if (!data->draw_info) + data->draw_info = CloneDrawInfo(NULL, NULL); + return data->draw_info; + } else + return NULL; + } + /* image type */ *************** *** 313,316 **** --- 324,414 ---- } + static expr mk_image(Image *img) + { + img->scene = 0; + if ((img->client_data = init_data())) + return mkobj(type(Image), img); + else { + DestroyImage(img); + return __ERROR; + } + } + + static void decompose_image_list(Image *img) + { + Image *tmp, *tmp2; + for (tmp = img; tmp; tmp = tmp2) { + tmp2 = tmp->next; + tmp->previous = tmp->next = NULL; + if (!tmp->client_data) + /* dispose temporary */ + DestroyImage(tmp); + else + ((ImageData*)tmp->client_data)->tag = 0; + } + } + + static expr mk_image_list(Image *img) + { + expr x = mknil; + Image *imgs; + /* convert image sequence into list of images */ + for (imgs = img; imgs->next; imgs = imgs->next) + ; + /* imgs now points at the last image in the sequence */ + while (x && imgs) { + Image *tmp = imgs->previous; + imgs->scene = 0; + if ((imgs->client_data = init_data())) + x = mkcons(mkobj(type(Image), imgs), x); + else { + dispose(x); x = __ERROR; + } + imgs = tmp; + } + if (x) + decompose_image_list(img); + else { + for (imgs = img; imgs; imgs = imgs->next) + if (imgs->client_data) free(imgs->client_data); + DestroyImageList(img); + } + return x; + } + + static int is_image_list(expr x, Image **img) + { + expr y, hd, tl; + Image *tmp, *tmp2; + for (y = x; iscons(y, &hd, &tl); y = tl) + if (!(isobj(hd, type(Image), (void**)&tmp) && + tmp->columns > 0 && tmp->rows > 0)) + return 0; + if (!isnil(y)) return 0; + *img = NULL; + if (isnil(x)) return 1; + tmp2 = NULL; + for (y = x; iscons(y, &hd, &tl); y = tl) { + isobj(hd, type(Image), (void**)&tmp); + if (tmp->client_data && ((ImageData*)tmp->client_data)->tag) { + /* this image is already in the list, create a temporary copy */ + tmp = CloneImage(tmp, 0, 0, 1, &exception); + if (check_exception(&exception)) { + decompose_image_list(*img); + return 0; + } + tmp->client_data = NULL; + } else + ((ImageData*)tmp->client_data)->tag = 1; + if (tmp2) { + tmp->previous = tmp2; + tmp2->next = tmp; + } else + *img = tmp; + tmp2 = tmp; + } + return 1; + } + /* Read RGBA pixels from a buffer. The color values are scaled to 16 bit and returned in RGBA order which matches the layout of GGI color values. */ *************** *** 783,787 **** ImageInfo info; Image *img; - ImageData *data; int matte; GetImageInfo(&info); --- 881,884 ---- *************** *** 789,803 **** !parse_info(n, xv, &info, &matte)) return __FAIL; - if (!(data = init_data())) return __ERROR; img = AllocateImage(&info); ! if (!img) { ! free(data); return __ERROR; ! } else { PixelPacket *pixels; - img->client_data = data; if (matte >= 0) img->matte = (unsigned)matte; if (!(pixels = SetImagePixels(img, 0, 0, w, h))) { - free(img->client_data); DestroyImage(img); return __FAIL; --- 886,896 ---- !parse_info(n, xv, &info, &matte)) return __FAIL; img = AllocateImage(&info); ! if (!img) return __ERROR; ! else { PixelPacket *pixels; if (matte >= 0) img->matte = (unsigned)matte; if (!(pixels = SetImagePixels(img, 0, 0, w, h))) { DestroyImage(img); return __FAIL; *************** *** 813,819 **** img->storage_class = DirectClass; if (SyncImagePixels(img)) ! return mkobj(type(Image), img); else { - free(img->client_data); DestroyImage(img); return __FAIL; --- 906,911 ---- img->storage_class = DirectClass; if (SyncImagePixels(img)) ! return mk_image(img); else { DestroyImage(img); return __FAIL; *************** *** 834,884 **** return __ERROR; else ! return mkobj(type(Image), img); } else return __FAIL; } - static void decompose_image_list(Image *img) - { - Image *tmp, *tmp2; - for (tmp = img; tmp; tmp = tmp2) { - tmp2 = tmp->next; - tmp->previous = tmp->next = NULL; - if (!tmp->client_data) - /* dispose temporary */ - DestroyImage(tmp); - else - ((ImageData*)tmp->client_data)->tag = 0; - } - } - - static expr mk_image_list(Image *img) - { - expr x = mknil; - Image *imgs; - /* convert image sequence into list of images */ - for (imgs = img; imgs->next; imgs = imgs->next) - ; - /* imgs now points at the last image in the sequence */ - while (x && imgs) { - Image *tmp = imgs->previous; - imgs->scene = 0; - if ((imgs->client_data = init_data())) - x = mkcons(mkobj(type(Image), imgs), x); - else { - dispose(x); x = NULL; - } - imgs = tmp; - } - if (x) - decompose_image_list(img); - else { - for (imgs = img; imgs; imgs = imgs->next) - if (imgs->client_data) free(imgs->client_data); - DestroyImageList(img); - } - return x; - } - FUNCTION(magick,read_image,argc,argv) { --- 926,934 ---- return __ERROR; else ! return mk_image(img); } else return __FAIL; } FUNCTION(magick,read_image,argc,argv) { *************** *** 907,918 **** return mk_image_list(img); } else { - ImageData *data = init_data(); - if (!data) { - DestroyImage(img); - return __ERROR; - } - img->client_data = data; if (matte >= 0) img->matte = (unsigned)matte; ! return mkobj(type(Image), img); } } else --- 957,962 ---- return mk_image_list(img); } else { if (matte >= 0) img->matte = (unsigned)matte; ! return mk_image(img); } } else *************** *** 946,957 **** return mk_image_list(img); } else { - ImageData *data = init_data(); - if (!data) { - DestroyImage(img); - return __ERROR; - } - img->client_data = data; if (matte >= 0) img->matte = (unsigned)matte; ! return mkobj(type(Image), img); } } else --- 990,995 ---- return mk_image_list(img); } else { if (matte >= 0) img->matte = (unsigned)matte; ! return mk_image(img); } } else *************** *** 959,996 **** } - static int is_image_list(expr x, Image **img) - { - expr y, hd, tl; - Image *tmp, *tmp2; - for (y = x; iscons(y, &hd, &tl); y = tl) - if (!(isobj(hd, type(Image), (void**)&tmp) && - tmp->columns > 0 && tmp->rows > 0)) - return 0; - if (!isnil(y)) return 0; - *img = NULL; - if (isnil(x)) return 1; - tmp2 = NULL; - for (y = x; iscons(y, &hd, &tl); y = tl) { - isobj(hd, type(Image), (void**)&tmp); - if (tmp->client_data && ((ImageData*)tmp->client_data)->tag) { - /* this image is already in the list, create a temporary copy */ - tmp = CloneImage(tmp, 0, 0, 1, &exception); - if (check_exception(&exception)) { - decompose_image_list(*img); - return 0; - } - tmp->client_data = NULL; - } else - ((ImageData*)tmp->client_data)->tag = 1; - if (tmp2) { - tmp->previous = tmp2; - tmp2->next = tmp; - } else - *img = tmp; - tmp2 = tmp; - } - return 1; - } - FUNCTION(magick,write_image,argc,argv) { --- 997,1000 ---- *************** *** 1108,1119 **** return mk_image_list(img); } else { - ImageData *data = init_data(); - if (!data) { - DestroyImage(img); - return __ERROR; - } - img->client_data = data; if (matte >= 0) img->matte = (unsigned)matte; ! return mkobj(type(Image), img); } } else --- 1112,1117 ---- return mk_image_list(img); } else { if (matte >= 0) img->matte = (unsigned)matte; ! return mk_image(img); } } else *************** *** 1261,1265 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1259,1263 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1287,1291 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1285,1289 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1307,1311 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1305,1309 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1330,1334 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1328,1332 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1345,1349 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1343,1347 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1360,1364 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1358,1362 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1383,1387 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1381,1385 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1403,1407 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1401,1405 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1423,1427 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1421,1425 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1443,1447 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1441,1445 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1458,1462 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1456,1460 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1473,1477 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1471,1475 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1490,1494 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1488,1492 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1511,1515 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1509,1513 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1537,1541 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1535,1539 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1569,1573 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1567,1571 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1585,1589 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1583,1587 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1686,1690 **** return mk_image_list(img); else ! return mkobj(type(Image), img); } else return __FAIL; --- 1684,1688 ---- return mk_image_list(img); else ! return mk_image(img); } else return __FAIL; *************** *** 1852,1856 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1850,1854 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1869,1873 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1867,1871 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1887,1891 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1885,1889 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1902,1906 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1900,1904 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1919,1923 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1917,1921 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1937,1941 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1935,1939 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1952,1956 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1950,1954 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1970,1974 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1968,1972 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 1987,1991 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 1985,1989 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2006,2010 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2004,2008 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2023,2027 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2021,2025 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2041,2045 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2039,2043 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2059,2063 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2057,2061 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2076,2080 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2074,2078 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2111,2115 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2109,2113 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2129,2133 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2127,2131 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2150,2154 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2148,2152 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2178,2182 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2176,2180 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2195,2199 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2193,2197 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2230,2234 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2228,2232 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2261,2265 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2259,2263 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2277,2281 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2275,2279 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2294,2298 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2292,2296 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2312,2316 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2310,2314 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2334,2338 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2332,2336 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2363,2367 **** return __FAIL; else ! return mkobj(type(Image), img); } else return __FAIL; --- 2361,2365 ---- return __FAIL; else ! return mk_image(img); } else return __FAIL; *************** *** 2385,2388 **** --- 2383,2432 ---- else return __FAIL; + } else + return __FAIL; + } + + FUNCTION(magick,annotate,argc,argv) + { + Image *img; + DrawInfo *draw_info; + expr *xv; + int n; + long x, y; + char *s; + if (argc == 3 && isobj(argv[0], type(Image), (void**)&img) && + (draw_info = get_draw_info(img)) && istuple(argv[1], &n, &xv) && + isint(xv[0], &x) && isint(xv[1], &y) && + isstr(argv[2], &s)) { + int res; + char geom[100]; + sprintf(geom, "%+d%+d", x, y); + draw_info->text = s; + draw_info->geometry = geom; + res = AnnotateImage(img, draw_info); + draw_info->text = draw_info->geometry = NULL; + if (!res) + return __FAIL; + else + return mkvoid; + } else + return __FAIL; + } + + FUNCTION(magick,draw,argc,argv) + { + Image *img; + DrawInfo *draw_info; + char *s; + if (argc == 2 && isobj(argv[0], type(Image), (void**)&img) && + (draw_info = get_draw_info(img)) && isstr(argv[1], &s)) { + int res; + draw_info->primitive = s; + res = DrawImage(img, draw_info); + draw_info->primitive = NULL; + if (!res) + return __FAIL; + else + return mkvoid; } else return __FAIL; Index: magick.q =================================================================== RCS file: /cvsroot/q-lang/q/modules/magick/magick.q,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** magick.q 30 Dec 2003 20:29:58 -0000 1.26 --- magick.q 31 Dec 2003 00:22:52 -0000 1.27 *************** *** 237,240 **** --- 237,249 ---- public extern image_attr IMG KEY, set_image_attr IMG KEY VAL; + /* The DRAW_INFO structure of an image summarizes various properties which + control the rendering of graphics primitives with the draw function. It can + be retrieved and changed with the following operations. */ + + // TODO: + //public extern draw_info IMG, set_draw_info IMG INFO; + + /***************************************************************************/ + /* Retrieve various other useful information about an image. The count_image_ colors function determines the number of unique colors in an image. The *************** *** 484,487 **** --- 493,501 ---- public extern button IMG DIM RAISE; // BANG! + /* Drawing. */ + + public extern annotate IMG P TEXT; // BANG! + public extern draw IMG CMD; // BANG! + /* Painting. */ *************** *** 491,496 **** public extern opaque IMG PIXEL FILL; // BANG! public extern transparent IMG PIXEL OPACITY; // BANG! - - /* Drawing. */ - - // TODO --- 505,506 ---- |