1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
// Copyright (c) 2006-2008 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 CHROME_BROWSER_RENDERER_HOST_BACKING_STORE_H_
#define CHROME_BROWSER_RENDERER_HOST_BACKING_STORE_H_
#include "base/basictypes.h"
#include "base/gfx/rect.h"
#include "base/gfx/size.h"
#include "base/process.h"
#include "build/build_config.h"
#include "chrome/common/mru_cache.h"
#if defined(OS_WIN)
#include <windows.h>
#endif
class RenderWidgetHost;
// BackingStore ----------------------------------------------------------------
// Represents a backing store for the pixels in a RenderWidgetHost.
class BackingStore {
public:
BackingStore(const gfx::Size& size);
~BackingStore();
const gfx::Size& size() { return size_; }
#if defined(OS_WIN)
HDC hdc() { return hdc_; }
#endif
// Paints the bitmap from the renderer onto the backing store.
// TODO(port): The HANDLE is a shared section on Windows. Abstract this.
bool PaintRect(base::ProcessHandle process,
HANDLE bitmap_section,
const gfx::Rect& bitmap_rect);
// Scrolls the given rect in the backing store, replacing the given region
// identified by |bitmap_rect| by the bitmap in the file identified by the
// given file handle.
// TODO(port): The HANDLE is a shared section on Windows. Abstract this.
void ScrollRect(base::ProcessHandle process,
HANDLE bitmap, const gfx::Rect& bitmap_rect,
int dx, int dy,
const gfx::Rect& clip_rect,
const gfx::Size& view_size);
private:
// The size of the backing store.
gfx::Size size_;
#if defined(OS_WIN)
// Creates a dib conforming to the height/width/section parameters passed
// in. The use_os_color_depth parameter controls whether we use the color
// depth to create an appropriate dib or not.
HANDLE CreateDIB(HDC dc,
int width, int height,
bool use_os_color_depth,
HANDLE section);
// The backing store dc.
HDC hdc_;
// Handle to the backing store dib.
HANDLE backing_store_dib_;
// Handle to the original bitmap in the dc.
HANDLE original_bitmap_;
#endif
DISALLOW_COPY_AND_ASSIGN(BackingStore);
};
// BackingStoreManager ---------------------------------------------------------
// This class manages backing stores in the browsr. Every RenderWidgetHost is
// associated with a backing store which it requests from this class. The
// hosts don't maintain any references to the backing stores. These backing
// stores are maintained in a cache which can be trimmed as needed.
class BackingStoreManager {
public:
// Returns a backing store which matches the desired dimensions.
//
// backing_store_rect
// The desired backing store dimensions.
// Returns a pointer to the backing store on success, NULL on failure.
static BackingStore* GetBackingStore(RenderWidgetHost* host,
const gfx::Size& desired_size);
// Returns a backing store which is fully ready for consumption, i.e. the
// bitmap from the renderer has been copied into the backing store dc, or the
// bitmap in the backing store dc references the renderer bitmap.
//
// backing_store_rect
// The desired backing store dimensions.
// process_handle
// The renderer process handle.
// bitmap_section
// The bitmap section from the renderer.
// bitmap_rect
// The rect to be painted into the backing store
// needs_full_paint
// Set if we need to send out a request to paint the view
// to the renderer.
// TODO(port): The HANDLE is a shared section on Windows. Abstract this.
static BackingStore* PrepareBackingStore(RenderWidgetHost* host,
const gfx::Rect& backing_store_rect,
base::ProcessHandle process_handle,
HANDLE bitmap_section,
const gfx::Rect& bitmap_rect,
bool* needs_full_paint);
// Returns a matching backing store for the host.
// Returns NULL if we fail to find one.
static BackingStore* Lookup(RenderWidgetHost* host);
// Removes the backing store for the host.
static void RemoveBackingStore(RenderWidgetHost* host);
private:
// Not intended for instantiation.
BackingStoreManager() {}
DISALLOW_COPY_AND_ASSIGN(BackingStoreManager);
};
#endif // CHROME_BROWSER_RENDERER_HOST_BACKING_STORE_H_
|