/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkSize_DEFINED #define SkSize_DEFINED #include "SkScalar.h" template <typename T> struct SkTSize { T fWidth; T fHeight; static SkTSize Make(T w, T h) { SkTSize s; s.fWidth = w; s.fHeight = h; return s; } void set(T w, T h) { fWidth = w; fHeight = h; } /** Returns true iff fWidth == 0 && fHeight == 0 */ bool isZero() const { return 0 == fWidth && 0 == fHeight; } /** Returns true if either widht or height are <= 0 */ bool isEmpty() const { return fWidth <= 0 || fHeight <= 0; } /** Set the width and height to 0 */ void setEmpty() { fWidth = fHeight = 0; } T width() const { return fWidth; } T height() const { return fHeight; } /** If width or height is < 0, it is set to 0 */ void clampNegToZero() { if (fWidth < 0) { fWidth = 0; } if (fHeight < 0) { fHeight = 0; } } bool equals(T w, T h) const { return fWidth == w && fHeight == h; } }; template <typename T> static inline bool operator==(const SkTSize<T>& a, const SkTSize<T>& b) { return a.fWidth == b.fWidth && a.fHeight == b.fHeight; } template <typename T> static inline bool operator!=(const SkTSize<T>& a, const SkTSize<T>& b) { return !(a == b); } /////////////////////////////////////////////////////////////////////////////// typedef SkTSize<int32_t> SkISize; struct SkSize : public SkTSize<SkScalar> { static SkSize Make(SkScalar w, SkScalar h) { SkSize s; s.fWidth = w; s.fHeight = h; return s; } SkSize& operator=(const SkISize& src) { this->set(SkIntToScalar(src.fWidth), SkIntToScalar(src.fHeight)); return *this; } SkISize toRound() const { SkISize s; s.set(SkScalarRoundToInt(fWidth), SkScalarRoundToInt(fHeight)); return s; } SkISize toCeil() const { SkISize s; s.set(SkScalarCeilToInt(fWidth), SkScalarCeilToInt(fHeight)); return s; } SkISize toFloor() const { SkISize s; s.set(SkScalarFloorToInt(fWidth), SkScalarFloorToInt(fHeight)); return s; } }; #endif