1 2/* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10#ifndef SkSize_DEFINED 11#define SkSize_DEFINED 12 13template <typename T> struct SkTSize { 14 T fWidth; 15 T fHeight; 16 17 static SkTSize Make(T w, T h) { 18 SkTSize s; 19 s.fWidth = w; 20 s.fHeight = h; 21 return s; 22 } 23 24 void set(T w, T h) { 25 fWidth = w; 26 fHeight = h; 27 } 28 29 /** Returns true iff fWidth == 0 && fHeight == 0 30 */ 31 bool isZero() const { 32 return 0 == fWidth && 0 == fHeight; 33 } 34 35 /** Returns true if either widht or height are <= 0 */ 36 bool isEmpty() const { 37 return fWidth <= 0 || fHeight <= 0; 38 } 39 40 /** Set the width and height to 0 */ 41 void setEmpty() { 42 fWidth = fHeight = 0; 43 } 44 45 T width() const { return fWidth; } 46 T height() const { return fHeight; } 47 48 /** If width or height is < 0, it is set to 0 */ 49 void clampNegToZero() { 50 if (fWidth < 0) { 51 fWidth = 0; 52 } 53 if (fHeight < 0) { 54 fHeight = 0; 55 } 56 } 57 58 bool equals(T w, T h) const { 59 return fWidth == w && fHeight == h; 60 } 61}; 62 63template <typename T> 64static inline bool operator==(const SkTSize<T>& a, const SkTSize<T>& b) { 65 return a.fWidth == b.fWidth && a.fHeight == b.fHeight; 66} 67 68template <typename T> 69static inline bool operator!=(const SkTSize<T>& a, const SkTSize<T>& b) { 70 return !(a == b); 71} 72 73/////////////////////////////////////////////////////////////////////////////// 74 75typedef SkTSize<int32_t> SkISize; 76 77#include "SkScalar.h" 78 79struct SkSize : public SkTSize<SkScalar> { 80 static SkSize Make(SkScalar w, SkScalar h) { 81 SkSize s; 82 s.fWidth = w; 83 s.fHeight = h; 84 return s; 85 } 86 87 88 SkSize& operator=(const SkISize& src) { 89 this->set(SkIntToScalar(src.fWidth), SkIntToScalar(src.fHeight)); 90 return *this; 91 } 92 93 SkISize toRound() const { 94 SkISize s; 95 s.set(SkScalarRound(fWidth), SkScalarRound(fHeight)); 96 return s; 97 } 98 99 SkISize toCeil() const { 100 SkISize s; 101 s.set(SkScalarCeil(fWidth), SkScalarCeil(fHeight)); 102 return s; 103 } 104 105 SkISize toFloor() const { 106 SkISize s; 107 s.set(SkScalarFloor(fWidth), SkScalarFloor(fHeight)); 108 return s; 109 } 110}; 111 112#endif 113