// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.


#ifndef SKY_ENGINE_PUBLIC_PLATFORM_WEBFLOATPOINT3D_H_
#define SKY_ENGINE_PUBLIC_PLATFORM_WEBFLOATPOINT3D_H_

#include "sky/engine/public/platform/WebCommon.h"

#if INSIDE_BLINK
#include "sky/engine/platform/geometry/FloatPoint3D.h"
#else
#include "ui/gfx/geometry/point3_f.h"
#endif

namespace blink {

struct WebFloatPoint3D {
    float x;
    float y;
    float z;

    WebFloatPoint3D()
        : x(0.0f)
        , y(0.0f)
        , z(0.0f)
    {
    }

    WebFloatPoint3D(float x, float y, float z)
        : x(x)
        , y(y)
        , z(z)
    {
    }

#if INSIDE_BLINK
    WebFloatPoint3D(const FloatPoint3D& p)
        : x(p.x())
        , y(p.y())
        , z(p.z())
    {
    }

    WebFloatPoint3D& operator=(const FloatPoint3D& p)
    {
        x = p.x();
        y = p.y();
        z = p.z();
        return *this;
    }

    operator FloatPoint3D() const
    {
        return FloatPoint3D(x, y, z);
    }
#else
    WebFloatPoint3D(const gfx::Point3F& p)
        : x(p.x())
        , y(p.y())
        , z(p.z())
    {
    }

    WebFloatPoint3D& operator=(const gfx::Point3F& p)
    {
        x = p.x();
        y = p.y();
        return *this;
    }

    operator gfx::Point3F() const
    {
        return gfx::Point3F(x, y, z);
    }

#endif
};

inline bool operator==(const WebFloatPoint3D& a, const WebFloatPoint3D& b)
{
    return a.x == b.x && a.y == b.y && a.z == b.z;
}

inline bool operator!=(const WebFloatPoint3D& a, const WebFloatPoint3D& b)
{
    return !(a == b);
}

} // namespace blink

#endif  // SKY_ENGINE_PUBLIC_PLATFORM_WEBFLOATPOINT3D_H_
