%D \module
%D   [       file=mp-crop.mpiv,
%D        version=2011.06.23,
%D          title=\CONTEXT\ \METAPOST\ graphics,
%D       subtitle=Cropmarks,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

if known context_crop : endinput ; fi ;

boolean context_crop ; context_crop := true ;

vardef crop_marks_lines (expr box, len, offset, nx, ny, boxtoo) =
    save p ; picture p ; save w, h, x, y ; numeric w, h, x, y ;
    p := image (
        x := if nx = 0 : 1 else : nx - 1 fi ;
        y := if ny = 0 : 1 else : ny - 1 fi ;
        w := bbwidth (box) / x ;
        h := bbheight(box) / y ;
        for i=0 upto y :
            draw ((llcorner box) -- (llcorner box) shifted (-len,0)) shifted (-offset,i*h) ;
            draw ((lrcorner box) -- (lrcorner box) shifted ( len,0)) shifted ( offset,i*h) ;
        endfor ;
        for i=0 upto x :
            draw ((llcorner box) -- (llcorner box) shifted (0,-len)) shifted (i*w,-offset) ;
            draw ((ulcorner box) -- (ulcorner box) shifted (0, len)) shifted (i*w, offset) ;
        endfor ;
        if boxtoo :
            for i=0 upto x-1 :
                for j=0 upto y-1 :
                    draw box enlarged 1/8 shifted (i*w,j*h) dashed evenly withpen pencircle scaled 1/4 ;
                endfor ;
            endfor ;
        fi ;
    ) ;
    setbounds p to box ;
    p
enddef ;

vardef crop_marks_cmyk =
    pickup pencircle scaled 1/2 ;
    save p ; picture p ; p := image (
        fill ulcircle scaled 12.5 withcolor (1,0,0,0) ;
        fill urcircle scaled 12.5 withcolor (0,1,0,0) ;
        fill lrcircle scaled 12.5 withcolor (0,0,1,0) ;
        fill llcircle scaled 12.5 withcolor (0,0,0,1) ;
        draw (-10,0) -- (10,0) ;
        draw (0,-10) -- (0,10) ;
        draw fullcircle scaled 12.5 ;
    ) ;
    setbounds p to fullsquare scaled 20 ;
    p
enddef ;

vardef crop_marks_gray =
    save p ; picture p ; p := image (
        fill ulcircle scaled 12.5 withcolor (0.00) ;
        fill urcircle scaled 12.5 withcolor (0.25) ;
        fill lrcircle scaled 12.5 withcolor (0.50) ;
        fill llcircle scaled 12.5 withcolor (0.75) ;
        draw (-10,0) -- (10,0) ;
        draw (0,-10) -- (0,10) ;
        draw (-6,0) -- (6,0) withcolor white ;
        draw (0,-6) -- (0,6) withcolor white  ;
        draw fullcircle scaled 12.5 ;
    ) ;
    setbounds p to fullsquare scaled 20 ;
    p
enddef ;

vardef crop_marks_cmykrgb =
    save p ; picture p ; p := image (
        fill ulcircle scaled 15 withcolor (1,0,0) ;
        fill urcircle scaled 15 withcolor (0,1,0) ;
        fill lrcircle scaled 15 withcolor (0,0,1) ;
        fill llcircle scaled 15 withcolor (.5,.5,.5) ;
        fill ulcircle scaled 10 withcolor (1,0,0,0) ;
        fill urcircle scaled 10 withcolor (0,1,0,0) ;
        fill lrcircle scaled 10 withcolor (0,0,1,0) ;
        fill llcircle scaled 10 withcolor (0,0,0,1) ;
        draw (-10,0) -- (10,0) ;
        draw (0,-10) -- (0,10) ;
        draw fullcircle scaled 10 ;
        draw fullcircle scaled 15 ;
    ) ;
    setbounds p to fullsquare scaled 20 ;
    p
enddef ;

vardef crop_color(expr c, h, w, dx, dy, ts) =
    image (
        save p ; path p ;
        for i=1 upto 6 :
            p := fullsquare
                xscaled w
                yscaled h
                shifted (dx,dy-i*h) ;
            fill p
                withcolor (crop_colors[i]*c) ;
            draw textext("\format{'@0.2f'," & decimal crop_colors[i] & "}")
                scaled ts
                shifted center p withcolor white ;
        endfor ;
    )
enddef ;

vardef crop_gray(expr c, h, w, dx, dy, ts) =
    image (
        save p ; path p ;
        for i=.05 step .05 until 1 :
            p := fullsquare
                xscaled w
                yscaled h
                shifted (20*(i-1)*w+dx,dy) ;
            fill p
                withcolor (i*c) ;
            draw textext("\format{'@0.2f'," & decimal i & "}")
                scaled ts
                shifted center p withcolor white ;
        endfor ;
    )
enddef ;

% draw crop_marks_cmyk shifted llcorner more ;
% draw crop_marks_cmyk shifted lrcorner more ;
% draw crop_marks_cmyk shifted ulcorner more ;
% draw crop_marks_cmyk shifted urcorner more ;

def page_marks_add_color(expr width, height, length, offset) = % todo: namespace

    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ;

    path page ; page := fullsquare xscaled width yscaled height ;
    path more ; more := page enlarged (offset+length/2,offset+length/2) ;

    numeric crop_colors[] ;
    crop_colors[1] := 1 ;
    crop_colors[2] := 0.95 ;
    crop_colors[3] := 0.75 ;
    crop_colors[4] := 0.50 ;
    crop_colors[5] := 0.25 ;
    crop_colors[6] := 0.05 ;

    numeric h ; h := height / 20 ;
    numeric w ; w := width  / 20 ;
    numeric d ; d := offset + length/2 ;

    draw crop_color((1,0,0,0),h,length,xpart ulcorner page - d, 10h,length/20) ;
    draw crop_color((0,1,0,0),h,length,xpart ulcorner page - d,3.5h,length/20) ;
    draw crop_color((0,0,1,0),h,length,xpart ulcorner page - d, -3h,length/20) ;

    draw crop_color((0,1,1,0),h,length,xpart urcorner page + d, 10h,length/20) ;
    draw crop_color((1,0,1,0),h,length,xpart urcorner page + d,3.5h,length/20) ;
    draw crop_color((1,1,0,0),h,length,xpart urcorner page + d, -3h,length/20) ;

    draw crop_gray((0,0,0,1),length,  w,-xpart llcorner page,-ypart llcorner page + d            ,w/20) ;
    draw crop_gray((1,0,0,0),length/3,w,-xpart llcorner page, ypart llcorner page - d + 1length/3,w/20) ;
    draw crop_gray((0,1,0,0),length/3,w,-xpart llcorner page, ypart llcorner page - d - 0length/3,w/20) ;
    draw crop_gray((0,0,1,0),length/3,w,-xpart llcorner page, ypart llcorner page - d - 1length/3,w/20) ;

    setbounds currentpicture to page ;

enddef ;

def page_marks_add_marking(expr width, height, length, offset) = % todo: namespace

    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ;

    path page ; page := fullsquare xscaled width yscaled height ;
    path more ; more := page enlarged (offset+length/2,offset+length/2) ;

    draw crop_marks_gray shifted center(topboundary    more) shifted (0, offset+length);
    draw crop_marks_cmyk shifted center(bottomboundary more) shifted (0,-offset-length);

    setbounds currentpicture to page ;

enddef ;

def page_marks_add_lines(expr width, height, length, offset, nx, ny, boxtoo) = % todo: namespace

    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ;

    path page ; page := fullsquare xscaled width yscaled height ;
    path more ; more := page enlarged (offset+length/2,offset+length/2) ;

    draw crop_marks_lines(page,length,offset,nx,ny,boxtoo) ;

    setbounds currentpicture to page ;

enddef ;

def page_marks_add_number(expr width, height, length, offset, n) = % todo: namespace

    pickup pencircle scaled 1/2 ; interim linecap := squared ; interim linejoin := butt ;

    path page ; page := fullsquare xscaled width yscaled height ;
    path more ; more := page enlarged (offset+length/2,offset+length/2) ;

    for s=llcorner more, lrcorner more, ulcorner more, urcorner more :
        draw textext(decimal n) shifted s ;
    endfor ;

    setbounds currentpicture to page ;

enddef ;