def calc_image_merge_clip(p1, p2, dst, q1, q2):
    """
    p1 (x1, y1, z1) and p2 (x2, y2, z2) define the extent of the (non-scaled)
    data shown.  The image, defined by region q1, q2 is to be placed at dst
    in the image (destination may be outside of the actual data array).

    Refines the modified points (q1', q2') defining the clipped rectangle
    needed to be cut from the source array and scaled.
    """
    x1, y1 = p1[:2]
    x2, y2 = p2[:2]
    dst_x, dst_y = dst[:2]
    a1, b1 = q1[:2]
    a2, b2 = q2[:2]
    src_wd, src_ht = a2 - a1, b2 - b1

    # Trim off parts of srcarr that would be "hidden"
    # to the left and above the dstarr edge.
    ex = y1 - dst_y
    if ex > 0:
        src_ht -= ex
        dst_y += ex
        b1 += ex

    ex = x1 - dst_x
    if ex > 0:
        src_wd -= ex
        dst_x += ex
        a1 += ex

    # Trim off parts of srcarr that would be "hidden"
    # to the right and below dstarr edge.
    ex = dst_y + src_ht - y2
    if ex > 0:
        src_ht -= ex
        b2 -= ex

    ex = dst_x + src_wd - x2
    if ex > 0:
        src_wd -= ex
        a2 -= ex

    if len(p1) > 2:
        # 3D image
        z1, z2, dst_z, c1, c2 = p1[2], p2[2], dst[2], q1[2], q2[2]
        src_dp = c2 - c1

        ex = z1 - dst_z
        if ex > 0:
            src_dp -= ex
            dst_z += ex
            c1 += ex

        ex = dst_z + src_dp - z2
        if ex > 0:
            src_dp -= ex
            c2 -= ex

        return ((dst_x, dst_y, dst_z), (a1, b1, c1), (a2, b2, c2))

    else:
        return ((dst_x, dst_y), (a1, b1), (a2, b2))
def calc_image_merge_clip ( p1 , p2 , dst , q1 , q2 ) : x1 , y1 = p1 [ : 2 ] x2 , y2 = p2 [ : 2 ] dst_x , dst_y = dst [ : 2 ] a1 , b1 = q1 [ : 2 ] a2 , b2 = q2 [ : 2 ] src_wd , src_ht = a2 - a1 , b2 - b1 ex = y1 - dst_y if ex > 0 : src_ht -= ex dst_y += ex b1 += ex ex = x1 - dst_x if ex > 0 : src_wd -= ex dst_x += ex a1 += ex ex = dst_y + src_ht - y2 if ex > 0 : src_ht -= ex b2 -= ex ex = dst_x + src_wd - x2 if ex > 0 : src_wd -= ex a2 -= ex if len ( p1 ) > 2 : z1 , z2 , dst_z , c1 , c2 = p1 [ 2 ] , p2 [ 2 ] , dst [ 2 ] , q1 [ 2 ] , q2 [ 2 ] src_dp = c2 - c1 ex = z1 - dst_z if ex > 0 : src_dp -= ex dst_z += ex c1 += ex ex = dst_z + src_dp - z2 if ex > 0 : src_dp -= ex c2 -= ex return ( ( dst_x , dst_y , dst_z ) , ( a1 , b1 , c1 ) , ( a2 , b2 , c2 ) ) else : return ( ( dst_x , dst_y ) , ( a1 , b1 ) , ( a2 , b2 ) )
p1 (x1, y1, z1) and p2 (x2, y2, z2) define the extent of the (non-scaled)
    data shown.  The image, defined by region q1, q2 is to be placed at dst
    in the image (destination may be outside of the actual data array).

    Refines the modified points (q1', q2') defining the clipped rectangle
    needed to be cut from the source array and scaled.