bool MouseHelper::IsMouseInRect(RectangleWH rectangle)
{
    return
        previousMousePosition.GetX() >= rectangle.GetX() &&
        previousMousePosition.GetX() <= rectangle.GetX() + rectangle.GetWidth() &&
        previousMousePosition.GetY() >= rectangle.GetY() &&
        previousMousePosition.GetY() <= rectangle.GetY() + rectangle.GetHeight();
}
Vector2 Crowd::GetCenterPoint()
{
    if (IsInteractionPointExact())
    {
        return interactionLocation;
    }

    RectangleWH clickPolygonBoundingBox = clickPolygon.GetBoundingBox();

    return Vector2(
        clickPolygonBoundingBox.GetX() + clickPolygonBoundingBox.GetWidth() / 2,
        clickPolygonBoundingBox.GetY() + clickPolygonBoundingBox.GetHeight() / 2);
}
RectangleWH FieldCharacter::GetBoundsForInteraction()
{
    if (IsInteractionPointExact())
    {
        return RectangleWH(interactionLocation.GetX(), interactionLocation.GetY(), 1, 1);
    }

    RectangleWH hitboxBoundingBox = GetHitBox()->GetBoundingBox();

    return RectangleWH(
        GetVectorAnchorPosition().GetX() + hitboxBoundingBox.GetX(),
        GetVectorAnchorPosition().GetY() + hitboxBoundingBox.GetY(),
        hitboxBoundingBox.GetWidth(),
        hitboxBoundingBox.GetHeight());
}
void Location::CutsceneView::CameraManipulatable::SetWindowRect(RectangleWH windowRect)
{
    RectangleWH adjustedWindowRect =
        RectangleWH(
                min(max(windowRect.GetX(), 0.0), backgroundSize.GetX() - gameWindowSize.GetX()),
                min(max(windowRect.GetY(), 0.0), backgroundSize.GetY() - gameWindowSize.GetY()),
                gameWindowSize.GetX(),
                gameWindowSize.GetY());

    if (adjustedWindowRect != this->windowRect)
    {
        this->windowRect = adjustedWindowRect;
        Update();

        emit WindowRectChanged(adjustedWindowRect);
    }
}
void Sprite::DrawClipped(Vector2 position, RectangleWH clipRect, bool flipHorizontally, Color color)
{
    if (GetSpriteSheetImage() == NULL)
    {
        return;
    }

    Vector2 pixelSnappedPosition = Vector2((int)position.GetX(), (int)position.GetY());

    GetSpriteSheetImage()->Draw(
        pixelSnappedPosition,
        RectangleWH(
            spriteClipRect.GetX() + clipRect.GetX(),
            spriteClipRect.GetY() + clipRect.GetY(),
            clipRect.GetWidth(),
            clipRect.GetHeight()),
        flipHorizontally,
        false /* flipVertically */,
        1.0,
        color);
}
void Sprite::DrawClipped(Vector2 position, RectangleWH clipRect, bool flipHorizontally, Color color)
{
    if (GetSpriteSheetImage() == NULL)
    {
        return;
    }

    // Adjust the clip rect to account for the fact that we've eliminated blank space
    // that was around the source image.
    if (spriteDrawOffset.GetX() > 0 || spriteDrawOffset.GetY() > 0)
    {
        Vector2 oldClipRectPosition(clipRect.GetX(), clipRect.GetY());

        clipRect.SetX(clipRect.GetX() - spriteDrawOffset.GetX());
        clipRect.SetY(clipRect.GetY() - spriteDrawOffset.GetY());

        position += Vector2(clipRect.GetX(), clipRect.GetY()) - oldClipRectPosition;

        if (clipRect.GetX() + clipRect.GetWidth() > GetWidth())
        {
            clipRect.SetWidth(GetWidth() - clipRect.GetX());
        }

        if (clipRect.GetY() + clipRect.GetHeight() > GetHeight())
        {
            clipRect.SetHeight(GetHeight() - clipRect.GetY());
        }
    }

    Vector2 pixelSnappedPosition =
        Vector2(
            (int)(position.GetX() + (originalSize.GetX() > 0 && flipHorizontally ? originalSize.GetX() - GetWidth() - spriteDrawOffset.GetX() : spriteDrawOffset.GetX())),
            (int)(position.GetY() + spriteDrawOffset.GetY()));

    GetSpriteSheetImage()->Draw(
        pixelSnappedPosition,
        RectangleWH(
            spriteClipRect.GetX() + clipRect.GetX(),
            spriteClipRect.GetY() + clipRect.GetY(),
            clipRect.GetWidth(),
            clipRect.GetHeight()),
        flipHorizontally,
        false /* flipVertically */,
        1.0,
        color);
}
void MLIFont::DrawInternal(const string &s, Vector2 position, Color color, double scale, RectangleWH clipRect)
{
    EnsureUIThread();

    // If we're trying to draw an empty string, we can just return -
    // we're not gonna draw anything anyhow.
    if (s.length() == 0)
    {
        return;
    }

    CheckScale();

    double x = position.GetX();
    double y = position.GetY();

    for (string::const_iterator it = s.begin(); it < s.end();)
    {
        uint32_t c = 0;
        if (!GetNextFromStringIterator(it, s.end(), &c))
        {
            break;
        }

        Image *pGlyphImage = cache[c];
        if (pGlyphImage == NULL)
        {
            continue;
        }

        RectangleWH characterClipRect(0, 0, pGlyphImage->width / GetFontScale(), pGlyphImage->height / GetFontScale());
        RectangleWH originalCharacterClipRect = characterClipRect;

        if (clipRect.GetWidth() < 0 || clipRect.GetX() < originalCharacterClipRect.GetWidth())
        {
            if (clipRect.GetWidth() >= 0)
            {
                if (clipRect.GetX() > 0)
                {
                    characterClipRect.SetX(originalCharacterClipRect.GetX() + clipRect.GetX());
                    characterClipRect.SetWidth(originalCharacterClipRect.GetWidth() - clipRect.GetX());
                }

                if (clipRect.GetWidth() < characterClipRect.GetWidth())
                {
                    characterClipRect.SetWidth(clipRect.GetWidth());
                }

                if (clipRect.GetY() > 0)
                {
                    characterClipRect.SetY(min(originalCharacterClipRect.GetY() + clipRect.GetY(), originalCharacterClipRect.GetY() + originalCharacterClipRect.GetHeight()));
                    characterClipRect.SetHeight(originalCharacterClipRect.GetHeight() - (characterClipRect.GetY() - originalCharacterClipRect.GetY()));
                }

                if (clipRect.GetHeight() < characterClipRect.GetHeight())
                {
                    characterClipRect.SetHeight(clipRect.GetHeight());
                }
            }

            if (characterClipRect.GetWidth() > 0 && characterClipRect.GetHeight() > 0)
            {
                characterClipRect.SetHeight(characterClipRect.GetHeight() * GetFontScale());
                characterClipRect.SetWidth(characterClipRect.GetWidth() * GetFontScale());
                pGlyphImage->Draw(Vector2(x, y), characterClipRect, false, false, scale, scale, color);
            }
        }

        double deltaX = pGlyphImage->width;

        if (it < s.end())
        {
            uint32_t c2 = 0;
            if (PeekNextFromStringIterator(it, s.end(), &c2))
            {
                deltaX = GetKernedWidth(c, c2);
            }
        }

        x += deltaX / GetFontScale();
    }
}