diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-21 02:38:11 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-21 02:38:11 +0000 |
commit | 48091b01b6007f5bec158bff3f9a9d127ab70f4f (patch) | |
tree | f34ac4bc6f0dc653ae75f20ecf1ed8fc76697a09 /printing/image_win.cc | |
parent | 0ad90b81a091c4d903ec07cc95781f44a1e14fa5 (diff) | |
download | chromium_src-48091b01b6007f5bec158bff3f9a9d127ab70f4f.zip chromium_src-48091b01b6007f5bec158bff3f9a9d127ab70f4f.tar.gz chromium_src-48091b01b6007f5bec158bff3f9a9d127ab70f4f.tar.bz2 |
Printing: Split off Win/Mac implementations of the Image class into their own
files.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/3966002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63316 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'printing/image_win.cc')
-rw-r--r-- | printing/image_win.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/printing/image_win.cc b/printing/image_win.cc new file mode 100644 index 0000000..e8bd368 --- /dev/null +++ b/printing/image_win.cc @@ -0,0 +1,88 @@ +// Copyright (c) 2010 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. + +#include "printing/image.h" + +#include "gfx/gdi_util.h" // EMF support +#include "gfx/rect.h" +#include "skia/ext/platform_device.h" + +namespace { + +// A simple class which temporarily overrides system settings. +// The bitmap image rendered via the PlayEnhMetaFile() function depends on +// some system settings. +// As a workaround for such dependency, this class saves the system settings +// and changes them. This class also restore the saved settings in its +// destructor. +class DisableFontSmoothing { + public: + explicit DisableFontSmoothing() : enable_again_(false) { + BOOL enabled; + if (SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, &enabled, 0) && + enabled) { + if (SystemParametersInfo(SPI_SETFONTSMOOTHING, FALSE, NULL, 0)) + enable_again_ = true; + } + } + + ~DisableFontSmoothing() { + if (enable_again_) { + BOOL result = SystemParametersInfo(SPI_SETFONTSMOOTHING, TRUE, NULL, 0); + DCHECK(result); + } + } + + private: + bool enable_again_; + + DISALLOW_COPY_AND_ASSIGN(DisableFontSmoothing); +}; + +} // namespace + +namespace printing { + +bool Image::LoadMetafile(const NativeMetafile& metafile) { + gfx::Rect rect(metafile.GetBounds()); + DisableFontSmoothing disable_in_this_scope; + + // Create a temporary HDC and bitmap to retrieve the rendered data. + HDC hdc = CreateCompatibleDC(NULL); + BITMAPV4HEADER hdr; + DCHECK_EQ(rect.x(), 0); + DCHECK_EQ(rect.y(), 0); + DCHECK_GE(rect.width(), 0); // Metafile could be empty. + DCHECK_GE(rect.height(), 0); + + if (rect.width() < 1 || rect.height() < 1) + return false; + + size_ = rect.size(); + gfx::CreateBitmapV4Header(rect.width(), rect.height(), &hdr); + void* bits; + HBITMAP bitmap = CreateDIBSection(hdc, + reinterpret_cast<BITMAPINFO*>(&hdr), 0, + &bits, NULL, 0); + DCHECK(bitmap); + DCHECK(SelectObject(hdc, bitmap)); + + skia::PlatformDevice::InitializeDC(hdc); + + bool success = metafile.Playback(hdc, NULL); + + row_length_ = size_.width() * sizeof(uint32); + size_t bytes = row_length_ * size_.height(); + DCHECK(bytes); + + data_.resize(bytes); + memcpy(&*data_.begin(), bits, bytes); + + DeleteDC(hdc); + DeleteObject(bitmap); + + return success; +} + +} // namespace printing |