Chromium Code Reviews| Index: skia/ext/bitmap_platform_device_win.cc |
| =================================================================== |
| --- skia/ext/bitmap_platform_device_win.cc (revision 7281) |
| +++ skia/ext/bitmap_platform_device_win.cc (working copy) |
| @@ -4,9 +4,8 @@ |
| #include "skia/ext/bitmap_platform_device_win.h" |
| -#include "base/gfx/gdi_util.h" |
| -#include "base/logging.h" |
| #include "SkMatrix.h" |
| +#include "SkRefCnt.h" |
| #include "SkRegion.h" |
| #include "SkUtils.h" |
| @@ -100,8 +99,7 @@ |
| } // namespace |
| -class BitmapPlatformDeviceWin::BitmapPlatformDeviceWinData |
| - : public base::RefCounted<BitmapPlatformDeviceWinData> { |
| +class BitmapPlatformDeviceWin::BitmapPlatformDeviceWinData : public SkRefCnt { |
| public: |
| explicit BitmapPlatformDeviceWinData(HBITMAP hbitmap); |
| @@ -144,10 +142,11 @@ |
| SkRegion clip_region_; |
| private: |
| - friend class base::RefCounted<BitmapPlatformDeviceWinData>; |
| - ~BitmapPlatformDeviceWinData(); |
| + virtual ~BitmapPlatformDeviceWinData(); |
| - DISALLOW_EVIL_CONSTRUCTORS(BitmapPlatformDeviceWinData); |
| + // Copy & assign are not supported. |
| + BitmapPlatformDeviceWinData(const BitmapPlatformDeviceWinData&); |
| + BitmapPlatformDeviceWinData& operator=(const BitmapPlatformDeviceWinData&); |
| }; |
|
dglazkov
2008/12/19 20:46:41
Already is a sub-class of SkNonCopyable, right?
|
| BitmapPlatformDeviceWin::BitmapPlatformDeviceWinData::BitmapPlatformDeviceWinData( |
| @@ -190,7 +189,7 @@ |
| } |
| void BitmapPlatformDeviceWin::BitmapPlatformDeviceWinData::ReleaseBitmapDC() { |
| - DCHECK(hdc_); |
| + SkASSERT(hdc_); |
| DeleteDC(hdc_); |
| hdc_ = NULL; |
| } |
| @@ -227,11 +226,12 @@ |
| // 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. |
| -BitmapPlatformDeviceWin* BitmapPlatformDeviceWin::create(HDC screen_dc, |
| - int width, |
| - int height, |
| - bool is_opaque, |
| - HANDLE shared_section) { |
| +BitmapPlatformDeviceWin* BitmapPlatformDeviceWin::create( |
| + HDC screen_dc, |
| + int width, |
| + int height, |
| + bool is_opaque, |
| + HANDLE shared_section) { |
| SkBitmap bitmap; |
| // CreateDIBSection appears to get unhappy if we create an empty bitmap, so |
| @@ -242,7 +242,17 @@ |
| } |
| BITMAPINFOHEADER hdr = {0}; |
| - gfx::CreateBitmapHeader(width, height, &hdr); |
| + 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; |
| void* data = NULL; |
| HBITMAP hbitmap = CreateDIBSection(screen_dc, |
| @@ -256,7 +266,6 @@ |
| // we deliberately crash here, even in release mode. |
| if (!hbitmap) { |
| DWORD error = GetLastError(); |
| - LOG(ERROR) << "CreateDIBSection Failed. Error: " << error << "\n"; |
| return NULL; |
| } |
| @@ -277,7 +286,8 @@ |
| width * height); |
| } |
| - // The device object will take ownership of the HBITMAP. |
| + // 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 BitmapPlatformDeviceWin(new BitmapPlatformDeviceWinData(hbitmap), |
| bitmap); |
| } |
| @@ -286,7 +296,10 @@ |
| // data. Therefore, we do not transfer ownership to the SkDevice's bitmap. |
| BitmapPlatformDeviceWin::BitmapPlatformDeviceWin( |
| BitmapPlatformDeviceWinData* data, |
| - const SkBitmap& bitmap) : PlatformDeviceWin(bitmap), data_(data) { |
| + const SkBitmap& bitmap) |
| + : PlatformDeviceWin(bitmap), |
| + data_(data) { |
| + // The data object is already ref'ed for us by create(). |
| } |
| // The copy constructor just adds another reference to the underlying data. |
| @@ -297,14 +310,17 @@ |
| : PlatformDeviceWin( |
| const_cast<BitmapPlatformDeviceWin&>(other).accessBitmap(true)), |
| data_(other.data_) { |
| + data_->ref(); |
| } |
| BitmapPlatformDeviceWin::~BitmapPlatformDeviceWin() { |
| + data_->unref(); |
| } |
| BitmapPlatformDeviceWin& BitmapPlatformDeviceWin::operator=( |
| const BitmapPlatformDeviceWin& other) { |
| data_ = other.data_; |
| + data_->ref(); |
| return *this; |
| } |
| @@ -313,12 +329,12 @@ |
| } |
| void BitmapPlatformDeviceWin::setMatrixClip(const SkMatrix& transform, |
| - const SkRegion& region) { |
| + const SkRegion& region) { |
| data_->SetMatrixClip(transform, region); |
| } |
| void BitmapPlatformDeviceWin::drawToHDC(HDC dc, int x, int y, |
| - const RECT* src_rect) { |
| + const RECT* src_rect) { |
| bool created_dc = !data_->IsBitmapDCCreated(); |
| HDC source_dc = getBitmapDC(); |
| @@ -351,7 +367,7 @@ |
| src_rect->top, |
| SRCCOPY); |
| } else { |
| - DCHECK(copy_width != 0 && copy_height != 0); |
| + SkASSERT(copy_width != 0 && copy_height != 0); |
| BLENDFUNCTION blend_function = {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA}; |
| GdiAlphaBlend(dc, |
| x, |
| @@ -416,11 +432,11 @@ |
| template<BitmapPlatformDeviceWin::adjustAlpha adjustor> |
| void BitmapPlatformDeviceWin::processPixels(int x, |
| - int y, |
| - int width, |
| - int height) { |
| + int y, |
| + int width, |
| + int height) { |
| const SkBitmap& bitmap = accessBitmap(true); |
| - DCHECK_EQ(bitmap.config(), SkBitmap::kARGB_8888_Config); |
| + SkASSERT(bitmap.config() == SkBitmap::kARGB_8888_Config); |
| const SkMatrix& matrix = data_->transform(); |
| int bitmap_start_x = SkScalarRound(matrix.getTranslateX()) + x; |
| int bitmap_start_y = SkScalarRound(matrix.getTranslateY()) + y; |
| @@ -428,7 +444,7 @@ |
| if (Constrain(bitmap.width(), &bitmap_start_x, &width) && |
| Constrain(bitmap.height(), &bitmap_start_y, &height)) { |
| SkAutoLockPixels lock(bitmap); |
| - DCHECK_EQ(bitmap.rowBytes() % sizeof(uint32_t), 0u); |
| + SkASSERT(bitmap.rowBytes() % sizeof(uint32_t) == 0u); |
| size_t row_words = bitmap.rowBytes() / sizeof(uint32_t); |
| // Set data to the first pixel to be modified. |
| uint32_t* data = bitmap.getAddr32(0, 0) + (bitmap_start_y * row_words) + |