1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file.
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_WIN_SCOPED_GDI_OBJECT_H_
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <windows.h>
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/scoped_generic.h"
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace win {
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
15cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkonamespace internal {
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
17cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotemplate <class T>
18cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkostruct ScopedGDIObjectTraits {
19cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  static T InvalidValue() { return nullptr; }
20cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  static void Free(T object) { DeleteObject(object); }
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// An explicit specialization for HICON because we have to call DestroyIcon()
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// instead of DeleteObject() for HICON.
25cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotemplate <>
26cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkovoid inline ScopedGDIObjectTraits<HICON>::Free(HICON icon) {
27cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  DestroyIcon(icon);
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
30cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}  // namespace internal
31cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
32cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko// Like ScopedHandle but for GDI objects.
33cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkotemplate <class T>
34cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkousing ScopedGDIObject = ScopedGeneric<T, internal::ScopedGDIObjectTraits<T>>;
35cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Typedefs for some common use cases.
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HBITMAP> ScopedBitmap;
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HRGN> ScopedRegion;
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HFONT> ScopedHFONT;
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattypedef ScopedGDIObject<HICON> ScopedHICON;
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace win
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif  // BASE_WIN_SCOPED_GDI_OBJECT_H_
46