1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_WIN_SCOPED_HDC_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_WIN_SCOPED_HDC_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <windows.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/check.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/debug/gdi_debug_util_win.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h" 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker namespace base { 15*6777b538SAndroid Build Coastguard Worker namespace win { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker // Like ScopedHandle but for HDC. Only use this on HDCs returned from 18*6777b538SAndroid Build Coastguard Worker // GetDC. 19*6777b538SAndroid Build Coastguard Worker class ScopedGetDC { 20*6777b538SAndroid Build Coastguard Worker public: ScopedGetDC(HWND hwnd)21*6777b538SAndroid Build Coastguard Worker explicit ScopedGetDC(HWND hwnd) : hwnd_(hwnd), hdc_(GetDC(hwnd)) { 22*6777b538SAndroid Build Coastguard Worker if (hwnd_) { 23*6777b538SAndroid Build Coastguard Worker DCHECK(IsWindow(hwnd_)); 24*6777b538SAndroid Build Coastguard Worker DCHECK(hdc_); 25*6777b538SAndroid Build Coastguard Worker } else { 26*6777b538SAndroid Build Coastguard Worker // If GetDC(NULL) returns NULL, something really bad has happened, like 27*6777b538SAndroid Build Coastguard Worker // GDI handle exhaustion. In this case Chrome is going to behave badly no 28*6777b538SAndroid Build Coastguard Worker // matter what, so we may as well just force a crash now. 29*6777b538SAndroid Build Coastguard Worker if (!hdc_) 30*6777b538SAndroid Build Coastguard Worker base::debug::CollectGDIUsageAndDie(); 31*6777b538SAndroid Build Coastguard Worker } 32*6777b538SAndroid Build Coastguard Worker } 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker ScopedGetDC(const ScopedGetDC&) = delete; 35*6777b538SAndroid Build Coastguard Worker ScopedGetDC& operator=(const ScopedGetDC&) = delete; 36*6777b538SAndroid Build Coastguard Worker ~ScopedGetDC()37*6777b538SAndroid Build Coastguard Worker ~ScopedGetDC() { 38*6777b538SAndroid Build Coastguard Worker if (hdc_) 39*6777b538SAndroid Build Coastguard Worker ReleaseDC(hwnd_, hdc_); 40*6777b538SAndroid Build Coastguard Worker } 41*6777b538SAndroid Build Coastguard Worker HDC()42*6777b538SAndroid Build Coastguard Worker operator HDC() { return hdc_; } 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker private: 45*6777b538SAndroid Build Coastguard Worker HWND hwnd_; 46*6777b538SAndroid Build Coastguard Worker HDC hdc_; 47*6777b538SAndroid Build Coastguard Worker }; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker // Like ScopedHandle but for HDC. Only use this on HDCs returned from 50*6777b538SAndroid Build Coastguard Worker // CreateCompatibleDC, CreateDC and CreateIC. 51*6777b538SAndroid Build Coastguard Worker class CreateDCTraits { 52*6777b538SAndroid Build Coastguard Worker public: 53*6777b538SAndroid Build Coastguard Worker typedef HDC Handle; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker CreateDCTraits() = delete; 56*6777b538SAndroid Build Coastguard Worker CreateDCTraits(const CreateDCTraits&) = delete; 57*6777b538SAndroid Build Coastguard Worker CreateDCTraits& operator=(const CreateDCTraits&) = delete; 58*6777b538SAndroid Build Coastguard Worker CloseHandle(HDC handle)59*6777b538SAndroid Build Coastguard Worker static bool CloseHandle(HDC handle) { return ::DeleteDC(handle) != FALSE; } 60*6777b538SAndroid Build Coastguard Worker IsHandleValid(HDC handle)61*6777b538SAndroid Build Coastguard Worker static bool IsHandleValid(HDC handle) { return handle != NULL; } 62*6777b538SAndroid Build Coastguard Worker NullHandle()63*6777b538SAndroid Build Coastguard Worker static HDC NullHandle() { return NULL; } 64*6777b538SAndroid Build Coastguard Worker }; 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker typedef GenericScopedHandle<CreateDCTraits, DummyVerifierTraits> ScopedCreateDC; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker } // namespace win 69*6777b538SAndroid Build Coastguard Worker } // namespace base 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker #endif // BASE_WIN_SCOPED_HDC_H_ 72