Reverted wxFileSystem changes to image.cpp and dib.cpp
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@10575 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -28,7 +28,6 @@
|
|||||||
#include "wx/log.h"
|
#include "wx/log.h"
|
||||||
#include "wx/app.h"
|
#include "wx/app.h"
|
||||||
#include "wx/filefn.h"
|
#include "wx/filefn.h"
|
||||||
#include "wx/filesys.h"
|
|
||||||
#include "wx/wfstream.h"
|
#include "wx/wfstream.h"
|
||||||
#include "wx/intl.h"
|
#include "wx/intl.h"
|
||||||
#include "wx/module.h"
|
#include "wx/module.h"
|
||||||
@@ -230,12 +229,12 @@ wxImage wxImage::Scale( int width, int height ) const
|
|||||||
|
|
||||||
for (long j = 0; j < height; j++)
|
for (long j = 0; j < height; j++)
|
||||||
{
|
{
|
||||||
long y_offset = (j * (old_height-1) / (height-1)) * old_width;
|
long y_offset = (j * old_height / height) * old_width;
|
||||||
|
|
||||||
for (long i = 0; i < width; i++)
|
for (long i = 0; i < width; i++)
|
||||||
{
|
{
|
||||||
memcpy( target_data,
|
memcpy( target_data,
|
||||||
source_data + 3*(y_offset + ((i * (old_width-1) )/ (width-1))),
|
source_data + 3*(y_offset + ((i * old_width )/ width)),
|
||||||
3 );
|
3 );
|
||||||
target_data += 3;
|
target_data += 3;
|
||||||
}
|
}
|
||||||
@@ -763,22 +762,18 @@ bool wxImage::HasOption(const wxString& name) const
|
|||||||
bool wxImage::LoadFile( const wxString& filename, long type )
|
bool wxImage::LoadFile( const wxString& filename, long type )
|
||||||
{
|
{
|
||||||
#if wxUSE_STREAMS
|
#if wxUSE_STREAMS
|
||||||
// We want to use wxFileSystem for virtual FS compatibility
|
if (wxFileExists(filename))
|
||||||
wxFileSystem fsys;
|
|
||||||
wxFSFile *file = fsys.OpenFile(filename);
|
|
||||||
if (!file)
|
|
||||||
{
|
{
|
||||||
wxLogError(_("Can't open file '%s'"), filename.c_str());
|
wxFileInputStream stream(filename);
|
||||||
return FALSE;
|
wxBufferedInputStream bstream( stream );
|
||||||
|
return LoadFile(bstream, type);
|
||||||
}
|
}
|
||||||
wxInputStream *stream = file->GetStream();
|
else
|
||||||
if (!stream)
|
|
||||||
{
|
{
|
||||||
wxLogError(_("Can't open stream for file '%s'"), filename.c_str());
|
wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() );
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return LoadFile(*stream, type);
|
return FALSE;
|
||||||
|
}
|
||||||
#else // !wxUSE_STREAMS
|
#else // !wxUSE_STREAMS
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#endif // wxUSE_STREAMS
|
#endif // wxUSE_STREAMS
|
||||||
@@ -787,21 +782,18 @@ bool wxImage::LoadFile( const wxString& filename, long type )
|
|||||||
bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype )
|
bool wxImage::LoadFile( const wxString& filename, const wxString& mimetype )
|
||||||
{
|
{
|
||||||
#if wxUSE_STREAMS
|
#if wxUSE_STREAMS
|
||||||
// We want to use wxFileSystem for virtual FS compatibility
|
if (wxFileExists(filename))
|
||||||
wxFileSystem fsys;
|
|
||||||
wxFSFile *file = fsys.OpenFile(filename);
|
|
||||||
if (!file)
|
|
||||||
{
|
{
|
||||||
wxLogError(_("Can't open file '%s'"), filename.c_str());
|
wxFileInputStream stream(filename);
|
||||||
|
wxBufferedInputStream bstream( stream );
|
||||||
|
return LoadFile(bstream, mimetype);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
wxLogError( _("Can't load image from file '%s': file does not exist."), filename.c_str() );
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
wxInputStream *stream = file->GetStream();
|
|
||||||
if (!stream)
|
|
||||||
{
|
|
||||||
wxLogError(_("Can't open stream for file '%s'"), filename.c_str());
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
return LoadFile(*stream, mimetype);
|
|
||||||
#else // !wxUSE_STREAMS
|
#else // !wxUSE_STREAMS
|
||||||
return FALSE;
|
return FALSE;
|
||||||
#endif // wxUSE_STREAMS
|
#endif // wxUSE_STREAMS
|
||||||
|
524
src/msw/dib.cpp
524
src/msw/dib.cpp
@@ -1,21 +1,29 @@
|
|||||||
/////////////////////////////////////////////////////////////////////////////
|
/*******************************************************************************
|
||||||
// Name: dib.cpp
|
* *
|
||||||
// Purpose: Routines for dealing with Device Independent Bitmaps.
|
* MODULE : DIB.CC *
|
||||||
// Author:
|
* *
|
||||||
// Modified by: Jason Quijano 06/06/2001
|
* DESCRIPTION : Routines for dealing with Device Independent Bitmaps. *
|
||||||
// Created: 01/02/97
|
* *
|
||||||
// RCS-ID: $Id$
|
* FUNCTIONS : *
|
||||||
// Copyright: (c) Julian Smart
|
* *
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
* wxReadDIB() - Reads a DIB *
|
||||||
// FUNCTIONS :
|
* *
|
||||||
// wxReadDIB() - Reads a DIB
|
* WriteDIB() - Writes a global handle in CF_DIB format*
|
||||||
// WriteDIB() - Writes a global handle in CF_DIB format to a file.
|
* to a file. *
|
||||||
// wxPaletteSize() - Calculates the palette size in bytes of given DIB *
|
* *
|
||||||
// DibNumColors() - Determines the number of colors in DIB
|
* wxPaletteSize() - Calculates the palette size in bytes *
|
||||||
// DibFromBitmap() - Creates a DIB repr. the DDB passed in.
|
* of given DIB *
|
||||||
// lread() - Private routine to read more than 64k
|
* *
|
||||||
// lwrite() - Private routine to write more than 64k
|
* DibNumColors() - Determines the number of colors in DIB *
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
* *
|
||||||
|
* DibFromBitmap() - Creates a DIB repr. the DDB passed in. *
|
||||||
|
* *
|
||||||
|
* *
|
||||||
|
* lread() - Private routine to read more than 64k *
|
||||||
|
* *
|
||||||
|
* lwrite() - Private routine to write more than 64k *
|
||||||
|
* *
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
// For compilers that support precompilation, includes "wx.h".
|
// For compilers that support precompilation, includes "wx.h".
|
||||||
#include "wx/wxprec.h"
|
#include "wx/wxprec.h"
|
||||||
@@ -39,39 +47,39 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "wx/msw/dib.h"
|
#include "wx/msw/dib.h"
|
||||||
#include "wx/filesys.h"
|
|
||||||
|
|
||||||
#ifdef __GNUWIN32_OLD__
|
#ifdef __GNUWIN32_OLD__
|
||||||
#include "wx/msw/gnuwin32/extra.h"
|
#include "wx/msw/gnuwin32/extra.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SEEK_CUR
|
#ifndef SEEK_CUR
|
||||||
// flags for _lseek
|
/* flags for _lseek */
|
||||||
#define SEEK_CUR 1
|
#define SEEK_CUR 1
|
||||||
#define SEEK_END 2
|
#define SEEK_END 2
|
||||||
#define SEEK_SET 0
|
#define SEEK_SET 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Number of bytes to be read during each read operation.
|
#define MAXREAD 32768 /* Number of bytes to be read during */
|
||||||
#define MAXREAD 32768
|
/* each read operation. */
|
||||||
|
|
||||||
// Header signatutes for various resources
|
/* Header signatutes for various resources */
|
||||||
#define BFT_ICON 0x4349 // 'IC'
|
#define BFT_ICON 0x4349 /* 'IC' */
|
||||||
#define BFT_BITMAP 0x4d42 // 'BM'
|
#define BFT_BITMAP 0x4d42 /* 'BM' */
|
||||||
#define BFT_CURSOR 0x5450 // 'PT('
|
#define BFT_CURSOR 0x5450 /* 'PT(' */
|
||||||
|
|
||||||
// macro to determine if resource is a DIB
|
/* macro to determine if resource is a DIB */
|
||||||
#define ISDIB(bft) ((bft) == BFT_BITMAP)
|
#define ISDIB(bft) ((bft) == BFT_BITMAP)
|
||||||
|
|
||||||
// Macro to align given value to the closest DWORD (unsigned long )
|
/* Macro to align given value to the closest DWORD (unsigned long ) */
|
||||||
#define ALIGNULONG(i) ((i+3)/4*4)
|
#define ALIGNULONG(i) ((i+3)/4*4)
|
||||||
|
|
||||||
// Macro to determine to round off the given value to the closest byte
|
/* Macro to determine to round off the given value to the closest byte */
|
||||||
#define WIDTHBYTES(i) ((i+31)/32*4)
|
#define WIDTHBYTES(i) ((i+31)/32*4)
|
||||||
|
|
||||||
#define PALVERSION 0x300
|
#define PALVERSION 0x300
|
||||||
#define MAXPALETTE 256 // max. # supported palette entries
|
#define MAXPALETTE 256 /* max. # supported palette entries */
|
||||||
|
|
||||||
|
static DWORD PASCAL lread(int fh, VOID FAR *pv, DWORD ul);
|
||||||
static DWORD PASCAL lwrite(int fh, VOID FAR *pv, DWORD ul);
|
static DWORD PASCAL lwrite(int fh, VOID FAR *pv, DWORD ul);
|
||||||
|
|
||||||
static BOOL WriteDIB (LPTSTR szFile,HANDLE hdib);
|
static BOOL WriteDIB (LPTSTR szFile,HANDLE hdib);
|
||||||
@@ -80,14 +88,18 @@ static WORD DibNumColors (VOID FAR * pv);
|
|||||||
// HANDLE DibFromBitmap (HBITMAP hbm, DWORD biStyle, WORD biBits, HPALETTE hpal);
|
// HANDLE DibFromBitmap (HBITMAP hbm, DWORD biStyle, WORD biBits, HPALETTE hpal);
|
||||||
static BOOL PASCAL MakeBitmapAndPalette(HDC,HANDLE,HPALETTE *,HBITMAP *);
|
static BOOL PASCAL MakeBitmapAndPalette(HDC,HANDLE,HPALETTE *,HBITMAP *);
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : WriteDIB(LPSTR szFile,HANDLE hdib)
|
* *
|
||||||
// PURPOSE : Write a global handle in CF_DIB format to a file.
|
* FUNCTION : WriteDIB(LPSTR szFile,HANDLE hdib) *
|
||||||
// RETURNS : TRUE - if successful. FALSE - otherwise
|
* *
|
||||||
// ----------------------------------------------------------------------------
|
* PURPOSE : Write a global handle in CF_DIB format to a file. *
|
||||||
static BOOL WriteDIB(
|
* *
|
||||||
LPTSTR szFile,
|
* RETURNS : TRUE - if successful. *
|
||||||
HANDLE hdib )
|
* FALSE - otherwise *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static BOOL WriteDIB(LPTSTR szFile, HANDLE hdib)
|
||||||
{
|
{
|
||||||
BITMAPFILEHEADER hdr;
|
BITMAPFILEHEADER hdr;
|
||||||
LPBITMAPINFOHEADER lpbi;
|
LPBITMAPINFOHEADER lpbi;
|
||||||
@@ -96,6 +108,7 @@ static BOOL WriteDIB(
|
|||||||
|
|
||||||
if (!hdib)
|
if (!hdib)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
fh = OpenFile(wxConvertWX2MB(szFile), &of, OF_CREATE | OF_READWRITE);
|
fh = OpenFile(wxConvertWX2MB(szFile), &of, OF_CREATE | OF_READWRITE);
|
||||||
if (fh == -1)
|
if (fh == -1)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -105,17 +118,18 @@ static BOOL WriteDIB(
|
|||||||
#else
|
#else
|
||||||
lpbi = (LPBITMAPINFOHEADER) GlobalLock(hdib);
|
lpbi = (LPBITMAPINFOHEADER) GlobalLock(hdib);
|
||||||
#endif
|
#endif
|
||||||
// Fill in the fields of the file header
|
/* Fill in the fields of the file header */
|
||||||
hdr.bfType = BFT_BITMAP;
|
hdr.bfType = BFT_BITMAP;
|
||||||
hdr.bfSize = GlobalSize(hdib) + sizeof(BITMAPFILEHEADER);
|
hdr.bfSize = GlobalSize(hdib) + sizeof(BITMAPFILEHEADER);
|
||||||
hdr.bfReserved1 = 0;
|
hdr.bfReserved1 = 0;
|
||||||
hdr.bfReserved2 = 0;
|
hdr.bfReserved2 = 0;
|
||||||
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + lpbi->biSize + wxPaletteSize(lpbi);
|
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + lpbi->biSize +
|
||||||
|
wxPaletteSize(lpbi);
|
||||||
|
|
||||||
// Write the file header
|
/* Write the file header */
|
||||||
_lwrite(fh, (LPSTR) &hdr, sizeof(BITMAPFILEHEADER));
|
_lwrite(fh, (LPSTR) &hdr, sizeof(BITMAPFILEHEADER));
|
||||||
|
|
||||||
//Write the DIB header and the bits
|
/* Write the DIB header and the bits */
|
||||||
lwrite(fh, (LPSTR) lpbi, GlobalSize(hdib));
|
lwrite(fh, (LPSTR) lpbi, GlobalSize(hdib));
|
||||||
|
|
||||||
GlobalUnlock(hdib);
|
GlobalUnlock(hdib);
|
||||||
@@ -123,16 +137,20 @@ static BOOL WriteDIB(
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : wxPaletteSize(VOID FAR * pv)
|
* *
|
||||||
// PURPOSE : Calculates the palette size in bytes. If the info. block
|
* FUNCTION : wxPaletteSize(VOID FAR * pv) *
|
||||||
// is of the BITMAPCOREHEADER type, the number of colors is
|
* *
|
||||||
// multiplied by 3 to give the palette size, otherwise the
|
* PURPOSE : Calculates the palette size in bytes. If the info. block *
|
||||||
// number of colors is multiplied by 4.
|
* is of the BITMAPCOREHEADER type, the number of colors is *
|
||||||
// RETURNS : Palette size in number of bytes.
|
* multiplied by 3 to give the palette size, otherwise the *
|
||||||
// ----------------------------------------------------------------------------
|
* number of colors is multiplied by 4. *
|
||||||
WORD wxPaletteSize(
|
* *
|
||||||
VOID FAR * pv )
|
* RETURNS : Palette size in number of bytes. *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
WORD wxPaletteSize(VOID FAR * pv)
|
||||||
{
|
{
|
||||||
LPBITMAPINFOHEADER lpbi;
|
LPBITMAPINFOHEADER lpbi;
|
||||||
WORD NumColors;
|
WORD NumColors;
|
||||||
@@ -146,26 +164,31 @@ WORD wxPaletteSize(
|
|||||||
return (WORD)(NumColors * sizeof(RGBQUAD));
|
return (WORD)(NumColors * sizeof(RGBQUAD));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : DibNumColors(VOID FAR * pv)
|
* *
|
||||||
// PURPOSE : Determines the number of colors in the DIB by looking at
|
* FUNCTION : DibNumColors(VOID FAR * pv) *
|
||||||
// the BitCount filed in the info block.
|
* *
|
||||||
// RETURNS : The number of colors in the DIB.
|
* PURPOSE : Determines the number of colors in the DIB by looking at *
|
||||||
// ----------------------------------------------------------------------------
|
* the BitCount filed in the info block. *
|
||||||
static WORD DibNumColors(
|
* *
|
||||||
VOID FAR *pv )
|
* RETURNS : The number of colors in the DIB. *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static WORD DibNumColors(VOID FAR *pv)
|
||||||
{
|
{
|
||||||
int bits;
|
int bits;
|
||||||
BITMAPINFOHEADER *lpbi;
|
BITMAPINFOHEADER *lpbi;
|
||||||
BITMAPCOREHEADER *lpbc;
|
BITMAPCOREHEADER *lpbc;
|
||||||
|
|
||||||
lpbi = ((BITMAPINFOHEADER*) pv);
|
lpbi = ((BITMAPINFOHEADER*) pv);
|
||||||
lpbc = ((BITMAPCOREHEADER*) pv);
|
lpbc = ((BITMAPCOREHEADER*) pv);
|
||||||
|
|
||||||
// With the BITMAPINFO format headers, the size of the palette
|
/* With the BITMAPINFO format headers, the size of the palette
|
||||||
// is in biClrUsed, whereas in the BITMAPCORE - style headers, it
|
* is in biClrUsed, whereas in the BITMAPCORE - style headers, it
|
||||||
// is dependent on the bits per pixel ( = 2 raised to the power of
|
* is dependent on the bits per pixel ( = 2 raised to the power of
|
||||||
// bits/pixel).
|
* bits/pixel).
|
||||||
|
*/
|
||||||
if (lpbi->biSize != sizeof(BITMAPCOREHEADER)) {
|
if (lpbi->biSize != sizeof(BITMAPCOREHEADER)) {
|
||||||
if (lpbi->biClrUsed != 0)
|
if (lpbi->biClrUsed != 0)
|
||||||
return (WORD) lpbi->biClrUsed;
|
return (WORD) lpbi->biClrUsed;
|
||||||
@@ -182,23 +205,24 @@ static WORD DibNumColors(
|
|||||||
case 8:
|
case 8:
|
||||||
return 256;
|
return 256;
|
||||||
default:
|
default:
|
||||||
// A 24 bitcount DIB has no color table
|
/* A 24 bitcount DIB has no color table */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : DibFromBitmap()
|
* *
|
||||||
// PURPOSE : Will create a global memory block in DIB format that
|
* FUNCTION : DibFromBitmap() *
|
||||||
// represents the Device-dependent bitmap (DDB) passed in.
|
* *
|
||||||
// RETURNS : A handle to the DIB
|
* PURPOSE : Will create a global memory block in DIB format that *
|
||||||
// ----------------------------------------------------------------------------
|
* represents the Device-dependent bitmap (DDB) passed in. *
|
||||||
|
* *
|
||||||
|
* RETURNS : A handle to the DIB *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
#if NOTHING
|
#if NOTHING
|
||||||
static HANDLE DibFromBitmap(
|
static HANDLE DibFromBitmap(HBITMAP hbm, DWORD biStyle, WORD biBits, HPALETTE hpal)
|
||||||
HBITMAP hbm,
|
|
||||||
DWORD biStyle,
|
|
||||||
WORD biBits,
|
|
||||||
HPALETTE hpal)
|
|
||||||
{
|
{
|
||||||
BITMAP bm;
|
BITMAP bm;
|
||||||
BITMAPINFOHEADER bi;
|
BITMAPINFOHEADER bi;
|
||||||
@@ -210,6 +234,7 @@ static HANDLE DibFromBitmap(
|
|||||||
|
|
||||||
if (!hbm)
|
if (!hbm)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (hpal == NULL)
|
if (hpal == NULL)
|
||||||
hpal = GetStockObject(DEFAULT_PALETTE);
|
hpal = GetStockObject(DEFAULT_PALETTE);
|
||||||
|
|
||||||
@@ -252,34 +277,39 @@ static HANDLE DibFromBitmap(
|
|||||||
|
|
||||||
*lpbi = bi;
|
*lpbi = bi;
|
||||||
|
|
||||||
// call GetDIBits with a NULL lpBits param, so it will calculate the
|
/* call GetDIBits with a NULL lpBits param, so it will calculate the
|
||||||
// biSizeImage field for us
|
* biSizeImage field for us
|
||||||
GetDIBits(hdc, hbm, 0, (WORD) bi.biHeight, NULL, (LPBITMAPINFO) lpbi, DIB_RGB_COLORS);
|
*/
|
||||||
|
GetDIBits(hdc, hbm, 0, (WORD) bi.biHeight,
|
||||||
|
NULL, (LPBITMAPINFO) lpbi, DIB_RGB_COLORS);
|
||||||
|
|
||||||
bi = *lpbi;
|
bi = *lpbi;
|
||||||
GlobalUnlock(hdib);
|
GlobalUnlock(hdib);
|
||||||
|
|
||||||
// If the driver did not fill in the biSizeImage field, make one up
|
/* If the driver did not fill in the biSizeImage field, make one up */
|
||||||
if (bi.biSizeImage == 0) {
|
if (bi.biSizeImage == 0) {
|
||||||
bi.biSizeImage = WIDTHBYTES((DWORD)bm.bmWidth * biBits) * bm.bmHeight;
|
bi.biSizeImage = WIDTHBYTES((DWORD)bm.bmWidth * biBits) * bm.bmHeight;
|
||||||
|
|
||||||
if (biStyle != BI_RGB)
|
if (biStyle != BI_RGB)
|
||||||
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
|
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
// realloc the buffer big enough to hold all the bits
|
/* realloc the buffer big enough to hold all the bits */
|
||||||
dwLen = bi.biSize + wxPaletteSize(&bi) + bi.biSizeImage;
|
dwLen = bi.biSize + wxPaletteSize(&bi) + bi.biSizeImage;
|
||||||
if (h = GlobalReAlloc(hdib, dwLen, 0))
|
if (h = GlobalReAlloc(hdib, dwLen, 0))
|
||||||
hdib = h;
|
hdib = h;
|
||||||
else {
|
else {
|
||||||
GlobalFree(hdib);
|
GlobalFree(hdib);
|
||||||
hdib = NULL;
|
hdib = NULL;
|
||||||
|
|
||||||
SelectPalette(hdc, hpal, FALSE);
|
SelectPalette(hdc, hpal, FALSE);
|
||||||
ReleaseDC(NULL, hdc);
|
ReleaseDC(NULL, hdc);
|
||||||
return hdib;
|
return hdib;
|
||||||
}
|
}
|
||||||
|
|
||||||
// call GetDIBits with a NON-NULL lpBits param, and actualy get the
|
/* call GetDIBits with a NON-NULL lpBits param, and actualy get the
|
||||||
// bits this time
|
* bits this time
|
||||||
|
*/
|
||||||
#ifdef __WINDOWS_386__
|
#ifdef __WINDOWS_386__
|
||||||
lpbi = (BITMAPINFOHEADER FAR *) MK_FP32(GlobalLock(hdib));
|
lpbi = (BITMAPINFOHEADER FAR *) MK_FP32(GlobalLock(hdib));
|
||||||
#else
|
#else
|
||||||
@@ -301,23 +331,56 @@ static HANDLE DibFromBitmap(
|
|||||||
|
|
||||||
bi = *lpbi;
|
bi = *lpbi;
|
||||||
GlobalUnlock(hdib);
|
GlobalUnlock(hdib);
|
||||||
|
|
||||||
SelectPalette(hdc, hpal, FALSE);
|
SelectPalette(hdc, hpal, FALSE);
|
||||||
ReleaseDC(NULL, hdc);
|
ReleaseDC(NULL, hdc);
|
||||||
return hdib;
|
return hdib;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/************* PRIVATE ROUTINES TO READ/WRITE MORE THAN 64K ***************/
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* FUNCTION : lread(int fh, VOID FAR *pv, DWORD ul) *
|
||||||
|
* *
|
||||||
|
* PURPOSE : Reads data in steps of 32k till all the data has been read.*
|
||||||
|
* *
|
||||||
|
* RETURNS : 0 - If read did not proceed correctly. *
|
||||||
|
* number of bytes read otherwise. *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
//************* PRIVATE ROUTINES TO WRITE MORE THAN 64K ******************
|
static DWORD PASCAL lread(int fh, void far *pv, DWORD ul)
|
||||||
// ----------------------------------------------------------------------------
|
{
|
||||||
// FUNCTION : lwrite(int fh, VOID FAR *pv, DWORD ul)
|
DWORD ulT = ul;
|
||||||
// PURPOSE : Writes data in steps of 32k till all the data is written.
|
#if defined(WINNT) || defined(__WIN32__) || defined(__WIN32__) || defined(__WXWINE__)
|
||||||
// RETURNS : 0 - If write did not proceed correctly. number of bytes written otherwise.
|
BYTE *hp = (BYTE *) pv;
|
||||||
// ----------------------------------------------------------------------------
|
#else
|
||||||
static DWORD PASCAL lwrite(
|
BYTE huge *hp = (BYTE huge *) pv;
|
||||||
int fh,
|
#endif
|
||||||
VOID FAR *pv,
|
while (ul > (DWORD) MAXREAD) {
|
||||||
DWORD ul)
|
if (_lread(fh, (LPSTR) hp, (WORD) MAXREAD) != MAXREAD)
|
||||||
|
return 0;
|
||||||
|
ul -= MAXREAD;
|
||||||
|
hp += MAXREAD;
|
||||||
|
}
|
||||||
|
if (_lread(fh, (LPSTR) hp, (WXUINT) ul) != (WXUINT) ul)
|
||||||
|
return 0;
|
||||||
|
return ulT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* *
|
||||||
|
* FUNCTION : lwrite(int fh, VOID FAR *pv, DWORD ul) *
|
||||||
|
* *
|
||||||
|
* PURPOSE : Writes data in steps of 32k till all the data is written. *
|
||||||
|
* *
|
||||||
|
* RETURNS : 0 - If write did not proceed correctly. *
|
||||||
|
* number of bytes written otherwise. *
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
static DWORD PASCAL lwrite(int fh, VOID FAR *pv, DWORD ul)
|
||||||
{
|
{
|
||||||
DWORD ulT = ul;
|
DWORD ulT = ul;
|
||||||
#if defined(WINNT) || defined(__WIN32__) || defined(__WIN32__) || defined(__WXWINE__)
|
#if defined(WINNT) || defined(__WIN32__) || defined(__WIN32__) || defined(__WXWINE__)
|
||||||
@@ -336,23 +399,26 @@ static DWORD PASCAL lwrite(
|
|||||||
return ulT;
|
return ulT;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : ReadDIB(hWnd)
|
*
|
||||||
// PURPOSE : Reads a DIB from a file, obtains a handle to its
|
* FUNCTION : ReadDIB(hWnd)
|
||||||
// BITMAPINFO struct. and loads the DIB. Once the DIB
|
*
|
||||||
// is loaded, the function also creates a bitmap and
|
* PURPOSE : Reads a DIB from a file, obtains a handle to its
|
||||||
// palette out of the DIB for a device-dependent form.
|
* BITMAPINFO struct. and loads the DIB. Once the DIB
|
||||||
// RETURNS : TRUE - DIB loaded and bitmap/palette created
|
* is loaded, the function also creates a bitmap and
|
||||||
// The DIBINIT structure pointed to by pInfo is
|
* palette out of the DIB for a device-dependent form.
|
||||||
// filled with the appropriate handles.
|
*
|
||||||
// FALSE - otherwise
|
* RETURNS : TRUE - DIB loaded and bitmap/palette created
|
||||||
// ----------------------------------------------------------------------------
|
* The DIBINIT structure pointed to by pInfo is
|
||||||
BOOL wxReadDIB(
|
* filled with the appropriate handles.
|
||||||
LPTSTR lpFileName,
|
* FALSE - otherwise
|
||||||
HBITMAP *bitmap,
|
*
|
||||||
HPALETTE *palette)
|
****************************************************************************/
|
||||||
|
BOOL wxReadDIB(LPTSTR lpFileName, HBITMAP *bitmap, HPALETTE *palette)
|
||||||
{
|
{
|
||||||
|
int fh;
|
||||||
LPBITMAPINFOHEADER lpbi;
|
LPBITMAPINFOHEADER lpbi;
|
||||||
|
OFSTRUCT of;
|
||||||
BITMAPFILEHEADER bf;
|
BITMAPFILEHEADER bf;
|
||||||
WORD nNumColors;
|
WORD nNumColors;
|
||||||
BOOL result = FALSE;
|
BOOL result = FALSE;
|
||||||
@@ -361,17 +427,16 @@ BOOL wxReadDIB(
|
|||||||
BOOL bCoreHead = FALSE;
|
BOOL bCoreHead = FALSE;
|
||||||
HANDLE hDIB = 0;
|
HANDLE hDIB = 0;
|
||||||
|
|
||||||
// JQ: We want to use wxFileSystem here in stead of Openfile so
|
/* Open the file and get a handle to it's BITMAPINFO */
|
||||||
// that we can use other FS types like a zip files.
|
|
||||||
wxFileSystem fsys;
|
fh = OpenFile (wxConvertWX2MB(lpFileName), &of, OF_READ);
|
||||||
wxFSFile *file = fsys.OpenFile(lpFileName);
|
if (fh == -1) {
|
||||||
wxInputStream *dibs = file->GetStream();
|
|
||||||
if (!dibs) {
|
|
||||||
wxLogError(_("Can't open file '%s'"), lpFileName);
|
wxLogError(_("Can't open file '%s'"), lpFileName);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
hDIB = GlobalAlloc(GHND, (DWORD)(sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)));
|
hDIB = GlobalAlloc(GHND, (DWORD)(sizeof(BITMAPINFOHEADER) +
|
||||||
|
256 * sizeof(RGBQUAD)));
|
||||||
if (!hDIB)
|
if (!hDIB)
|
||||||
return(0);
|
return(0);
|
||||||
|
|
||||||
@@ -381,22 +446,18 @@ BOOL wxReadDIB(
|
|||||||
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
|
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// JQ: read from the wxInputStream dibs instead of fh so
|
/* read the BITMAPFILEHEADER */
|
||||||
// that we can use other FS types like zip files.
|
if (sizeof (bf) != _lread (fh, (LPSTR)&bf, sizeof (bf)))
|
||||||
dibs->Read((LPSTR)&bf,sizeof(bf));
|
|
||||||
if (sizeof(bf) != dibs->LastRead())
|
|
||||||
goto ErrExit;
|
goto ErrExit;
|
||||||
|
|
||||||
if (bf.bfType != 0x4d42) // 'BM'
|
if (bf.bfType != 0x4d42) /* 'BM' */
|
||||||
goto ErrExit;
|
goto ErrExit;
|
||||||
|
|
||||||
// JQ: read from the wxInputStream dibs instead of fh so
|
if (sizeof(BITMAPCOREHEADER) != _lread (fh, (LPSTR)lpbi, sizeof(BITMAPCOREHEADER)))
|
||||||
// that we can use other FS types like zip files.
|
|
||||||
dibs->Read((LPSTR)lpbi,sizeof(BITMAPCOREHEADER));
|
|
||||||
if (sizeof(BITMAPCOREHEADER) != dibs->LastRead())
|
|
||||||
goto ErrExit;
|
goto ErrExit;
|
||||||
|
|
||||||
if (lpbi->biSize == sizeof(BITMAPCOREHEADER)){
|
if (lpbi->biSize == sizeof(BITMAPCOREHEADER))
|
||||||
|
{
|
||||||
lpbi->biSize = sizeof(BITMAPINFOHEADER);
|
lpbi->biSize = sizeof(BITMAPINFOHEADER);
|
||||||
lpbi->biBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
|
lpbi->biBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
|
||||||
lpbi->biPlanes = ((LPBITMAPCOREHEADER)lpbi)->bcPlanes;
|
lpbi->biPlanes = ((LPBITMAPCOREHEADER)lpbi)->bcPlanes;
|
||||||
@@ -404,46 +465,38 @@ BOOL wxReadDIB(
|
|||||||
lpbi->biWidth = ((LPBITMAPCOREHEADER)lpbi)->bcWidth;
|
lpbi->biWidth = ((LPBITMAPCOREHEADER)lpbi)->bcWidth;
|
||||||
bCoreHead = TRUE;
|
bCoreHead = TRUE;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// JQ: Get to the start of the header and read INFOHEADER
|
// get to the start of the header and read INFOHEADER
|
||||||
// using dibs wxInputStream
|
_llseek(fh,sizeof(BITMAPFILEHEADER),SEEK_SET);
|
||||||
dibs->SeekI(sizeof(BITMAPFILEHEADER),wxFromStart);
|
if (sizeof(BITMAPINFOHEADER) != _lread (fh, (LPSTR)lpbi, sizeof(BITMAPINFOHEADER)))
|
||||||
if (dibs->LastError() != wxSTREAM_NO_ERROR)
|
|
||||||
goto ErrExit;
|
goto ErrExit;
|
||||||
|
|
||||||
// JQ: read from the wxInputStream dibs instead of fh so
|
|
||||||
// that we can use other FS types like zip files.
|
|
||||||
// Can I do error checking with this?
|
|
||||||
dibs->Read((LPSTR)lpbi,sizeof(BITMAPINFOHEADER));
|
|
||||||
if (sizeof(BITMAPINFOHEADER) != dibs->LastRead())
|
|
||||||
goto ErrExit;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nNumColors = (WORD)lpbi->biClrUsed;
|
nNumColors = (WORD)lpbi->biClrUsed;
|
||||||
if ( nNumColors == 0 ) {
|
if ( nNumColors == 0 )
|
||||||
// no color table for 24-bit, default size otherwise
|
{
|
||||||
|
/* no color table for 24-bit, default size otherwise */
|
||||||
if (lpbi->biBitCount != 24)
|
if (lpbi->biBitCount != 24)
|
||||||
nNumColors = 1 << lpbi->biBitCount; // standard size table
|
nNumColors = 1 << lpbi->biBitCount; /* standard size table */
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill in some default values if they are zero
|
/* fill in some default values if they are zero */
|
||||||
if (lpbi->biClrUsed == 0)
|
if (lpbi->biClrUsed == 0)
|
||||||
lpbi->biClrUsed = nNumColors;
|
lpbi->biClrUsed = nNumColors;
|
||||||
|
|
||||||
if (lpbi->biSizeImage == 0){
|
if (lpbi->biSizeImage == 0)
|
||||||
|
{
|
||||||
lpbi->biSizeImage = ((((lpbi->biWidth * (DWORD)lpbi->biBitCount) + 31) & ~31) >> 3)
|
lpbi->biSizeImage = ((((lpbi->biWidth * (DWORD)lpbi->biBitCount) + 31) & ~31) >> 3)
|
||||||
* lpbi->biHeight;
|
* lpbi->biHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get a proper-sized buffer for header, color table and bits
|
/* get a proper-sized buffer for header, color table and bits */
|
||||||
GlobalUnlock(hDIB);
|
GlobalUnlock(hDIB);
|
||||||
hDIB = GlobalReAlloc(hDIB, lpbi->biSize + nNumColors * sizeof(RGBQUAD) +
|
hDIB = GlobalReAlloc(hDIB, lpbi->biSize +
|
||||||
|
nNumColors * sizeof(RGBQUAD) +
|
||||||
lpbi->biSizeImage, 0);
|
lpbi->biSizeImage, 0);
|
||||||
|
if (!hDIB) /* can't resize buffer for loading */
|
||||||
// can't resize buffer for loading
|
|
||||||
if (!hDIB)
|
|
||||||
goto ErrExit2;
|
goto ErrExit2;
|
||||||
|
|
||||||
#ifdef __WINDOWS_386__
|
#ifdef __WINDOWS_386__
|
||||||
@@ -452,17 +505,21 @@ BOOL wxReadDIB(
|
|||||||
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
|
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIB);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// read the color table
|
/* read the color table */
|
||||||
if (!bCoreHead)
|
if (!bCoreHead)
|
||||||
dibs->Read((LPSTR)lpbi + lpbi->biSize, nNumColors * sizeof(RGBQUAD));
|
_lread(fh, (LPSTR)(lpbi) + lpbi->biSize, nNumColors * sizeof(RGBQUAD));
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
signed int i;
|
signed int i;
|
||||||
RGBQUAD FAR *pQuad;
|
RGBQUAD FAR *pQuad;
|
||||||
RGBTRIPLE FAR *pTriple;
|
RGBTRIPLE FAR *pTriple;
|
||||||
dibs->Read((LPSTR)lpbi + lpbi->biSize, nNumColors * sizeof(RGBTRIPLE));
|
|
||||||
|
_lread(fh, (LPSTR)(lpbi) + lpbi->biSize, nNumColors * sizeof(RGBTRIPLE));
|
||||||
|
|
||||||
pQuad = (RGBQUAD FAR *)((LPSTR)lpbi + lpbi->biSize);
|
pQuad = (RGBQUAD FAR *)((LPSTR)lpbi + lpbi->biSize);
|
||||||
pTriple = (RGBTRIPLE FAR *) pQuad;
|
pTriple = (RGBTRIPLE FAR *) pQuad;
|
||||||
for (i = nNumColors - 1; i >= 0; i--){
|
for (i = nNumColors - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
pQuad[i].rgbRed = pTriple[i].rgbtRed;
|
pQuad[i].rgbRed = pTriple[i].rgbtRed;
|
||||||
pQuad[i].rgbBlue = pTriple[i].rgbtBlue;
|
pQuad[i].rgbBlue = pTriple[i].rgbtBlue;
|
||||||
pQuad[i].rgbGreen = pTriple[i].rgbtGreen;
|
pQuad[i].rgbGreen = pTriple[i].rgbtGreen;
|
||||||
@@ -470,18 +527,21 @@ BOOL wxReadDIB(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// offset to the bits from start of DIB header
|
/* offset to the bits from start of DIB header */
|
||||||
offBits = (WORD)(lpbi->biSize + nNumColors * sizeof(RGBQUAD));
|
offBits = (WORD)(lpbi->biSize + nNumColors * sizeof(RGBQUAD));
|
||||||
|
|
||||||
if (bf.bfOffBits != 0L)
|
if (bf.bfOffBits != 0L)
|
||||||
dibs->SeekI(bf.bfOffBits, wxFromStart);
|
{
|
||||||
|
_llseek(fh,bf.bfOffBits,SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
dibs->Read((LPSTR)lpbi + offBits,lpbi->biSizeImage);
|
if (lpbi->biSizeImage == lread(fh, (LPSTR)lpbi + offBits, lpbi->biSizeImage))
|
||||||
if (lpbi->biSizeImage == dibs->LastRead())
|
|
||||||
{
|
{
|
||||||
GlobalUnlock(hDIB);
|
GlobalUnlock(hDIB);
|
||||||
|
|
||||||
hDC = GetDC(NULL);
|
hDC = GetDC(NULL);
|
||||||
if (!MakeBitmapAndPalette(hDC, hDIB, palette, bitmap))
|
if (!MakeBitmapAndPalette(hDC, hDIB, palette,
|
||||||
|
bitmap))
|
||||||
{
|
{
|
||||||
ReleaseDC(NULL,hDC);
|
ReleaseDC(NULL,hDC);
|
||||||
goto ErrExit2;
|
goto ErrExit2;
|
||||||
@@ -500,23 +560,28 @@ ErrExit:
|
|||||||
ErrExit2:
|
ErrExit2:
|
||||||
GlobalFree(hDIB);
|
GlobalFree(hDIB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_lclose(fh);
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : MakeBitmapAndPalette
|
*
|
||||||
// PURPOSE : Given a DIB, creates a bitmap and corresponding palette
|
* FUNCTION : MakeBitmapAndPalette
|
||||||
// to be used for a device-dependent representation of
|
*
|
||||||
// of the image.
|
* PURPOSE : Given a DIB, creates a bitmap and corresponding palette
|
||||||
// RETURNS : TRUE --> success. phPal and phBitmap are filled with
|
* to be used for a device-dependent representation of
|
||||||
// appropriate handles. Caller is responsible for freeing objects.
|
* of the image.
|
||||||
// FALSE --> unable to create objects. both pointer are not valid
|
*
|
||||||
// ----------------------------------------------------------------------------
|
* RETURNS : TRUE --> success. phPal and phBitmap are filled with
|
||||||
static BOOL PASCAL MakeBitmapAndPalette(
|
* appropriate handles. Caller is responsible
|
||||||
HDC hDC,
|
* for freeing objects.
|
||||||
HANDLE hDIB,
|
* FALSE --> unable to create objects. both pointer are
|
||||||
HPALETTE * phPal,
|
* not valid
|
||||||
HBITMAP * phBitmap)
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
static BOOL PASCAL MakeBitmapAndPalette(HDC hDC, HANDLE hDIB,
|
||||||
|
HPALETTE * phPal, HBITMAP * phBitmap)
|
||||||
{
|
{
|
||||||
LPBITMAPINFOHEADER lpInfo;
|
LPBITMAPINFOHEADER lpInfo;
|
||||||
BOOL result = FALSE;
|
BOOL result = FALSE;
|
||||||
@@ -556,18 +621,23 @@ static BOOL PASCAL MakeBitmapAndPalette(
|
|||||||
}
|
}
|
||||||
|
|
||||||
GlobalUnlock (hDIB); // glt
|
GlobalUnlock (hDIB); // glt
|
||||||
|
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
/****************************************************************************
|
||||||
// FUNCTION : wxMakeDIBPalette(lpInfo)
|
* *
|
||||||
// PURPOSE : Given a BITMAPINFOHEADER, create a palette based on
|
* FUNCTION : wxMakeDIBPalette(lpInfo) *
|
||||||
// the color table.
|
* *
|
||||||
// RETURNS : non-zero - handle of a corresponding palette
|
* PURPOSE : Given a BITMAPINFOHEADER, create a palette based on
|
||||||
// zero - unable to create palette
|
* the color table.
|
||||||
// ----------------------------------------------------------------------------
|
*
|
||||||
HPALETTE wxMakeDIBPalette(
|
* *
|
||||||
LPBITMAPINFOHEADER lpInfo )
|
* RETURNS : non-zero - handle of a corresponding palette
|
||||||
|
* zero - unable to create palette
|
||||||
|
* *
|
||||||
|
****************************************************************************/
|
||||||
|
HPALETTE wxMakeDIBPalette(LPBITMAPINFOHEADER lpInfo)
|
||||||
{
|
{
|
||||||
#ifdef __WXWINE__
|
#ifdef __WXWINE__
|
||||||
return (FALSE);
|
return (FALSE);
|
||||||
@@ -577,8 +647,9 @@ HPALETTE wxMakeDIBPalette(
|
|||||||
HPALETTE hLogPal;
|
HPALETTE hLogPal;
|
||||||
WORD i;
|
WORD i;
|
||||||
|
|
||||||
// since biClrUsed field was filled during the loading of the DIB,
|
/* since biClrUsed field was filled during the loading of the DIB,
|
||||||
// we know it contains the number of colors in the color table.
|
** we know it contains the number of colors in the color table.
|
||||||
|
*/
|
||||||
if (lpInfo->biClrUsed)
|
if (lpInfo->biClrUsed)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -593,10 +664,10 @@ HPALETTE wxMakeDIBPalette(
|
|||||||
npPal->palVersion = 0x300;
|
npPal->palVersion = 0x300;
|
||||||
npPal->palNumEntries = (WORD)lpInfo->biClrUsed;
|
npPal->palNumEntries = (WORD)lpInfo->biClrUsed;
|
||||||
|
|
||||||
// get pointer to the color table
|
/* get pointer to the color table */
|
||||||
lpRGB = (RGBQUAD FAR *)((LPSTR)lpInfo + lpInfo->biSize);
|
lpRGB = (RGBQUAD FAR *)((LPSTR)lpInfo + lpInfo->biSize);
|
||||||
|
|
||||||
// copy colors from the color table to the LogPalette structure
|
/* copy colors from the color table to the LogPalette structure */
|
||||||
for (i = 0; (DWORD)i < lpInfo->biClrUsed; i++, lpRGB++)
|
for (i = 0; (DWORD)i < lpInfo->biClrUsed; i++, lpRGB++)
|
||||||
{
|
{
|
||||||
npPal->palPalEntry[i].peRed = lpRGB->rgbRed;
|
npPal->palPalEntry[i].peRed = lpRGB->rgbRed;
|
||||||
@@ -608,31 +679,27 @@ HPALETTE wxMakeDIBPalette(
|
|||||||
hLogPal = CreatePalette((LPLOGPALETTE)npPal);
|
hLogPal = CreatePalette((LPLOGPALETTE)npPal);
|
||||||
// LocalFree((HANDLE)npPal);
|
// LocalFree((HANDLE)npPal);
|
||||||
free(npPal);
|
free(npPal);
|
||||||
|
|
||||||
return(hLogPal);
|
return(hLogPal);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 24-bit DIB with no color table. return default palette. Another
|
/* 24-bit DIB with no color table. return default palette. Another
|
||||||
// option would be to create a 256 color "rainbow" palette to provide
|
** option would be to create a 256 color "rainbow" palette to provide
|
||||||
// some good color choices.
|
** some good color choices.
|
||||||
|
*/
|
||||||
else
|
else
|
||||||
return((HPALETTE) GetStockObject(DEFAULT_PALETTE));
|
return((HPALETTE) GetStockObject(DEFAULT_PALETTE));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
bool wxLoadIntoBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette **pal)
|
||||||
// FUNCTION :
|
|
||||||
// PURPOSE :
|
|
||||||
// RETURNS :
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
bool wxLoadIntoBitmap(
|
|
||||||
wxChar *filename,
|
|
||||||
wxBitmap *bitmap,
|
|
||||||
wxPalette **pal)
|
|
||||||
{
|
{
|
||||||
HBITMAP hBitmap;
|
HBITMAP hBitmap;
|
||||||
HPALETTE hPalette;
|
HPALETTE hPalette;
|
||||||
|
|
||||||
bool success = (wxReadDIB(filename, &hBitmap, &hPalette) != 0);
|
bool success = (wxReadDIB(filename, &hBitmap, &hPalette) != 0);
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
{
|
{
|
||||||
DeleteObject(hPalette);
|
DeleteObject(hPalette);
|
||||||
@@ -669,14 +736,7 @@ bool wxLoadIntoBitmap(
|
|||||||
else return FALSE;
|
else return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
wxBitmap *wxLoadBitmap(wxChar *filename, wxPalette **pal)
|
||||||
// FUNCTION :
|
|
||||||
// PURPOSE :
|
|
||||||
// RETURNS :
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
wxBitmap *wxLoadBitmap(
|
|
||||||
wxChar *filename,
|
|
||||||
wxPalette **pal)
|
|
||||||
{
|
{
|
||||||
wxBitmap *bitmap = new wxBitmap;
|
wxBitmap *bitmap = new wxBitmap;
|
||||||
if (wxLoadIntoBitmap(filename, bitmap, pal))
|
if (wxLoadIntoBitmap(filename, bitmap, pal))
|
||||||
@@ -689,9 +749,12 @@ wxBitmap *wxLoadBitmap(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
// FUNCTION : InitBitmapInfoHeader
|
//
|
||||||
// PURPOSE : Does a "standard" initialization of a BITMAPINFOHEADER,
|
// Function: InitBitmapInfoHeader
|
||||||
// given the Width, Height, and Bits per Pixel for the DIB.
|
//
|
||||||
|
// Purpose: Does a "standard" initialization of a BITMAPINFOHEADER,
|
||||||
|
// given the Width, Height, and Bits per Pixel for the
|
||||||
|
// DIB.
|
||||||
//
|
//
|
||||||
// By standard, I mean that all the relevant fields are set
|
// By standard, I mean that all the relevant fields are set
|
||||||
// to the specified values. biSizeImage is computed, the
|
// to the specified values. biSizeImage is computed, the
|
||||||
@@ -703,7 +766,7 @@ wxBitmap *wxLoadBitmap(
|
|||||||
// used (whichever is most appropriate for the specified
|
// used (whichever is most appropriate for the specified
|
||||||
// nBPP).
|
// nBPP).
|
||||||
//
|
//
|
||||||
// PARMS : lpBmInfoHdr == Far pointer to a BITMAPINFOHEADER structure
|
// Parms: lpBmInfoHdr == Far pointer to a BITMAPINFOHEADER structure
|
||||||
// to be filled in.
|
// to be filled in.
|
||||||
// dwWidth == Width of DIB (not in Win 3.0 & 3.1, high
|
// dwWidth == Width of DIB (not in Win 3.0 & 3.1, high
|
||||||
// word MUST be 0).
|
// word MUST be 0).
|
||||||
@@ -715,8 +778,8 @@ wxBitmap *wxLoadBitmap(
|
|||||||
// 11/07/91 Created
|
// 11/07/91 Created
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
static void InitBitmapInfoHeader (
|
|
||||||
LPBITMAPINFOHEADER lpBmInfoHdr,
|
static void InitBitmapInfoHeader (LPBITMAPINFOHEADER lpBmInfoHdr,
|
||||||
DWORD dwWidth,
|
DWORD dwWidth,
|
||||||
DWORD dwHeight,
|
DWORD dwHeight,
|
||||||
int nBPP)
|
int nBPP)
|
||||||
@@ -746,17 +809,16 @@ static void InitBitmapInfoHeader (
|
|||||||
lpBmInfoHdr->biSizeImage = WIDTHBYTES (dwWidth * nBPP) * dwHeight;
|
lpBmInfoHdr->biSizeImage = WIDTHBYTES (dwWidth * nBPP) * dwHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// FUNCTION :
|
|
||||||
// PURPOSE :
|
|
||||||
// RETURNS :
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
LPSTR wxFindDIBBits (LPSTR lpbi)
|
LPSTR wxFindDIBBits (LPSTR lpbi)
|
||||||
{
|
{
|
||||||
return (lpbi + *(LPDWORD)lpbi + wxPaletteSize (lpbi));
|
return (lpbi + *(LPDWORD)lpbi + wxPaletteSize (lpbi));
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
|
//
|
||||||
// Function: BitmapToDIB
|
// Function: BitmapToDIB
|
||||||
//
|
//
|
||||||
// Purpose: Given a device dependent bitmap and a palette, returns
|
// Purpose: Given a device dependent bitmap and a palette, returns
|
||||||
@@ -774,9 +836,8 @@ LPSTR wxFindDIBBits (LPSTR lpbi)
|
|||||||
// 6/01/91 Created
|
// 6/01/91 Created
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
HANDLE wxBitmapToDIB (
|
|
||||||
HBITMAP hBitmap,
|
HANDLE wxBitmapToDIB (HBITMAP hBitmap, HPALETTE hPal)
|
||||||
HPALETTE hPal)
|
|
||||||
{
|
{
|
||||||
BITMAP Bitmap;
|
BITMAP Bitmap;
|
||||||
BITMAPINFOHEADER bmInfoHdr;
|
BITMAPINFOHEADER bmInfoHdr;
|
||||||
@@ -820,8 +881,10 @@ HANDLE wxBitmapToDIB (
|
|||||||
*lpbmInfoHdr = bmInfoHdr;
|
*lpbmInfoHdr = bmInfoHdr;
|
||||||
lpBits = wxFindDIBBits ((LPSTR) lpbmInfoHdr);
|
lpBits = wxFindDIBBits ((LPSTR) lpbmInfoHdr);
|
||||||
|
|
||||||
|
|
||||||
// Now, we need a DC to hold our bitmap. If the app passed us
|
// Now, we need a DC to hold our bitmap. If the app passed us
|
||||||
// a palette, it should be selected into the DC.
|
// a palette, it should be selected into the DC.
|
||||||
|
|
||||||
hMemDC = GetDC (NULL);
|
hMemDC = GetDC (NULL);
|
||||||
|
|
||||||
if (hPal)
|
if (hPal)
|
||||||
@@ -830,9 +893,12 @@ HANDLE wxBitmapToDIB (
|
|||||||
RealizePalette (hMemDC);
|
RealizePalette (hMemDC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// We're finally ready to get the DIB. Call the driver and let
|
// We're finally ready to get the DIB. Call the driver and let
|
||||||
// it party on our bitmap. It will fill in the color table,
|
// it party on our bitmap. It will fill in the color table,
|
||||||
// and bitmap bits of our global memory block.
|
// and bitmap bits of our global memory block.
|
||||||
|
|
||||||
if (!GetDIBits (hMemDC,
|
if (!GetDIBits (hMemDC,
|
||||||
hBitmap,
|
hBitmap,
|
||||||
0,
|
0,
|
||||||
@@ -848,23 +914,18 @@ HANDLE wxBitmapToDIB (
|
|||||||
else
|
else
|
||||||
GlobalUnlock (hDIB);
|
GlobalUnlock (hDIB);
|
||||||
|
|
||||||
|
|
||||||
// Finally, clean up and return.
|
// Finally, clean up and return.
|
||||||
|
|
||||||
if (hOldPal)
|
if (hOldPal)
|
||||||
SelectPalette (hMemDC, hOldPal, FALSE);
|
SelectPalette (hMemDC, hOldPal, FALSE);
|
||||||
|
|
||||||
ReleaseDC (NULL, hMemDC);
|
ReleaseDC (NULL, hMemDC);
|
||||||
|
|
||||||
return hDIB;
|
return hDIB;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
bool wxSaveBitmap(wxChar *filename, wxBitmap *bitmap, wxPalette *colourmap)
|
||||||
// FUNCTION :
|
|
||||||
// PURPOSE :
|
|
||||||
// RETURNS :
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
bool wxSaveBitmap(
|
|
||||||
wxChar *filename,
|
|
||||||
wxBitmap *bitmap,
|
|
||||||
wxPalette *colourmap)
|
|
||||||
{
|
{
|
||||||
HPALETTE hPalette = 0;
|
HPALETTE hPalette = 0;
|
||||||
if (colourmap)
|
if (colourmap)
|
||||||
@@ -880,4 +941,3 @@ bool wxSaveBitmap(
|
|||||||
else return FALSE;
|
else return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user