def coords_shade(mask, idens=6, style='u',
                 west=0, east=360, south=-90, north=90):
    import numpy as np

    if style not in ['u', 'd', 'h', 'v', 'x', '+']:
        print('ERROR @ {}'.format(sys._getframe().f_code.co_name))
        print('Unexpected value in $style: {}'.format(style))
        quit()

    idens = int(idens)

    if style in ['x', '+']:
        if style == 'x':
            lons1_1, lons2_1, lats1_1, lats2_1 = \
                coords_shade(mask, idens=idens, style='u',
                             west=west, east=east, south=south, north=north)
            lons1_2, lons2_2, lats1_2, lats2_2 = \
                coords_shade(mask, idens=idens, style='d',
                             west=west, east=east, south=south, north=north)
        elif style == '+':
            lons1_1, lons2_1, lats1_1, lats2_1 = \
                coords_shade(mask, idens=idens, style='h',
                             west=west, east=east, south=south, north=north)
            lons1_2, lons2_2, lats1_2, lats2_2 = \
                coords_shade(mask, idens=idens, style='v',
                             west=west, east=east, south=south, north=north)
        lons1 = np.r_[lons1_1, lons1_2]
        lons2 = np.r_[lons2_1, lons2_2]
        lats1 = np.r_[lats1_1, lats1_2]
        lats2 = np.r_[lats2_1, lats2_2]

        return lons1, lons2, lats1, lats2

    ny, nx = mask.shape

    wlat = float(north - south) / ny
    wlon = float(east - west) / nx

    lons_all = west + wlon*(np.arange(nx)+0.5)
    lats_all = south + wlat*(np.arange(ny)+0.5)
    lons_all, lats_all = np.meshgrid(lons_all, lats_all)

    mask_shade = np.zeros((ny, nx), dtype='int32')
    if style == 'u':
        for i in range(idens):
            mask_shade[i::idens, i::idens] = 1
    elif style == 'd':
        for i in range(idens):
            mask_shade[-i-1::-idens, i::idens] = 1
    elif style == 'h':
        mask_shade[::idens, :] = 1
    elif style == 'v':
        mask_shade[:, ::idens] = 1
    mask_shade[~mask] = 0

    if style == 'u':
        mask_shade_ = np.zeros((ny, nx*2-1))
        lons_all_   = np.zeros((ny, nx*2-1))
        lats_all_   = lats_all
        for y in range(1, ny):
            mask_shade_[y, ny-y:ny-y+nx] = mask_shade[y,:]
            lons_all_[y, ny-y:ny-y+nx] = lons_all[y,:]
    elif style == 'd':
        mask_shade_ = np.zeros((ny, nx*2-1))
        lons_all_   = np.zeros((ny, nx*2-1))
        lats_all_   = lats_all
        for y in range(ny):
            mask_shade_[y, y:y+nx] = mask_shade[y,:]
            lons_all_[y, y:y+nx] = lons_all[y,:]
    elif style == 'h':
        mask_shade_ = np.transpose(mask_shade)
        lons_all_   = np.transpose(lats_all)
        lats_all_   = np.transpose(lons_all)
    elif style == 'v':
        mask_shade_ = mask_shade
        lons_all_   = lons_all
        lats_all_   = lats_all

    clons1_all, clons2_all, clats1_all, clats2_all = [], [], [], []
    for x in range(mask_shade_.shape[1]):
        yy = np.where(mask_shade_[:,x] == 1)[0]
        if len(yy) == 0:
            continue
        yi, yf = [yy[0]], []
        lons1, lons2 = [lons_all_[yy[0],x]], []
        lats1, lats2 = [lats_all_[yy[0],0]], []
        for y1, y2 in zip(yy[:-1], yy[1:]):
            if y1 != y2-1:
                yf.append(y1)
                yi.append(y2)
                lats1.append(lats_all_[y2,0])
                lats2.append(lats_all_[y1,0])
                lons1.append(lons_all_[y2,x])
                lons2.append(lons_all_[y1,x])
        yf.append(yy[-1])
        lats2.append(lats_all_[yy[-1],0])
        lons2.append(lons_all_[yy[-1],x])
        clats1_all.append(lats1)
        clats2_all.append(lats2)
        clons1_all.append(lons1)
        clons2_all.append(lons2)

    lons1, lons2, lats1, lats2 = [], [], [], []
    if style == 'u':
        for clons1, clons2, clats1, clats2 in \
            zip(clons1_all, clons2_all, clats1_all, clats2_all):
            for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2):
                lons1.append(clon1 - wlon*0.5)
                lons2.append(clon2 + wlon*0.5)
                lats1.append(clat1 - wlat*0.5)
                lats2.append(clat2 + wlat*0.5)
    elif style == 'd':
        for clons1, clons2, clats1, clats2 in \
            zip(clons1_all, clons2_all, clats1_all, clats2_all):
            for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2):
                lons1.append(clon1 - wlon*0.5)
                lons2.append(clon2 + wlon*0.5)
                lats1.append(clat1 + wlat*0.5)
                lats2.append(clat2 - wlat*0.5)
    elif style == 'h':
        for clons1, clons2, clats1, clats2 in \
            zip(clons1_all, clons2_all, clats1_all, clats2_all):
            for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2):
                lats1.append(clon1 - wlon*0.5)
                lats2.append(clon2 + wlon*0.5)
                lons1.append(clat1)
                lons2.append(clat2)
    elif style == 'v':
        for clons1, clons2, clats1, clats2 in \
            zip(clons1_all, clons2_all, clats1_all, clats2_all):
            for clon1, clon2, clat1, clat2 in zip(clons1, clons2, clats1, clats2):
                lons1.append(clon1)
                lons2.append(clon2)
                lats1.append(clat1 - wlat*0.5)
                lats2.append(clat2 + wlat*0.5)
    lons1 = np.array(lons1)
    lons2 = np.array(lons2)
    lats1 = np.array(lats1)
    lats2 = np.array(lats2)

    return (lons1, lons2, lats1, lats2)