xref: /aosp_15_r20/external/cronet/base/win/scoped_hdc.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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