OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_ | 5 #ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_ |
6 #define BASE_WIN_SCOPED_GDI_OBJECT_H_ | 6 #define BASE_WIN_SCOPED_GDI_OBJECT_H_ |
7 | 7 |
8 #include <windows.h> | 8 #include <windows.h> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/scoped_generic.h" |
12 | 13 |
13 namespace base { | 14 namespace base { |
14 namespace win { | 15 namespace win { |
15 | 16 |
16 // Like ScopedHandle but for GDI objects. | 17 namespace internal { |
17 template<class T> | |
18 class ScopedGDIObject { | |
19 public: | |
20 ScopedGDIObject() : object_(NULL) {} | |
21 explicit ScopedGDIObject(T object) : object_(object) {} | |
22 | 18 |
23 ~ScopedGDIObject() { | 19 template <class T> |
24 Close(); | 20 struct ScopedGDIObjectTraits { |
25 } | 21 static T InvalidValue() { return nullptr; } |
26 | 22 |
27 T Get() { | 23 static void Free(T object) { DeleteObject(object); } |
28 return object_; | |
29 } | |
30 | |
31 void Set(T object) { | |
32 if (object_ && object != object_) | |
33 Close(); | |
34 object_ = object; | |
35 } | |
36 | |
37 ScopedGDIObject& operator=(T object) { | |
38 Set(object); | |
39 return *this; | |
40 } | |
41 | |
42 T release() { | |
43 T object = object_; | |
44 object_ = NULL; | |
45 return object; | |
46 } | |
47 | |
48 operator T() { return object_; } | |
49 | |
50 private: | |
51 void Close() { | |
52 if (object_) | |
53 DeleteObject(object_); | |
54 } | |
55 | |
56 T object_; | |
57 DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject); | |
58 }; | 24 }; |
59 | 25 |
60 // An explicit specialization for HICON because we have to call DestroyIcon() | 26 // An explicit specialization for HICON because we have to call DestroyIcon() |
61 // instead of DeleteObject() for HICON. | 27 // instead of DeleteObject() for HICON. |
62 template<> | 28 template <> |
63 void inline ScopedGDIObject<HICON>::Close() { | 29 void inline ScopedGDIObjectTraits<HICON>::Free(HICON icon) { |
64 if (object_) | 30 DestroyIcon(icon); |
65 DestroyIcon(object_); | |
66 } | 31 } |
67 | 32 |
| 33 } // namespace internal |
| 34 |
| 35 // Like ScopedHandle but for GDI objects. |
| 36 template <class T> |
| 37 using ScopedGDIObject = ScopedGeneric<T, internal::ScopedGDIObjectTraits<T>>; |
| 38 |
68 // Typedefs for some common use cases. | 39 // Typedefs for some common use cases. |
69 typedef ScopedGDIObject<HBITMAP> ScopedBitmap; | 40 typedef ScopedGDIObject<HBITMAP> ScopedBitmap; |
70 typedef ScopedGDIObject<HRGN> ScopedRegion; | 41 typedef ScopedGDIObject<HRGN> ScopedRegion; |
71 typedef ScopedGDIObject<HFONT> ScopedHFONT; | 42 typedef ScopedGDIObject<HFONT> ScopedHFONT; |
72 typedef ScopedGDIObject<HICON> ScopedHICON; | 43 typedef ScopedGDIObject<HICON> ScopedHICON; |
73 | 44 |
74 } // namespace win | 45 } // namespace win |
75 } // namespace base | 46 } // namespace base |
76 | 47 |
77 #endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ | 48 #endif // BASE_WIN_SCOPED_GDI_OBJECT_H_ |
OLD | NEW |