|  | // Copyright (c) 2012 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_HDC_H_ | 
|  | #define BASE_WIN_SCOPED_HDC_H_ | 
|  |  | 
|  | #include <windows.h> | 
|  |  | 
|  | #include "base/debug/gdi_debug_util_win.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/win/scoped_handle.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | // Like ScopedHandle but for HDC.  Only use this on HDCs returned from | 
|  | // GetDC. | 
|  | class ScopedGetDC { | 
|  | public: | 
|  | explicit ScopedGetDC(HWND hwnd) | 
|  | : hwnd_(hwnd), | 
|  | hdc_(GetDC(hwnd)) { | 
|  | if (hwnd_) { | 
|  | DCHECK(IsWindow(hwnd_)); | 
|  | DCHECK(hdc_); | 
|  | } else { | 
|  | // If GetDC(NULL) returns NULL, something really bad has happened, like | 
|  | // GDI handle exhaustion.  In this case Chrome is going to behave badly no | 
|  | // matter what, so we may as well just force a crash now. | 
|  | if (!hdc_) | 
|  | base::debug::CollectGDIUsageAndDie(); | 
|  | } | 
|  | } | 
|  |  | 
|  | ~ScopedGetDC() { | 
|  | if (hdc_) | 
|  | ReleaseDC(hwnd_, hdc_); | 
|  | } | 
|  |  | 
|  | operator HDC() { return hdc_; } | 
|  |  | 
|  | private: | 
|  | HWND hwnd_; | 
|  | HDC hdc_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ScopedGetDC); | 
|  | }; | 
|  |  | 
|  | // Like ScopedHandle but for HDC.  Only use this on HDCs returned from | 
|  | // CreateCompatibleDC, CreateDC and CreateIC. | 
|  | class CreateDCTraits { | 
|  | public: | 
|  | typedef HDC Handle; | 
|  |  | 
|  | static bool CloseHandle(HDC handle) { | 
|  | return ::DeleteDC(handle) != FALSE; | 
|  | } | 
|  |  | 
|  | static bool IsHandleValid(HDC handle) { | 
|  | return handle != NULL; | 
|  | } | 
|  |  | 
|  | static HDC NullHandle() { | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | private: | 
|  | DISALLOW_IMPLICIT_CONSTRUCTORS(CreateDCTraits); | 
|  | }; | 
|  |  | 
|  | typedef GenericScopedHandle<CreateDCTraits, DummyVerifierTraits> ScopedCreateDC; | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_WIN_SCOPED_HDC_H_ |