CRIMP
Artifact [a1d90c2dd8]
Not logged in

Artifact a1d90c2dd89e9f7bd282dd683ff71c6ac3cdff57:


read::Tcl_grey8
Tcl_Obj* pixels

/*
 * Create a grey8 image from a list of lists of integers in the range
 * [0..255]. This is, in essence, a read command, just using core Tcl
 * values instead of a Tk photo as input.
 *
 * Using this command should be easier than trying to work with 'list' and
 * 'binary'. This way the result even already has the proper intrep.
 */

Tcl_Obj** rowv;
Tcl_Obj** colv;
crimp_image*     result;
int              x, y, w, h, rowc, colc, value;

/*
 * Check input, i.e. verify structure and extract dimensions
 */

if (Tcl_ListObjGetElements(interp, pixels, &rowc, &rowv) != TCL_OK) {
    return TCL_ERROR;
}
h = rowc;
w = 0;
for (y = 0; y < h; y++) {
    if (Tcl_ListObjGetElements(interp, rowv [y], &colc, &colv) != TCL_OK) {
	return TCL_ERROR;
    }
    if (colc > w) {
	w = colc;
    }
    for (x = 0; x < colc; x++) {
	if (Tcl_GetIntFromObj(interp, colv [x], &value) != TCL_OK) {
	    return TCL_ERROR;
	}
	if ((value < 0) || (value > 255)) {
	    Tcl_SetResult(interp, "integer out of range 0..255", TCL_STATIC);
	    return TCL_ERROR;
	}
    }
}

result = crimp_new_grey8 (w, h);

for (y = 0; y < h; y++) {

    Tcl_ListObjGetElements(interp, rowv [y], &colc, &colv);

    for (x = 0; x < colc; x++) {
	Tcl_GetIntFromObj(interp, colv [x], &value);
	GREY8 (result, x, y) = value;
    }
    for (; x < w; x++) {
	GREY8 (result, x, y) = BLACK;
    }
}

Tcl_SetObjResult(interp, crimp_new_image_obj (result));
return TCL_OK;


/* vim: set sts=4 sw=4 tw=80 et ft=c: */
/*
 * Local Variables:
 * mode: c
 * c-basic-offset: 4
 * fill-column: 78
 * End:
 */