12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2011 Brent Fulgham <bfulgham@webkit.org>
32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *
42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Redistribution and use in source and binary forms, with or without
52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * modification, are permitted provided that the following conditions
62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * are met:
72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 1. Redistributions of source code must retain the above copyright
82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    notice, this list of conditions and the following disclaimer.
92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *    documentation and/or other materials provided with the distribution.
122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch *
132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */
252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "config.h"
272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "DIBPixelData.h"
282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochnamespace WebCore {
302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic const WORD bitmapType = 0x4d42; // BMP format
322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochstatic const WORD bitmapPixelsPerMeter = 2834; // 72 dpi
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochDIBPixelData::DIBPixelData(HBITMAP bitmap)
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    initialize(bitmap);
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid DIBPixelData::initialize(HBITMAP bitmap)
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BITMAP bmpInfo;
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GetObject(bitmap, sizeof(bmpInfo), &bmpInfo);
432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_bitmapBuffer = reinterpret_cast<UInt8*>(bmpInfo.bmBits);
452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_bitmapBufferLength = bmpInfo.bmWidthBytes * bmpInfo.bmHeight;
462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_size = IntSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_bytesPerRow = bmpInfo.bmWidthBytes;
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_bitsPerPixel = bmpInfo.bmBitsPixel;
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef NDEBUG
522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid DIBPixelData::writeToFile(LPCWSTR filePath)
532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    HANDLE hFile = ::CreateFile(filePath, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (INVALID_HANDLE_VALUE == hFile)
562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return;
572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BITMAPFILEHEADER header;
592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    header.bfType = bitmapType;
602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    header.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    header.bfReserved1 = 0;
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    header.bfReserved2 = 0;
632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    header.bfSize = sizeof(BITMAPFILEHEADER);
642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    BITMAPINFOHEADER info;
662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biSize = sizeof(BITMAPINFOHEADER);
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biWidth = m_size.width();
682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biHeight = m_size.height();
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biPlanes = 1;
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biBitCount = m_bitsPerPixel;
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biCompression = BI_RGB;
722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biSizeImage = bufferLength();
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biXPelsPerMeter = bitmapPixelsPerMeter;
742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biYPelsPerMeter = bitmapPixelsPerMeter;
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biClrUsed = 0;
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    info.biClrImportant = 0;
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    DWORD bytesWritten = 0;
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ::WriteFile(hFile, &header, sizeof(header), &bytesWritten, 0);
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ::WriteFile(hFile, &info, sizeof(info), &bytesWritten, 0);
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ::WriteFile(hFile, buffer(), bufferLength(), &bytesWritten, 0);
822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ::CloseHandle(hFile);
842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} // namespace WebCore
88