root/src/servers/app/drawing/PatternHandler.cpp
/*
 * Copyright (c) 2001-2007, Haiku, Inc.
 * Distributed under the terms of the MIT license.
 *
 * Author:      DarkWyrm <bpmagic@columbus.rr.com>
 *                      Stephan Aßmus <superstippi@gmx.de>
 */

#include "PatternHandler.h"

#include <stdio.h>

#include <Point.h>

const Pattern kSolidHigh(0xFFFFFFFFFFFFFFFFLL);
const Pattern kSolidLow((uint64)0);
const Pattern kMixedColors(0xAAAAAAAAAAAAAAAALL);

const rgb_color kBlack = (rgb_color){ 0, 0, 0, 255 };
const rgb_color kWhite = (rgb_color){ 255, 255, 255, 255 };

/*!
        \brief Void constructor

        The pattern is set to B_SOLID_HIGH, high color is set to black, and
        low color is set to white.
*/
PatternHandler::PatternHandler(void)
        : fPattern(kSolidHigh),
          fHighColor(kBlack),
          fLowColor(kWhite),
          fXOffset(0),
          fYOffset(0)
{
}

/*!
        \brief Constructor initializes to given pattern
        \param pat Pattern to use.

        This initializes to the given pattern or B_SOLID_HIGH if the pattern
        is NULL. High color is set to black, and low color is set to white.
*/
PatternHandler::PatternHandler(const int8* pat)
        : fPattern(pat ? Pattern(pat) : Pattern(kSolidHigh)),
          fHighColor(kBlack),
          fLowColor(kWhite),
          fXOffset(0),
          fYOffset(0)
{
}

/*!
        \brief Constructor initializes to given pattern
        \param pat Pattern to use.

        This initializes to the given pattern or B_SOLID_HIGH if the pattern
        is NULL. High color is set to black, and low color is set to white.
*/
PatternHandler::PatternHandler(const uint64& pat)
        : fPattern(pat),
          fHighColor(kBlack),
          fLowColor(kWhite),
          fXOffset(0),
          fYOffset(0)
{
}

/*!
        \brief Constructor initializes to given pattern
        \param pat Pattern to use.

        This initializes to the given Pattern.
        High color is set to black, and low color is set to white.
*/
PatternHandler::PatternHandler(const Pattern& pat)
        : fPattern(pat),
          fHighColor(kBlack),
          fLowColor(kWhite),
          fXOffset(0),
          fYOffset(0)
{
}

/*!
        \brief Constructor initializes to given PatternHandler
        \param other PatternHandler to copy.

        Copy constructor.
*/
PatternHandler::PatternHandler(const PatternHandler& other)
        : fPattern(other.fPattern),
          fHighColor(other.fHighColor),
          fLowColor(other.fLowColor),
          fXOffset(other.fXOffset),
          fYOffset(other.fYOffset)
{
}

//! Destructor does nothing
PatternHandler::~PatternHandler(void)
{
}

/*!
        \brief Sets the pattern for the handler to the one given
        \param pat Pattern to use.

        This initializes to the given pattern or B_SOLID_HIGH if the pattern
        is NULL.
*/
void
PatternHandler::SetPattern(const int8* pat)
{
        if (pat)
                fPattern.Set(pat);
        else
                fPattern = kSolidHigh;
}

/*!
        \brief Sets the pattern for the handler to the one given
        \param pat Pattern to use.
*/
void
PatternHandler::SetPattern(const uint64& pat)
{
        fPattern = pat;
}

/*!
        \brief Sets the pattern for the handler to the one given
        \param pat Pattern to use.
*/
void
PatternHandler::SetPattern(const Pattern& pat)
{
        fPattern = pat;
}

/*!
        \brief Sets the pattern for the handler to the one given
        \param pat R5 style pattern to use.
*/
void
PatternHandler::SetPattern(const pattern& pat)
{
        fPattern = pat;
}

/*!
        \brief Set the colors for the pattern to use
        \param high High color for the handler
        \param low Low color for the handler
*/
void
PatternHandler::SetColors(const rgb_color& high, const rgb_color& low)
{
        fHighColor = high;
        fLowColor = low;
}

/*!
        \brief Set the high color for the pattern to use
        \param color High color for the handler
*/
void
PatternHandler::SetHighColor(const rgb_color& color)
{
        fHighColor = color;
}

/*!
        \brief Set the low color for the pattern to use
        \param color Low color for the handler
*/
void
PatternHandler::SetLowColor(const rgb_color& color)
{
        fLowColor = color;
}

/*!
        \brief Obtains the color in the pattern at the specified coordinates
        \param pt Coordinates to get the color for
        \return Color for the coordinates
*/
rgb_color
PatternHandler::ColorAt(const BPoint &pt) const
{
        return ColorAt(pt.x, pt.y);
}

/*!
        \brief Obtains the color in the pattern at the specified coordinates
        \param x X coordinate to get the color for
        \param y Y coordinate to get the color for
        \return Color for the coordinates
*/
rgb_color
PatternHandler::ColorAt(float x, float y) const
{
        return ColorAt(int(x), int(y));
}

/*!
        \brief Obtains the value of the pattern at the specified coordinates
        \param pt Coordinates to get the value for
        \return Value for the coordinates - true if high, false if low.
*/
bool
PatternHandler::IsHighColor(const BPoint &pt) const
{
        return IsHighColor((int)pt.x, (int)pt.y);
}

/*!
        \brief Transfers the scrolling offset of a BView to affect the pattern.
        \param x Positive or negative horizontal offset
        \param y Positive or negative vertical offset
*/
void
PatternHandler::SetOffsets(int32 x, int32 y)
{
        fXOffset = x & 7;
        fYOffset = y & 7;
}