/*
 * ----------------------------------------------------------------------------
 *
 * DBHomePlaneTypes ---
 *
 *	Generate a mask of all the tile types whose home plane is the
 *	indicated plane pNum.  First, all types that exist in the plane
 *	are counted with DBPlaneMask[].  Then, types whose home plane
 *	are not pNum are removed from the mask.  Stacking contact types
 *	are removed only if none of their residue contact types have
 *	a home plane of pNum.
 *
 * Results:
 *	A mask of tile types whose home plane is pNum.
 *
 * Side effects:
 *	None.
 *
 * ----------------------------------------------------------------------------
 */

TileTypeBitMask
DBHomePlaneTypes(pNum)
    int pNum;
{
    TileTypeBitMask uMask, *rmask;
    int pNum, m, n, p;
    LayerInfo *lc, *lr;

    TTMaskZero(&uMask);
    TTMaskSetMask(&uMask, &DBPlaneMask[pNum]);

    for (m = 0; m < DBNumContacts; m++)
    {
	lc = dbContactInfo[m];
	if (lc->l_type >= DBNumUserLayers)
	{
	    rMask = DBResidueMask(lc->l_type);
	    p = 0;
	    for (n = 0; n < DBNumContacts; n++)
	    {
		lr = dbContactInfo[n];
		if (TTMaskHasType(rMask, lr->l_type))
		    p |= PlaneNumToMaskBit(DBPlane(lr->l_type));
	    }
	    if (!PlaneMaskHasPlane(p, pNum))
		TTMaskClearType(&uMask, lc->l_type);
	}
	else if (pNum != DBPlane(lc->l_type))
	    TTMaskClearType(&uMask, lc->l_type);
    }
    return uMask;
}

