## -*- mode: tcl ; fill-column: 90 -*-
# # ## ### ##### ######## ############# #####################
## Generators -- Virtual Image - Variations on stripe, grid, and checker board patterns

operator image::grid {
    section generator virtual

    note Returns image containing an axis-aligned black/white grid with configurable stripes

    example {width 128 height 128}
    example {width 128 height 128 black 16 white 32}
    example {width 128 height 128 black 16 white 32 offset 8}

    uint   width   Width of the returned image
    uint   height  Height of the returned image

    uint? 0 offset     Pattern offset
    uint? 8 black      Width of the black stripe
    uint? 8 white      Width of the white stripe

    body {
	set sv [stripes width $width height $height black $black white $white offset $offset]
	set sh [aktive op rotate cw $sv]

	aktive op math min $sv $sh
    }
}

operator image::dgrid {
    section generator virtual

    note Returns image containing a diagonal black/white grid with configurable stripes

    example {width 128 height 128}
    example {width 128 height 128 black 16 white 32}
    example {width 128 height 128 black 16 white 32 offset 8}

    uint   width   Width of the returned image
    uint   height  Height of the returned image

    uint? 0 offset     Pattern offset
    uint? 8 black      Width of the black stripe
    uint? 8 white      Width of the white stripe

    body {
	set sv [dstripes width $width height $height black $black white $white offset $offset]
	set sh [aktive op rotate cw $sv]

	aktive op math min $sv $sh
    }
}

operator image::stripes {
    section generator virtual

    note Returns image containing a series of vertical black/white stripes.

    example {width 128 height 128}
    example {width 128 height 128 black 16 white 32}
    example {width 128 height 128 black 16 white 32 offset 8}

    uint   width   Width of the returned image
    uint   height  Height of the returned image

    uint? 0 offset     Pattern offset
    uint? 8 black      Width of the black stripe
    uint? 8 white      Width of the white stripe

    state -fields {
	aktive_uint total; // Total width of black and white stripes. Pattern distance.
    } -setup {
	aktive_geometry_set (domain, 0, 0, param->width, param->height, 1);

	// save pattern distance
	state->total = param->black + param->white;
    }

    blit stripes {
	{AH {y AY 1 up} {y SY 1 up}}
	{AW {x AX 1 up} {x SX 1 up}}
	{DD {z 0  1 up} {z 0  1 up}}
    } {point {
	BW (x)
    }}

    pixels {
	#define BW(x) (((((x) + param->offset) % istate->total) >= param->black) ? 1 : 0)
	#define SD (idomain->depth)
	#define SH (idomain->height)
	#define SW (idomain->width)
	#define SX (request->x)
	#define SY (request->y)
	@@stripes@@
	#undef BW
    }
}

operator image::dstripes {
    section generator virtual

    note Returns image containing a series of diagonal black/white stripes.

    example {width 128 height 128}
    example {width 128 height 128 black 16 white 32}
    example {width 128 height 128 black 16 white 32 offset 8}

    uint   width   Width of the returned image
    uint   height  Height of the returned image

    uint? 0 offset     Pattern offset
    uint? 8 black      Width of the black stripe
    uint? 8 white      Width of the white stripe

    state -fields {
	aktive_uint total; // Total width of black and white area. Pattern distance.
    } -setup {
	aktive_geometry_set (domain, 0, 0, param->width, param->height, 1);

	// save pattern distance
	state->total = param->black + param->white;
    }

    blit dstripes {
	{AH {y AY 1 up} {y SY 1 up}}
	{AW {x AX 1 up} {x SX 1 up}}
	{DD {z 0  1 up} {z 0  1 up}}
    } {point {
	BW (x-y)
    }}

    pixels {
	#define BW(x) (((((x) + param->offset) % istate->total) >= param->black) ? 1 : 0)
	#define SD (idomain->depth)
	#define SH (idomain->height)
	#define SW (idomain->width)
	#define SX (request->x)
	#define SY (request->y)
	@@dstripes@@
	#undef BW
    }
}

operator image::checkers {
    section generator virtual

    note Returns image containing a black/white checker board.

    example {width 128 height 128}
    example {width 128 height 128 black 16 white 32}
    example {width 128 height 128 black 16 white 32 offset 8}

    uint   width   Width of the returned image
    uint   height  Height of the returned image

    uint? 0 offset     Pattern offset
    uint? 8 black      Width of the black area
    uint? 8 white      Width of the white area

    state -fields {
	aktive_uint total; // Total width of black and white area. Pattern distance.
    } -setup {
	aktive_geometry_set (domain, 0, 0, param->width, param->height, 1);
	// save pattern distance
	state->total = param->black + param->white;
    }

    blit checkers {
	{AH {y AY 1 up} {y SY 1 up}}
	{AW {x AX 1 up} {x SX 1 up}}
	{DD {z 0  1 up} {z 0  1 up}}
    } {point {
	BW (x) ^ BW (y)
    }}

    pixels {
	#define BW(x) (((((x) + param->offset) % istate->total) >= param->black) ? 1 : 0)
	#define SD (idomain->depth)
	#define SH (idomain->height)
	#define SW (idomain->width)
	#define SX (request->x)
	#define SY (request->y)
	@@checkers@@
	#undef BW
    }
}

##
# # ## ### ##### ######## ############# #####################
::return
