[q-lang-cvs] q/modules/magick magick.c,1.1,1.2 magick.q,1.1,1.2
Brought to you by:
agraef
From: <ag...@us...> - 2003-12-23 01:15:06
|
Update of /cvsroot/q-lang/q/modules/magick In directory sc8-pr-cvs1:/tmp/cvs-serv23691/modules/magick Modified Files: magick.c magick.q Log Message: major overhaul of GGI interface; see ChangeLog for details Index: magick.c =================================================================== RCS file: /cvsroot/q-lang/q/modules/magick/magick.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** magick.c 16 Dec 2003 19:11:16 -0000 1.1 --- magick.c 23 Dec 2003 01:15:02 -0000 1.2 *************** *** 217,252 **** } - /* Read/write alpha channel only. */ - - static void get_alpha(unsigned short *dest, PixelPacket *source, - unsigned long count) - { - unsigned long i; - register PixelPacket *p; - register unsigned short *q; - - p = source; - q = dest; - for (i = 0; i < count; i++) { - *q++=ScaleQuantumToShort(MaxRGB-p->opacity); - p++; - } - } - - static void set_alpha(PixelPacket *dest, unsigned short *source, - unsigned long count) - { - unsigned long i; - register unsigned short *p; - register PixelPacket *q; - - p = source; - q = dest; - for (i = 0; i < count; i++) { - q->opacity=ScaleShortToQuantum(0xffff-*p++); - q++; - } - } - /* parse info tuples */ --- 217,220 ---- *************** *** 355,407 **** } - FUNCTION(magick,magick_alpha,argc,argv) - { - expr *xv, x, hd, tl; - int n; - unsigned long a; - PixelPacket pixel; - bstr_t *m; - unsigned short *v; - if (argc != 1) return __FAIL; - pixel.red = pixel.green = pixel.blue = 0; - /* treat the case of a single alpha value: */ - if (isuint(argv[0], &a) && a <= 0xffff) - pixel.opacity = ScaleShortToQuantum(0xffff-a); - else - goto skip; - if (!(m = malloc(sizeof(bstr_t))) || !(m->v = malloc(2))) { - if (m) free(m); return __ERROR; - } - m->size = 2; - get_alpha((unsigned short*)m->v, &pixel, 1); - return mkobj(type(ByteStr), m); - skip: - /* if we come here, we should deal with a list of alpha values */ - for (n = 0, x = argv[0]; iscons(x, &hd, &tl); x = tl) n++; - if (!isnil(x)) return __FAIL; - if (n == 0) { - if (!(m = malloc(sizeof(bstr_t)))) return __ERROR; - m->size = 0; - m->v = NULL; - return mkobj(type(ByteStr), m); - } - if (n < 0 || n > INT_MAX/2) return __ERROR; - if (!(m = malloc(sizeof(bstr_t))) || !(m->v = malloc(n*2))) { - if (m) free(m); return __ERROR; - } - m->size = n*2; - for (v = (unsigned short*)m->v, x = argv[0]; iscons(x, &hd, &tl); - x = tl, v++) { - if (isuint(hd, &a) && a <= 0xffff) - pixel.opacity = ScaleShortToQuantum(0xffff-a); - else { - free(m->v); free(m); - return __FAIL; - } - get_alpha(v, &pixel, 1); - } - return mkobj(type(ByteStr), m); - } - FUNCTION(magick,create_image,argc,argv) { --- 323,326 ---- *************** *** 641,708 **** return __FAIL; } - - FUNCTION(magick,get_image_alpha,argc,argv) - { - Image *img; - expr *xv; - int n; - long x, y; - unsigned long w, h; - PixelPacket *pixels; - if (argc == 3 && isobj(argv[0], type(Image), (void**)&img) && - istuple(argv[1], &n, &xv) && n == 2 && - isint(xv[0], &x) && isint(xv[1], &y) && - istuple(argv[2], &n, &xv) && n == 2 && - isuint(xv[0], &w) && isint(xv[1], &h) && - (pixels = GetImagePixels(img, x, y, w, h))) { - unsigned long size = w*h; - bstr_t *m; - if (ULONG_MAX/2 < w*h) return __ERROR; - if (size == 0) { - m->size = 0; - m->v = NULL; - return mkobj(type(ByteStr), m); - } - if (!(m = malloc(sizeof(bstr_t))) || !(m->v = malloc(size*2))) { - if (m) free(m); - return __ERROR; - } - m->size = size*2; - get_alpha((unsigned short*)m->v, pixels, w*h); - return mkobj(type(ByteStr), m); - } else - return __FAIL; - } - - FUNCTION(magick,set_image_alpha,argc,argv) - { - Image *img; - expr *xv; - int n; - long x, y; - unsigned long w, h; - bstr_t *m; - PixelPacket *pixels; - if (argc == 4 && isobj(argv[0], type(Image), (void**)&img) && - istuple(argv[1], &n, &xv) && n == 2 && - isint(xv[0], &x) && isint(xv[1], &y) && - istuple(argv[2], &n, &xv) && n == 2 && - isuint(xv[0], &w) && isint(xv[1], &h) && - isobj(argv[3], type(ByteStr), (void**)&m) && m->size%2 == 0) { - unsigned long size = w*h; - if (ULONG_MAX/2 < w*h || 2*size != m->size) - return __FAIL; - else if (size == 0) - return mkvoid; - if (!(pixels = SetImagePixels(img, x, y, w, h))) - return __FAIL; - set_alpha(pixels, (unsigned short*)m->v, w*h); - img->storage_class = DirectClass; - if (SyncImagePixels(img)) - return mkvoid; - else - return __FAIL; - } else - return __FAIL; - } - --- 560,561 ---- Index: magick.q =================================================================== RCS file: /cvsroot/q-lang/q/modules/magick/magick.q,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** magick.q 16 Dec 2003 19:11:16 -0000 1.1 --- magick.q 23 Dec 2003 01:15:02 -0000 1.2 *************** *** 64,73 **** public extern magick_pixel COLOR; - /* The magick_alpha function packs a single alpha value in the range 0..0xffff - or a list of such values into a byte string, suitable as the DATA argument - of set_image_alpha (see below). */ - - public extern magick_alpha ALPHA; - /* Operations to create, read and write an image. The create_image function creates a new image, given an INFO tuple of the form (WIDTH, HEIGHT, DEPTH, --- 64,67 ---- *************** *** 129,138 **** public extern get_image_pixels IMG P DIM; public extern set_image_pixels IMG P DIM DATA; - - /* Get and set the alpha channel of an image. The data is encoded as a byte - string of 16 bit alpha values. These functions can be used to transfer the - alpha plane of an image to the alpha buffer of a GGI visual and vice - versa. */ - - public extern get_image_alpha IMG P DIM; - public extern set_image_alpha IMG P DIM DATA; --- 123,124 ---- |