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
3// found in the LICENSE file.
4
5#ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_
6#define BASE_WIN_SCOPED_GDI_OBJECT_H_
7
8#include <windows.h>
9
10#include "base/basictypes.h"
11#include "base/logging.h"
12
13namespace base {
14namespace win {
15
16// Like ScopedHandle but for GDI objects.
17template<class T>
18class ScopedGDIObject {
19 public:
20  ScopedGDIObject() : object_(NULL) {}
21  explicit ScopedGDIObject(T object) : object_(object) {}
22
23  ~ScopedGDIObject() {
24    Close();
25  }
26
27  T Get() {
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};
59
60// An explicit specialization for HICON because we have to call DestroyIcon()
61// instead of DeleteObject() for HICON.
62template<>
63void inline ScopedGDIObject<HICON>::Close() {
64  if (object_)
65    DestroyIcon(object_);
66}
67
68// Typedefs for some common use cases.
69typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
70typedef ScopedGDIObject<HRGN> ScopedRegion;
71typedef ScopedGDIObject<HFONT> ScopedHFONT;
72typedef ScopedGDIObject<HICON> ScopedHICON;
73
74}  // namespace win
75}  // namespace base
76
77#endif  // BASE_WIN_SCOPED_GDI_OBJECT_H_
78