Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Unified Diff: chrome/browser/renderer_host/backing_store_win.cc

Issue 21516: Some cleanup of backing_store_win.cc... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/renderer_host/backing_store.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/renderer_host/backing_store_win.cc
===================================================================
--- chrome/browser/renderer_host/backing_store_win.cc (revision 10772)
+++ chrome/browser/renderer_host/backing_store_win.cc (working copy)
@@ -8,6 +8,21 @@
#include "chrome/browser/renderer_host/render_widget_host.h"
#include "chrome/common/transport_dib.h"
+namespace {
+
+// Creates a dib conforming to the height/width/section parameters passed in.
+HANDLE CreateDIB(HDC dc, int width, int height, int color_depth) {
+ BITMAPINFOHEADER hdr;
+ gfx::CreateBitmapHeaderWithColorDepth(width, height, color_depth, &hdr);
+ void* data = NULL;
+ HANDLE dib = CreateDIBSection(dc, reinterpret_cast<BITMAPINFO*>(&hdr),
+ 0, &data, NULL, 0);
+ DCHECK(data);
+ return dib;
+}
+
+} // namespace
+
// BackingStore (Windows) ------------------------------------------------------
BackingStore::BackingStore(const gfx::Size& size)
@@ -15,53 +30,56 @@
backing_store_dib_(NULL),
original_bitmap_(NULL) {
HDC screen_dc = ::GetDC(NULL);
+ color_depth_ = ::GetDeviceCaps(screen_dc, BITSPIXEL);
+ // Color depths less than 16 bpp require a palette to be specified. Instead,
+ // we specify the desired color depth as 16 which lets the OS to come up
+ // with an approximation.
+ if (color_depth_ < 16)
+ color_depth_ = 16;
hdc_ = CreateCompatibleDC(screen_dc);
ReleaseDC(NULL, screen_dc);
}
BackingStore::~BackingStore() {
DCHECK(hdc_);
-
- DeleteDC(hdc_);
-
+ if (original_bitmap_) {
+ SelectObject(hdc_, original_bitmap_);
+ }
if (backing_store_dib_) {
DeleteObject(backing_store_dib_);
backing_store_dib_ = NULL;
}
+ DeleteDC(hdc_);
}
void BackingStore::PaintRect(base::ProcessHandle process,
TransportDIB* bitmap,
const gfx::Rect& bitmap_rect) {
if (!backing_store_dib_) {
- backing_store_dib_ = CreateDIB(hdc_, size_.width(), size_.height(), true,
- NULL);
- DCHECK(backing_store_dib_ != NULL);
+ backing_store_dib_ = CreateDIB(hdc_, size_.width(),
+ size_.height(), color_depth_);
+ if (!backing_store_dib_) {
+ NOTREACHED();
+ return;
+ }
original_bitmap_ = SelectObject(hdc_, backing_store_dib_);
}
- // TODO(darin): protect against integer overflow
- DWORD size = 4 * bitmap_rect.width() * bitmap_rect.height();
-
- // These values are shared with gfx::PlatformDevice
BITMAPINFOHEADER hdr;
gfx::CreateBitmapHeader(bitmap_rect.width(), bitmap_rect.height(), &hdr);
// Account for a bitmap_rect that exceeds the bounds of our view
gfx::Rect view_rect(0, 0, size_.width(), size_.height());
gfx::Rect paint_rect = view_rect.Intersect(bitmap_rect);
- StretchDIBits(hdc_,
- paint_rect.x(),
- paint_rect.y(),
- paint_rect.width(),
- paint_rect.height(),
- 0, 0, // source x,y
- paint_rect.width(),
- paint_rect.height(),
- bitmap->memory(),
- reinterpret_cast<BITMAPINFO*>(&hdr),
- DIB_RGB_COLORS,
- SRCCOPY);
+ int rv = StretchDIBits(hdc_,
+ paint_rect.x(), paint_rect.y(),
+ paint_rect.width(), paint_rect.height(),
+ 0, 0, // source x,y.
+ paint_rect.width(), paint_rect.height(),
+ bitmap->memory(),
+ reinterpret_cast<BITMAPINFO*>(&hdr),
+ DIB_RGB_COLORS, SRCCOPY);
+ DCHECK(rv != GDI_ERROR);
}
void BackingStore::ScrollRect(base::ProcessHandle process,
@@ -81,32 +99,3 @@
PaintRect(process, bitmap, bitmap_rect);
}
-
-HANDLE BackingStore::CreateDIB(HDC dc,
- int width, int height,
- bool use_system_color_depth,
- HANDLE section) {
- BITMAPINFOHEADER hdr;
-
- if (use_system_color_depth) {
- HDC screen_dc = ::GetDC(NULL);
- int color_depth = GetDeviceCaps(screen_dc, BITSPIXEL);
- ::ReleaseDC(NULL, screen_dc);
-
- // Color depths less than 16 bpp require a palette to be specified in the
- // BITMAPINFO structure passed to CreateDIBSection. Instead of creating
- // the palette, we specify the desired color depth as 16 which allows the
- // OS to come up with an approximation. Tested this with 8bpp.
- if (color_depth < 16)
- color_depth = 16;
-
- gfx::CreateBitmapHeaderWithColorDepth(width, height, color_depth, &hdr);
- } else {
- gfx::CreateBitmapHeader(width, height, &hdr);
- }
- void* data = NULL;
- HANDLE dib =
- CreateDIBSection(hdc_, reinterpret_cast<BITMAPINFO*>(&hdr),
- 0, &data, section, 0);
- return dib;
-}
« no previous file with comments | « chrome/browser/renderer_host/backing_store.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698