Index: skia/ext/bitmap_platform_device_win.cc |
diff --git a/skia/ext/bitmap_platform_device_win.cc b/skia/ext/bitmap_platform_device_win.cc |
deleted file mode 100644 |
index 63108209abc313b305256319246a06fa7d03424c..0000000000000000000000000000000000000000 |
--- a/skia/ext/bitmap_platform_device_win.cc |
+++ /dev/null |
@@ -1,328 +0,0 @@ |
-// Copyright (c) 2012 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 <windows.h> |
-#include <psapi.h> |
- |
-#include "base/debug/gdi_debug_util_win.h" |
-#include "base/logging.h" |
-#include "skia/ext/bitmap_platform_device_win.h" |
-#include "skia/ext/platform_canvas.h" |
-#include "third_party/skia/include/core/SkMatrix.h" |
-#include "third_party/skia/include/core/SkRefCnt.h" |
-#include "third_party/skia/include/core/SkRegion.h" |
-#include "third_party/skia/include/core/SkUtils.h" |
- |
-namespace { |
- |
-HBITMAP CreateHBitmap(int width, int height, bool is_opaque, |
- HANDLE shared_section, void** data) { |
- // CreateDIBSection appears to get unhappy if we create an empty bitmap, so |
- // just create a minimal bitmap |
- if ((width == 0) || (height == 0)) { |
- width = 1; |
- height = 1; |
- } |
- |
- BITMAPINFOHEADER hdr = {0}; |
- hdr.biSize = sizeof(BITMAPINFOHEADER); |
- hdr.biWidth = width; |
- hdr.biHeight = -height; // minus means top-down bitmap |
- hdr.biPlanes = 1; |
- hdr.biBitCount = 32; |
- hdr.biCompression = BI_RGB; // no compression |
- hdr.biSizeImage = 0; |
- hdr.biXPelsPerMeter = 1; |
- hdr.biYPelsPerMeter = 1; |
- hdr.biClrUsed = 0; |
- hdr.biClrImportant = 0; |
- |
- HBITMAP hbitmap = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO*>(&hdr), |
- 0, data, shared_section, 0); |
- |
-#if !defined(_WIN64) |
- // If this call fails, we're gonna crash hard. Try to get some useful |
- // information out before we crash for post-mortem analysis. |
- if (!hbitmap) |
- base::debug::GDIBitmapAllocFailure(&hdr, shared_section); |
-#endif |
- |
- return hbitmap; |
-} |
- |
-} // namespace |
- |
-namespace skia { |
- |
-void DrawToNativeContext(SkCanvas* canvas, HDC hdc, int x, int y, |
- const RECT* src_rect) { |
- PlatformDevice* platform_device = GetPlatformDevice(GetTopDevice(*canvas)); |
- if (platform_device) |
- platform_device->DrawToHDC(hdc, x, y, src_rect); |
-} |
- |
-void PlatformDevice::DrawToHDC(HDC, int x, int y, const RECT* src_rect) {} |
- |
-HDC BitmapPlatformDevice::GetBitmapDC() { |
- if (!hdc_) { |
- hdc_ = CreateCompatibleDC(NULL); |
- InitializeDC(hdc_); |
- old_hbitmap_ = static_cast<HBITMAP>(SelectObject(hdc_, hbitmap_)); |
- } |
- |
- LoadConfig(); |
- return hdc_; |
-} |
- |
-void BitmapPlatformDevice::ReleaseBitmapDC() { |
- SkASSERT(hdc_); |
- SelectObject(hdc_, old_hbitmap_); |
- DeleteDC(hdc_); |
- hdc_ = NULL; |
- old_hbitmap_ = NULL; |
-} |
- |
-bool BitmapPlatformDevice::IsBitmapDCCreated() |
- const { |
- return hdc_ != NULL; |
-} |
- |
- |
-void BitmapPlatformDevice::SetMatrixClip( |
- const SkMatrix& transform, |
- const SkRegion& region) { |
- transform_ = transform; |
- clip_region_ = region; |
- config_dirty_ = true; |
-} |
- |
-void BitmapPlatformDevice::LoadConfig() { |
- if (!config_dirty_ || !hdc_) |
- return; // Nothing to do. |
- config_dirty_ = false; |
- |
- // Transform. |
- LoadTransformToDC(hdc_, transform_); |
- LoadClippingRegionToDC(hdc_, clip_region_, transform_); |
-} |
- |
-static void DeleteHBitmapCallback(void* addr, void* context) { |
- DeleteObject(static_cast<HBITMAP>(context)); |
-} |
- |
-static bool InstallHBitmapPixels(SkBitmap* bitmap, int width, int height, |
- bool is_opaque, void* data, HBITMAP hbitmap) { |
- const SkAlphaType at = is_opaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType; |
- const SkImageInfo info = SkImageInfo::MakeN32(width, height, at); |
- const size_t rowBytes = info.minRowBytes(); |
- SkColorTable* color_table = NULL; |
- return bitmap->installPixels(info, data, rowBytes, color_table, |
- DeleteHBitmapCallback, hbitmap); |
-} |
- |
-// We use this static factory function instead of the regular constructor so |
-// that we can create the pixel data before calling the constructor. This is |
-// required so that we can call the base class' constructor with the pixel |
-// data. |
-BitmapPlatformDevice* BitmapPlatformDevice::Create( |
- int width, |
- int height, |
- bool is_opaque, |
- HANDLE shared_section, |
- bool do_clear) { |
- |
- void* data; |
- HBITMAP hbitmap = CreateHBitmap(width, height, is_opaque, shared_section, |
- &data); |
- if (!hbitmap) |
- return NULL; |
- |
- SkBitmap bitmap; |
- if (!InstallHBitmapPixels(&bitmap, width, height, is_opaque, data, hbitmap)) |
- return NULL; |
- |
- if (do_clear) |
- bitmap.eraseColor(0); |
- |
-#ifndef NDEBUG |
- // If we were given data, then don't clobber it! |
- if (!shared_section && is_opaque) |
- // To aid in finding bugs, we set the background color to something |
- // obviously wrong so it will be noticable when it is not cleared |
- bitmap.eraseARGB(255, 0, 255, 128); // bright bluish green |
-#endif |
- |
- // The device object will take ownership of the HBITMAP. The initial refcount |
- // of the data object will be 1, which is what the constructor expects. |
- return new BitmapPlatformDevice(hbitmap, bitmap); |
-} |
- |
-// static |
-BitmapPlatformDevice* BitmapPlatformDevice::Create(int width, int height, |
- bool is_opaque) { |
- const HANDLE shared_section = NULL; |
- const bool do_clear = false; |
- return Create(width, height, is_opaque, shared_section, do_clear); |
-} |
- |
-// The device will own the HBITMAP, which corresponds to also owning the pixel |
-// data. Therefore, we do not transfer ownership to the SkBitmapDevice's bitmap. |
-BitmapPlatformDevice::BitmapPlatformDevice( |
- HBITMAP hbitmap, |
- const SkBitmap& bitmap) |
- : SkBitmapDevice(bitmap), |
- hbitmap_(hbitmap), |
- old_hbitmap_(NULL), |
- hdc_(NULL), |
- config_dirty_(true), // Want to load the config next time. |
- transform_(SkMatrix::I()) { |
- // The data object is already ref'ed for us by create(). |
- SkDEBUGCODE(begin_paint_count_ = 0); |
- SetPlatformDevice(this, this); |
- // Initialize the clip region to the entire bitmap. |
- BITMAP bitmap_data; |
- if (GetObject(hbitmap_, sizeof(BITMAP), &bitmap_data)) { |
- SkIRect rect; |
- rect.set(0, 0, bitmap_data.bmWidth, bitmap_data.bmHeight); |
- clip_region_ = SkRegion(rect); |
- } |
-} |
- |
-BitmapPlatformDevice::~BitmapPlatformDevice() { |
- SkASSERT(begin_paint_count_ == 0); |
- if (hdc_) |
- ReleaseBitmapDC(); |
-} |
- |
-HDC BitmapPlatformDevice::BeginPlatformPaint() { |
- SkDEBUGCODE(begin_paint_count_++); |
- return GetBitmapDC(); |
-} |
- |
-void BitmapPlatformDevice::EndPlatformPaint() { |
- SkASSERT(begin_paint_count_--); |
- PlatformDevice::EndPlatformPaint(); |
-} |
- |
-void BitmapPlatformDevice::setMatrixClip(const SkMatrix& transform, |
- const SkRegion& region, |
- const SkClipStack&) { |
- SetMatrixClip(transform, region); |
-} |
- |
-void BitmapPlatformDevice::DrawToHDC(HDC dc, int x, int y, |
- const RECT* src_rect) { |
- bool created_dc = !IsBitmapDCCreated(); |
- HDC source_dc = BeginPlatformPaint(); |
- |
- RECT temp_rect; |
- if (!src_rect) { |
- temp_rect.left = 0; |
- temp_rect.right = width(); |
- temp_rect.top = 0; |
- temp_rect.bottom = height(); |
- src_rect = &temp_rect; |
- } |
- |
- int copy_width = src_rect->right - src_rect->left; |
- int copy_height = src_rect->bottom - src_rect->top; |
- |
- // We need to reset the translation for our bitmap or (0,0) won't be in the |
- // upper left anymore |
- SkMatrix identity; |
- identity.reset(); |
- |
- LoadTransformToDC(source_dc, identity); |
- if (isOpaque()) { |
- BitBlt(dc, |
- x, |
- y, |
- copy_width, |
- copy_height, |
- source_dc, |
- src_rect->left, |
- src_rect->top, |
- SRCCOPY); |
- } else { |
- SkASSERT(copy_width != 0 && copy_height != 0); |
- BLENDFUNCTION blend_function = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; |
- GdiAlphaBlend(dc, |
- x, |
- y, |
- copy_width, |
- copy_height, |
- source_dc, |
- src_rect->left, |
- src_rect->top, |
- copy_width, |
- copy_height, |
- blend_function); |
- } |
- LoadTransformToDC(source_dc, transform_); |
- |
- EndPlatformPaint(); |
- if (created_dc) |
- ReleaseBitmapDC(); |
-} |
- |
-const SkBitmap& BitmapPlatformDevice::onAccessBitmap() { |
- // FIXME(brettw) OPTIMIZATION: We should only flush if we know a GDI |
- // operation has occurred on our DC. |
- if (IsBitmapDCCreated()) |
- GdiFlush(); |
- return SkBitmapDevice::onAccessBitmap(); |
-} |
- |
-SkBaseDevice* BitmapPlatformDevice::onCreateDevice(const CreateInfo& cinfo, |
- const SkPaint*) { |
- const SkImageInfo& info = cinfo.fInfo; |
- const bool do_clear = !info.isOpaque(); |
- SkASSERT(info.colorType() == kN32_SkColorType); |
- return Create(info.width(), info.height(), info.isOpaque(), NULL, do_clear); |
-} |
- |
-// PlatformCanvas impl |
- |
-SkCanvas* CreatePlatformCanvas(int width, |
- int height, |
- bool is_opaque, |
- HANDLE shared_section, |
- OnFailureType failureType) { |
- skia::RefPtr<SkBaseDevice> dev = skia::AdoptRef( |
- BitmapPlatformDevice::Create(width, height, is_opaque, shared_section)); |
- return CreateCanvas(dev, failureType); |
-} |
- |
-// Port of PlatformBitmap to win |
- |
-PlatformBitmap::~PlatformBitmap() { |
- if (surface_) { |
- if (platform_extra_) |
- SelectObject(surface_, reinterpret_cast<HGDIOBJ>(platform_extra_)); |
- DeleteDC(surface_); |
- } |
-} |
- |
-bool PlatformBitmap::Allocate(int width, int height, bool is_opaque) { |
- void* data; |
- HBITMAP hbitmap = CreateHBitmap(width, height, is_opaque, 0, &data); |
- if (!hbitmap) |
- return false; |
- |
- surface_ = CreateCompatibleDC(NULL); |
- InitializeDC(surface_); |
- // When the memory DC is created, its display surface is exactly one |
- // monochrome pixel wide and one monochrome pixel high. Save this object |
- // off, we'll restore it just before deleting the memory DC. |
- HGDIOBJ stock_bitmap = SelectObject(surface_, hbitmap); |
- platform_extra_ = reinterpret_cast<intptr_t>(stock_bitmap); |
- |
- if (!InstallHBitmapPixels(&bitmap_, width, height, is_opaque, data, hbitmap)) |
- return false; |
- bitmap_.lockPixels(); |
- |
- return true; |
-} |
- |
-} // namespace skia |