Home | History | Annotate | Download | only in core
      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 
     13 template <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 
     63 template <typename T>
     64 static inline bool operator==(const SkTSize<T>& a, const SkTSize<T>& b) {
     65     return a.fWidth == b.fWidth && a.fHeight == b.fHeight;
     66 }
     67 
     68 template <typename T>
     69 static inline bool operator!=(const SkTSize<T>& a, const SkTSize<T>& b) {
     70     return !(a == b);
     71 }
     72 
     73 ///////////////////////////////////////////////////////////////////////////////
     74 
     75 typedef SkTSize<int32_t> SkISize;
     76 
     77 #include "SkScalar.h"
     78 
     79 struct 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