1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
86a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com#ifndef SkSize_DEFINED
96a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com#define SkSize_DEFINED
106a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
11db3f0fda6899b11e3213c1213165f2d22ad0fb83reed@google.com#include "SkScalar.h"
12db3f0fda6899b11e3213c1213165f2d22ad0fb83reed@google.com
136a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.comtemplate <typename T> struct SkTSize {
146a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    T fWidth;
156a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    T fHeight;
166a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
1760bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com    static SkTSize Make(T w, T h) {
1860bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com        SkTSize s;
1960bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com        s.fWidth = w;
2060bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com        s.fHeight = h;
2160bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com        return s;
2260bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com    }
2360bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.com
246a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    void set(T w, T h) {
256a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        fWidth = w;
266a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        fHeight = h;
276a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
286a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
29f76bacff7f66724072c67edb185abf9e3add11a0reed@android.com    /** Returns true iff fWidth == 0 && fHeight == 0
30f76bacff7f66724072c67edb185abf9e3add11a0reed@android.com     */
31f76bacff7f66724072c67edb185abf9e3add11a0reed@android.com    bool isZero() const {
32f76bacff7f66724072c67edb185abf9e3add11a0reed@android.com        return 0 == fWidth && 0 == fHeight;
33f76bacff7f66724072c67edb185abf9e3add11a0reed@android.com    }
34f76bacff7f66724072c67edb185abf9e3add11a0reed@android.com
356a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    /** Returns true if either widht or height are <= 0 */
366a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    bool isEmpty() const {
376a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        return fWidth <= 0 || fHeight <= 0;
386a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
39fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
406a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    /** Set the width and height to 0 */
416a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    void setEmpty() {
426a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        fWidth = fHeight = 0;
436a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
44fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
45fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    T width() const { return fWidth; }
46fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com    T height() const { return fHeight; }
47fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
486a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    /** If width or height is < 0, it is set to 0 */
496a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    void clampNegToZero() {
506a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        if (fWidth < 0) {
516a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com            fWidth = 0;
526a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        }
536a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        if (fHeight < 0) {
546a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com            fHeight = 0;
556a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        }
566a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
57fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
58f16c899a74a82241a690d08250698cbb8c2609dfreed@android.com    bool equals(T w, T h) const {
59f16c899a74a82241a690d08250698cbb8c2609dfreed@android.com        return fWidth == w && fHeight == h;
60f16c899a74a82241a690d08250698cbb8c2609dfreed@android.com    }
616a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com};
626a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
636a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.comtemplate <typename T>
646a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.comstatic inline bool operator==(const SkTSize<T>& a, const SkTSize<T>& b) {
656a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    return a.fWidth == b.fWidth && a.fHeight == b.fHeight;
666a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com}
676a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
686a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.comtemplate <typename T>
696a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.comstatic inline bool operator!=(const SkTSize<T>& a, const SkTSize<T>& b) {
706a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    return !(a == b);
716a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com}
726a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
736a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com///////////////////////////////////////////////////////////////////////////////
746a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
7560bc6d5cb0af7cef0e49cc35f28f36f89b10853ereed@android.comtypedef SkTSize<int32_t> SkISize;
766a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
776a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.comstruct SkSize : public SkTSize<SkScalar> {
78c83d422b639a1c186d8e40e08ac895deef60410freed@android.com    static SkSize Make(SkScalar w, SkScalar h) {
79c83d422b639a1c186d8e40e08ac895deef60410freed@android.com        SkSize s;
80c83d422b639a1c186d8e40e08ac895deef60410freed@android.com        s.fWidth = w;
81c83d422b639a1c186d8e40e08ac895deef60410freed@android.com        s.fHeight = h;
82c83d422b639a1c186d8e40e08ac895deef60410freed@android.com        return s;
83c83d422b639a1c186d8e40e08ac895deef60410freed@android.com    }
84fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
85fbfcd5602128ec010c82cb733c9cdc0a3254f9f3rmistry@google.com
866a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    SkSize& operator=(const SkISize& src) {
876a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        this->set(SkIntToScalar(src.fWidth), SkIntToScalar(src.fHeight));
886a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        return *this;
896a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
906a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
91f59799139bacd300bf5251a1ca4e6b2ad3196457reed@android.com    SkISize toRound() const {
926a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        SkISize s;
93e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        s.set(SkScalarRoundToInt(fWidth), SkScalarRoundToInt(fHeight));
946a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        return s;
956a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
96f59799139bacd300bf5251a1ca4e6b2ad3196457reed@android.com
97f59799139bacd300bf5251a1ca4e6b2ad3196457reed@android.com    SkISize toCeil() const {
986a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        SkISize s;
99e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        s.set(SkScalarCeilToInt(fWidth), SkScalarCeilToInt(fHeight));
1006a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        return s;
1016a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
1026a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
103f59799139bacd300bf5251a1ca4e6b2ad3196457reed@android.com    SkISize toFloor() const {
1046a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        SkISize s;
105e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com        s.set(SkScalarFloorToInt(fWidth), SkScalarFloorToInt(fHeight));
1066a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com        return s;
1076a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com    }
1086a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com};
1096a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com
1106a5a2667a7cb2a2ccbb8cc19fe1d5e9ee28bb1d3reed@android.com#endif
111