|  | // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_WIN_SCOPED_GDI_OBJECT_H_ | 
|  | #define BASE_WIN_SCOPED_GDI_OBJECT_H_ | 
|  |  | 
|  | #include <windows.h> | 
|  |  | 
|  | #include "base/scoped_generic.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | namespace internal { | 
|  |  | 
|  | template <class T> | 
|  | struct ScopedGDIObjectTraits { | 
|  | static T InvalidValue() { return nullptr; } | 
|  | static void Free(T object) { DeleteObject(object); } | 
|  | }; | 
|  |  | 
|  | // An explicit specialization for HICON because we have to call DestroyIcon() | 
|  | // instead of DeleteObject() for HICON. | 
|  | template <> | 
|  | void inline ScopedGDIObjectTraits<HICON>::Free(HICON icon) { | 
|  | DestroyIcon(icon); | 
|  | } | 
|  |  | 
|  | }  // namespace internal | 
|  |  | 
|  | // Like ScopedHandle but for GDI objects. | 
|  | template <class T> | 
|  | using ScopedGDIObject = ScopedGeneric<T, internal::ScopedGDIObjectTraits<T>>; | 
|  |  | 
|  | // Typedefs for some common use cases. | 
|  | typedef ScopedGDIObject<HBITMAP> ScopedBitmap; | 
|  | typedef ScopedGDIObject<HRGN> ScopedRegion; | 
|  | typedef ScopedGDIObject<HFONT> ScopedHFONT; | 
|  | typedef ScopedGDIObject<HICON> ScopedHICON; | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_WIN_SCOPED_GDI_OBJECT_H_ |