/*
 * WinG support
 *
 * Copyright 2007 Dmitry Timoshkov
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include <stdarg.h>

#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "winuser.h"

/***********************************************************************
 *           WinGCreateDC   (WING32.@)
 */
HDC WINAPI WinGCreateDC( void )
{
    return CreateCompatibleDC( 0 );
}

/***********************************************************************
 *           WinGRecommendDIBFormat   (WING32.@)
 */
BOOL WINAPI WinGRecommendDIBFormat( BITMAPINFO *bmi )
{
    if (!bmi) return FALSE;

    bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi->bmiHeader.biWidth = 320;
    bmi->bmiHeader.biHeight = 1;
    bmi->bmiHeader.biPlanes = 1;
    bmi->bmiHeader.biBitCount = 8;
    bmi->bmiHeader.biCompression = BI_RGB;
    bmi->bmiHeader.biSizeImage = 0;
    bmi->bmiHeader.biXPelsPerMeter = 0;
    bmi->bmiHeader.biYPelsPerMeter = 0;
    bmi->bmiHeader.biClrUsed = 0;
    bmi->bmiHeader.biClrImportant = 0;

    return TRUE;
}

/***********************************************************************
 *           WinGCreateBitmap   (WING32.@)
 */
HBITMAP WINAPI WinGCreateBitmap( HDC hdc, BITMAPINFO *bmi, void **bits )
{
    return CreateDIBSection( hdc, bmi, DIB_RGB_COLORS, bits, 0, 0 );
}

/***********************************************************************
 *           WinGGetDIBPointer   (WING32.@)
 */
void * WINAPI WinGGetDIBPointer( HBITMAP hbmp, BITMAPINFO *bmi )
{
    DIBSECTION ds;

    if (GetObjectW( hbmp, sizeof(ds), &ds ) == sizeof(ds))
    {
        memcpy( &bmi->bmiHeader, &ds.dsBmih, sizeof(*bmi) );
        return ds.dsBm.bmBits;
    }
    return NULL;
}

/***********************************************************************
 *           WinGSetDIBColorTable   (WING32.@)
 */
UINT WINAPI WinGSetDIBColorTable( HDC hdc, UINT start, UINT end, RGBQUAD *colors )
{
    return SetDIBColorTable( hdc, start, end, colors );
}

/***********************************************************************
 *           WinGGetDIBColorTable   (WING32.@)
 */
UINT WINAPI WinGGetDIBColorTable( HDC hdc, UINT start, UINT end, RGBQUAD *colors )
{
    return GetDIBColorTable( hdc, start, end, colors );
}

/***********************************************************************
 *           WinGCreateHalftonePalette   (WING32.@)
 */
HPALETTE WINAPI WinGCreateHalftonePalette( void )
{
    HDC hdc;
    HPALETTE hpal;

    hdc = GetDC( 0 );
    hpal = CreateHalftonePalette( hdc );
    ReleaseDC( 0, hdc );

    return hpal;
}

/***********************************************************************
 *           WinGCreateHalftoneBrush   (WING32.@)
 */
HBRUSH WINAPI WinGCreateHalftoneBrush( HDC hdc, COLORREF color, INT type )
{
    return CreateSolidBrush( color );
}

/***********************************************************************
 *           WinGStretchBlt   (WING32.@)
 */
BOOL WINAPI WinGStretchBlt( HDC hdcDst, INT xDst, INT yDst, INT widthDst, INT heightDst,
                            HDC hdcSrc, INT xSrc, INT ySrc, INT widthSrc, INT heightSrc )
{
    INT old_blt_mode;
    BOOL ret;

    old_blt_mode = SetStretchBltMode( hdcDst, COLORONCOLOR );
    ret = StretchBlt( hdcDst, xDst, yDst, widthDst, heightDst,
                      hdcSrc, xSrc, ySrc, widthSrc, heightSrc, SRCCOPY );
    SetStretchBltMode( hdcDst, old_blt_mode );
    return ret;
}

/***********************************************************************
 *           WinGBitBlt   (WING32.@)
 */
BOOL WINAPI WinGBitBlt( HDC hdcDst, INT xDst, INT yDst, INT width,
                        INT height, HDC hdcSrc, INT xSrc, INT ySrc )
{
    return BitBlt( hdcDst, xDst, yDst, width, height, hdcSrc, xSrc, ySrc, SRCCOPY );
}