/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef __GSDEFS_H_INCLUDED_ #define __GSDEFS_H_INCLUDED_ #include "TD_PackPush.h" #include "OdRound.h" //**************************************************************************** // Helper classes //**************************************************************************** // copied(with modification) from limits.h to avoid extra #includes #define SCALAR_MIN (-2147483647 - 1) // minimum(signed) int32 value #define SCALAR_MAX 2147483647 // maximum(signed) int32 value /** \details This class represents 2D Device Coordinate points. Library: TD_Gs \remarks Device coordinates are measured in pixels from the lower-left corner of the device. \sa Coordinate Systems. */ class OdGsDCPoint { public: enum MaxFlag { Maximum }; enum MinFlag { Minimum }; /** \param xx [in] The X-coordinate of this point. \param yy [in] The Y-coordinate of this point. \remarks Builds an instance of the object OdGsDCPoint(Maximum) sets x = SCALAR_MAX, y = SCALAR_MAX OdGsDCPoint(Minimum) sets x = SCALAR_MIN, y = SCALAR_MIN */ OdGsDCPoint() { } OdGsDCPoint(long xx, long yy) : x(xx), y(yy) { } OdGsDCPoint(MaxFlag) { x = SCALAR_MAX; y = SCALAR_MAX; } OdGsDCPoint(MinFlag) { x = SCALAR_MIN; y = SCALAR_MIN; } /** \remarks Sets this object to the value of the object on the right. Maximum sets x = SCALAR_MAX, y = SCALAR_MAX Minimum sets x = SCALAR_MIN, y = SCALAR_MIN */ void operator=(MaxFlag) { x = SCALAR_MAX; y = SCALAR_MAX; } void operator=(MinFlag) { x = SCALAR_MIN; y = SCALAR_MIN; } void operator=(const OdGsDCPoint& dcPoint) { x = dcPoint.x; y = dcPoint.y; } bool operator==(const OdGsDCPoint& dcPoint) const { return x == dcPoint.x && y == dcPoint.y; } bool operator!=(const OdGsDCPoint& dcPoint) const { return x != dcPoint.x || y != dcPoint.y; } inline long operator[](unsigned int i) const { return *(&x + i); } long x; // X-coordinate. long y; // Y-coordinate. }; /** \details This class represents 2D device coordinate rectangles. Library: TD_Gs \remarks Device coordinates are measured in pixels from the lower-left corner of the device. \sa Coordinate Systems. */ class OdGsDCRect { public: enum NullFlag { Null }; /** \param minPoint [in] Lower-left corner. \param maxPoint [in] Upper-right corner. \param xMin [in] Minimum X-coordinate. \param xMax [in] Maximum X-coordinate. \param yMin [in] Minimum Y-coordinate. \param yMax [in] Maximum Y-coordinate. */ OdGsDCRect() { } OdGsDCRect(const OdGsDCPoint& minPoint, const OdGsDCPoint& maxPoint) : m_min(minPoint), m_max(maxPoint) { } OdGsDCRect(long xMin, long xMax, long yMin, long yMax) : m_min(xMin,yMin), m_max(xMax,yMax) { } OdGsDCRect(NullFlag) { set_null(); } OdGsDCRect & operator=(const OdGsDCRect& dcRect) { m_min = dcRect.m_min; m_max = dcRect.m_max; return*this; } void operator|=(const OdGsDCRect& dcRect) { if(m_min.x > dcRect.m_min.x) m_min.x = dcRect.m_min.x; if(m_max.x < dcRect.m_max.x) m_max.x = dcRect.m_max.x; if(m_min.y > dcRect.m_min.y) m_min.y = dcRect.m_min.y; if(m_max.y < dcRect.m_max.y) m_max.y = dcRect.m_max.y; } void operator&=(const OdGsDCRect& dcRect) { intersectWith(dcRect); } bool operator==(const OdGsDCRect& dcRect) const { return m_min == dcRect.m_min && m_max == dcRect.m_max; } bool operator!=(const OdGsDCRect& dcRect) const { return !(*this == dcRect); } /** \details Sets this rectangle object to the null rectangle. */ void set_null() { m_min = OdGsDCPoint::Maximum; m_max = OdGsDCPoint::Minimum; } /** \details Returns true if and only if this rectangle object is the null rectangle. */ bool is_null() const { ODA_ASSERT((m_min.x <= m_max.x && m_min.y <= m_max.y) || (m_min == OdGsDCPoint::Maximum && m_max == OdGsDCPoint::Minimum)); return m_min.x > m_max.x; } /** \details Returns true if and only if this rectangle object is inside the specified rectangle object. \param dcRect [in] Any display coordinate rectangle. \remarks A coincident edge is considered inside. */ bool within(const OdGsDCRect& dcRect) const { ODA_ASSERT(!is_null()); return m_min.x >= dcRect.m_min.x && m_min.y >= dcRect.m_min.y && m_max.x <= dcRect.m_max.x && m_max.y <= dcRect.m_max.y; } void offset(long x, long y) { m_min.x += x; m_max.x += x; m_min.y += y; m_max.y += y; } void intersectWith(const OdGsDCRect& dcRect, bool bValidate = true) { if(m_min.x < dcRect.m_min.x) m_min.x = dcRect.m_min.x; if(m_max.x > dcRect.m_max.x) m_max.x = dcRect.m_max.x; if(m_min.y < dcRect.m_min.y) m_min.y = dcRect.m_min.y; if(m_max.y > dcRect.m_max.y) m_max.y = dcRect.m_max.y; if(bValidate && (m_min.x > m_max.x || m_min.y > m_max.y)) *this = Null; } void normalize() { long tmp; if (m_max.x < m_min.x) tmp = m_max.x, m_max.x = m_min.x, m_min.x = tmp; if (m_max.y < m_min.y) tmp = m_max.y, m_max.y = m_min.y, m_min.y = tmp; } OdGsDCPoint m_min; OdGsDCPoint m_max; }; /** \details This class represents 2D device coordinate rectangles. Library: TD_Gs \remarks Device coordinates are measured in pixels from the lower-left corner of the device. \sa Coordinate Systems. */ class OdGsDCRectDouble { public: /** \param minPoint [in] Lower-left corner. \param maxPoint [in] Upper-right corner. \param xMin [in] Minimum X-coordinate. \param xMax [in] Maximum X-coordinate. \param yMin [in] Minimum Y-coordinate. \param yMax [in] Maximum Y-coordinate. */ OdGsDCRectDouble() { } OdGsDCRectDouble(const OdGePoint2d& minPoint, const OdGePoint2d& maxPoint) : m_min(minPoint), m_max(maxPoint) { } OdGsDCRectDouble(double xMin, double xMax, double yMin, double yMax) : m_min(xMin,yMin), m_max(xMax,yMax) { } explicit OdGsDCRectDouble(const OdGsDCRect& rc) : m_min(rc.m_min.x, rc.m_min.y), m_max(rc.m_max.x,rc.m_max.y) { } OdGsDCRectDouble& operator=(const OdGsDCRect& dcRect) { m_min.x = dcRect.m_min.x; m_min.y = dcRect.m_min.y; m_max.x = dcRect.m_max.x; m_max.y = dcRect.m_max.y; return *this; } bool operator==(const OdGsDCRectDouble& dcRect) const { return m_min == dcRect.m_min && m_max == dcRect.m_max; } bool operator!=(const OdGsDCRectDouble& dcRect) const { return !(*this == dcRect); } OdGsDCRect round() const { return OdGsDCRect(OdGsDCRect( OdTruncateToLong(m_min.x), OdTruncateToLong(m_max.x), OdTruncateToLong(m_min.y), OdTruncateToLong(m_max.y))); } OdGePoint2d m_min; OdGePoint2d m_max; }; typedef void* OdGsWindowingSystemID; // i.e. -- HWND enum EMetafilePlayMode { kMfDisplay, //play for visualization. Default, valid for all metafile types. //Following modes are valid only if metafile can be played as OdGiConveyorGeometry //( if useMetafileAsGeometry() returns true). kMfSelect, //play as geometry for selection kMfNested, //play data of nested metafiles only kMfExtents //play as geometry for extents calculation }; // Negative GETBIT #ifndef GETBITNEG #define GETBITNEG(flags, bit) (((flags) & (bit)) != (bit)) #endif #include "TD_PackPop.h" #endif // __GSDEFS_H_INCLUDED_