/*-*-C-*-
 *
 * Some functions to assist in icon justification bashing.
 */

#include "resed.h"


/*
 * Canonicalise icon flags word.  Return TRUE if the flag value changed.
 */

Bool justify_canonicalise (IconInfoPtr icon)
{
    unsigned int flags = icon->icon.flags | IF_VCENT;

    switch (icon->icon.flags & (IF_TEXT | IF_SPRITE))
    {
    case 0:
        flags |= IF_HCENT;
        flags &= ~IF_RJUST;
        break;
    case IF_TEXT:
    case IF_SPRITE:
        if (flags & IF_HCENT)
            flags &= ~IF_RJUST;
        break;
    case IF_SPRITE | IF_TEXT:
        if ((flags & IF_HCENT) && (flags & IF_RJUST))
            flags &= ~(IF_HCENT | IF_RJUST);
        break;
    }

    if (flags == icon->icon.flags)
        return FALSE;
    icon->icon.flags = flags;
    return TRUE;
}



/*
 * Given an icon, return its justification value.  We treat a
 * text+sprite icon with empty text as a sprite-only icon
 * for these purposes.
 */

JustifyType justify_type (IconInfoPtr icon)
{
    unsigned int flags = icon->icon.flags;

    if (flags & IF_IST == IF_IST &&
        (icon->icon.data[0] == 0 || icon->icon.data[0] == -1 ||
         *(char *) icon->icon.data[0] == 0))
        flags &= ~IF_TEXT;

    switch (flags & (IF_TEXT | IF_SPRITE))
    {
    case IF_TEXT:
    case IF_SPRITE:
        if (flags & IF_HCENT)           return Centre;
        else if (flags & IF_RJUST)      return Right;
        else                            return Left;
    case IF_TEXT | IF_SPRITE:
        if (flags & IF_HCENT)           return Centre;
        else if (flags & IF_RJUST)      return Left;    /* Sic */
        else                            return Right;   /* Sic */
    }
    return Centre;
}



/*
 * Set an icon to the specified justification type
 */

void justify_settype (IconInfoPtr icon, JustifyType type)
{
    unsigned int flags = icon->icon.flags & ~(IF_HCENT | IF_RJUST);
    unsigned int f = flags;

    if (f & IF_IST == IF_IST &&
        (icon->icon.data[0] == 0 || icon->icon.data[0] == -1 ||
         *(char *) icon->icon.data[0] == 0))
        f &= ~IF_TEXT;

    switch (f & (IF_TEXT | IF_SPRITE))
    {
    case IF_TEXT:
    case IF_SPRITE:
        if (type == Centre)             flags |= IF_HCENT;
        else if (type == Right)         flags |= IF_RJUST;
        break;
    case IF_TEXT | IF_SPRITE:
        if (type == Centre)             flags |= IF_HCENT;
        else if (type == Left)          flags |= IF_RJUST;  /* Sic */
        break;
    default:
        flags |= IF_HCENT;
    }

    icon->icon.flags = flags;
}
