Home | History | Annotate | Download | only in win
      1 /*
      2  * Copyright (C) 2011 Brent Fulgham <bfulgham (at) webkit.org>
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "DIBPixelData.h"
     28 
     29 namespace WebCore {
     30 
     31 static const WORD bitmapType = 0x4d42; // BMP format
     32 static const WORD bitmapPixelsPerMeter = 2834; // 72 dpi
     33 
     34 DIBPixelData::DIBPixelData(HBITMAP bitmap)
     35 {
     36     initialize(bitmap);
     37 }
     38 
     39 void DIBPixelData::initialize(HBITMAP bitmap)
     40 {
     41     BITMAP bmpInfo;
     42     GetObject(bitmap, sizeof(bmpInfo), &bmpInfo);
     43 
     44     m_bitmapBuffer = reinterpret_cast<UInt8*>(bmpInfo.bmBits);
     45     m_bitmapBufferLength = bmpInfo.bmWidthBytes * bmpInfo.bmHeight;
     46     m_size = IntSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
     47     m_bytesPerRow = bmpInfo.bmWidthBytes;
     48     m_bitsPerPixel = bmpInfo.bmBitsPixel;
     49 }
     50 
     51 #ifndef NDEBUG
     52 void DIBPixelData::writeToFile(LPCWSTR filePath)
     53 {
     54     HANDLE hFile = ::CreateFile(filePath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
     55     if (INVALID_HANDLE_VALUE == hFile)
     56         return;
     57 
     58     BITMAPFILEHEADER header;
     59     header.bfType = bitmapType;
     60     header.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
     61     header.bfReserved1 = 0;
     62     header.bfReserved2 = 0;
     63     header.bfSize = sizeof(BITMAPFILEHEADER);
     64 
     65     BITMAPINFOHEADER info;
     66     info.biSize = sizeof(BITMAPINFOHEADER);
     67     info.biWidth = m_size.width();
     68     info.biHeight = m_size.height();
     69     info.biPlanes = 1;
     70     info.biBitCount = m_bitsPerPixel;
     71     info.biCompression = BI_RGB;
     72     info.biSizeImage = bufferLength();
     73     info.biXPelsPerMeter = bitmapPixelsPerMeter;
     74     info.biYPelsPerMeter = bitmapPixelsPerMeter;
     75     info.biClrUsed = 0;
     76     info.biClrImportant = 0;
     77 
     78     DWORD bytesWritten = 0;
     79     ::WriteFile(hFile, &header, sizeof(header), &bytesWritten, 0);
     80     ::WriteFile(hFile, &info, sizeof(info), &bytesWritten, 0);
     81     ::WriteFile(hFile, buffer(), bufferLength(), &bytesWritten, 0);
     82 
     83     ::CloseHandle(hFile);
     84 }
     85 #endif
     86 
     87 } // namespace WebCore
     88