summaryrefslogtreecommitdiffstats
path: root/vcl/os2/source/gdi/salbmp.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/os2/source/gdi/salbmp.cxx')
-rw-r--r--vcl/os2/source/gdi/salbmp.cxx740
1 files changed, 0 insertions, 740 deletions
diff --git a/vcl/os2/source/gdi/salbmp.cxx b/vcl/os2/source/gdi/salbmp.cxx
deleted file mode 100644
index c6ee24011212..000000000000
--- a/vcl/os2/source/gdi/salbmp.cxx
+++ /dev/null
@@ -1,740 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org 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 version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include <svpm.h>
-
-#define _SV_SALBMP_CXX
-#include <rtl/alloc.h>
-#include <vcl/salbtype.hxx>
-#include <salgdi.h>
-#include <saldata.hxx>
-#include <salbmp.h>
-#include <vcl/bitmap.hxx> // for BitmapSystemData
-#include <string.h>
-
-#ifndef __H_FT2LIB
-#include <wingdi.h>
-#include <ft2lib.h>
-#endif
-
-// -----------
-// - Inlines -
-// -----------
-
-inline void ImplSetPixel4( const HPBYTE pScanline, long nX, const BYTE cIndex )
-{
- BYTE& rByte = pScanline[ nX >> 1 ];
-
- ( nX & 1 ) ? ( rByte &= 0xf0, rByte |= ( cIndex & 0x0f ) ) :
- ( rByte &= 0x0f, rByte |= ( cIndex << 4 ) );
-}
-
-// -------------
-// - Os2SalBitmap -
-// -------------
-
-Os2SalBitmap::Os2SalBitmap() :
- mhDIB ( 0 ),
- mhDIB1Subst ( 0 ),
- mhDDB ( 0 ),
- mnBitCount ( 0 )
-{
-}
-
-// ------------------------------------------------------------------
-
-Os2SalBitmap::~Os2SalBitmap()
-{
- Destroy();
-}
-
-// ------------------------------------------------------------------
-
-bool Os2SalBitmap::Create( HANDLE hBitmap, bool bDIB, bool bCopyHandle )
-{
- BOOL bRet = TRUE;
-
- if( bDIB )
- mhDIB = (HANDLE) ( bCopyHandle ? ImplCopyDIBOrDDB( hBitmap, TRUE ) : hBitmap );
- else
- mhDDB = (HBITMAP) ( bCopyHandle ? ImplCopyDIBOrDDB( hBitmap, FALSE ) : hBitmap );
-
- if( mhDIB )
- {
- // bitmap-header is the beginning of memory block
- PBITMAPINFOHEADER2 pBIH = (PBITMAPINFOHEADER2) mhDIB;
-
- maSize = Size( pBIH->cx, pBIH->cy );
- mnBitCount = pBIH->cBitCount;
-
- if( mnBitCount )
- mnBitCount = ( mnBitCount <= 1 ) ? 1 : ( mnBitCount <= 4 ) ? 4 : ( mnBitCount <= 8 ) ? 8 : 24;
- }
- else if( mhDDB )
- {
- BITMAPINFOHEADER2 aDDBInfoHeader;
-
- aDDBInfoHeader.cbFix = sizeof( aDDBInfoHeader );
-
- if( GpiQueryBitmapInfoHeader( mhDDB, &aDDBInfoHeader ) )
- {
- maSize = Size( aDDBInfoHeader.cx, aDDBInfoHeader.cy );
- mnBitCount = aDDBInfoHeader.cPlanes * aDDBInfoHeader.cBitCount;
-
- if( mnBitCount )
- {
- mnBitCount = ( mnBitCount <= 1 ) ? 1 :
- ( mnBitCount <= 4 ) ? 4 :
- ( mnBitCount <= 8 ) ? 8 : 24;
- }
- }
- else
- {
- mhDDB = 0;
- bRet = FALSE;
- }
-
- }
- else
- bRet = FALSE;
-
- return bRet;
-}
-
-// ------------------------------------------------------------------
-
-bool Os2SalBitmap::Create( const Size& rSize, USHORT nBitCount, const BitmapPalette& rPal )
-{
- bool bRet = FALSE;
-
- mhDIB = ImplCreateDIB( rSize, nBitCount, rPal );
-
- if( mhDIB )
- {
- maSize = rSize;
- mnBitCount = nBitCount;
- bRet = TRUE;
- }
-
- return bRet;
-}
-
-// ------------------------------------------------------------------
-
-bool Os2SalBitmap::Create( const SalBitmap& rSSalBitmap )
-{
- bool bRet = FALSE;
- const Os2SalBitmap& rSalBitmap = static_cast<const Os2SalBitmap&>(rSSalBitmap);
-
- if ( rSalBitmap.mhDIB || rSalBitmap.mhDDB )
- {
- HANDLE hNewHdl = ImplCopyDIBOrDDB( rSalBitmap.mhDIB ? rSalBitmap.mhDIB : rSalBitmap.mhDDB,
- rSalBitmap.mhDIB != 0 );
-
- if( hNewHdl )
- {
- if( rSalBitmap.mhDIB )
- mhDIB = (HANDLE) hNewHdl;
- else if( rSalBitmap.mhDDB )
- mhDDB = (HBITMAP) hNewHdl;
-
- maSize = rSalBitmap.maSize;
- mnBitCount = rSalBitmap.mnBitCount;
- bRet = TRUE;
- }
- }
-
- return bRet;
-}
-
-// ------------------------------------------------------------------
-
-bool Os2SalBitmap::Create( const SalBitmap& rSSalBmp, SalGraphics* pSGraphics )
-{
- bool bRet = FALSE;
- const Os2SalBitmap& rSalBmp = static_cast<const Os2SalBitmap&>(rSSalBmp);
- Os2SalGraphics* pGraphics = static_cast<Os2SalGraphics*>(pSGraphics);
-
- if( rSalBmp.mhDIB )
- {
- HPS hPS = pGraphics->mhPS;
- HBITMAP hNewDDB;
- BITMAPINFOHEADER2 aInfoHeader;
- const Size aSize( rSalBmp.GetSize() );
- long nFormat[ 2 ];
-
- memset( &aInfoHeader, 0, sizeof( aInfoHeader ) );
- aInfoHeader.cbFix = 16;
- aInfoHeader.cx = aSize.Width();
- aInfoHeader.cy = aSize.Height();
-
- GpiQueryDeviceBitmapFormats( hPS, 2L, (PLONG) &nFormat );
- aInfoHeader.cPlanes = nFormat[ 0 ];
- aInfoHeader.cBitCount = nFormat[ 1 ];
-
- // ! wegen Postscript-Treiber
- if( !aInfoHeader.cBitCount )
- aInfoHeader.cBitCount = 24;
- else if( ( aInfoHeader.cPlanes == 1 ) && ( aInfoHeader.cBitCount == 1 ) )
- aInfoHeader.cBitCount = 4;
-
- // BitCount == 1 ist wegen aller moeglichen Treiberfehler nicht moeglich
- if( rSalBmp.GetBitCount() == 1 )
- {
- HANDLE hTmp = ImplCreateDIB4FromDIB1( rSalBmp.mhDIB );
- PBYTE pBits = (PBYTE) hTmp + *(ULONG*) hTmp + ImplGetDIBColorCount( hTmp ) * sizeof( RGB2 );
-
- hNewDDB = GpiCreateBitmap( hPS, &aInfoHeader, CBM_INIT, pBits, (PBITMAPINFO2) hTmp );
- rtl_freeMemory( (void*)hTmp );
- }
- else
- {
- PBYTE pBits = (PBYTE) rSalBmp.mhDIB + *(ULONG*) rSalBmp.mhDIB + ImplGetDIBColorCount( rSalBmp.mhDIB ) * sizeof( RGB2 );
- hNewDDB = GpiCreateBitmap( hPS, &aInfoHeader, CBM_INIT, pBits, (PBITMAPINFO2) rSalBmp.mhDIB );
- }
-
- aInfoHeader.cbFix = sizeof( aInfoHeader );
-
- if( hNewDDB && GpiQueryBitmapInfoHeader( hNewDDB, &aInfoHeader ) )
- {
- mhDDB = hNewDDB;
- maSize = Size( aInfoHeader.cx, aInfoHeader.cy );
- mnBitCount = aInfoHeader.cPlanes * aInfoHeader.cBitCount;
-
- if( mnBitCount )
- {
- mnBitCount = ( mnBitCount <= 1 ) ? 1 :
- ( mnBitCount <= 4 ) ? 4 :
- ( mnBitCount <= 8 ) ? 8 : 24;
- }
-
- bRet = TRUE;
- }
- else if( hNewDDB )
- GpiDeleteBitmap( hNewDDB );
- }
-
- return bRet;
-}
-
-// ------------------------------------------------------------------
-
-bool Os2SalBitmap::Create( const SalBitmap& rSSalBmp, USHORT nNewBitCount )
-{
- bool bRet = FALSE;
- const Os2SalBitmap& rSalBmp = static_cast<const Os2SalBitmap&>(rSSalBmp);
-
- if( rSalBmp.mhDDB )
- {
- mhDIB = ImplCreateDIB( rSalBmp.maSize, nNewBitCount, BitmapPalette() );
-
- if( mhDIB )
- {
- // bitmap-header is the beginning of memory block
- PBITMAPINFO2 pBI = (PBITMAPINFO2) mhDIB;
- const int nLines = (int) rSalBmp.maSize.Height();
- PBYTE pBits = (PBYTE) pBI + *(ULONG*) pBI + ImplGetDIBColorCount( mhDIB ) * sizeof( RGB2 );
- SIZEL aSizeL = { rSalBmp.maSize.Width(), nLines };
- HAB hAB = GetSalData()->mhAB;
- DEVOPENSTRUC aDevOpenStruc = { NULL, (PSZ)"DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL };
- HDC hMemDC = DevOpenDC( hAB, OD_MEMORY, (PSZ)"*", 5L, (PDEVOPENDATA)&aDevOpenStruc, 0 );
- HPS hMemPS = Ft2CreatePS( hAB, hMemDC, &aSizeL, GPIT_MICRO | GPIA_ASSOC | PU_PELS );
- HBITMAP hMemOld = (HBITMAP) Ft2SetBitmap( hMemPS, rSalBmp.mhDDB );
-
- if( GpiQueryBitmapBits( hMemPS, 0, nLines, pBits, pBI ) == nLines )
- {
- maSize = rSalBmp.maSize;
- mnBitCount = nNewBitCount;
- bRet = TRUE;
- }
- else
- {
- rtl_freeMemory( (void*)mhDIB );
- mhDIB = 0;
- }
-
- Ft2SetBitmap( hMemPS, hMemOld );
- Ft2DestroyPS( hMemPS );
- DevCloseDC( hMemDC );
- }
- }
-
- return bRet;
-}
-
-// ------------------------------------------------------------------
-
-void Os2SalBitmap::Destroy()
-{
- if( mhDIB )
- rtl_freeMemory( (void*)mhDIB );
- else if( mhDDB )
- GpiDeleteBitmap( mhDDB );
-
- if( mhDIB1Subst )
- {
- rtl_freeMemory( (void*)mhDIB1Subst );
- mhDIB1Subst = NULL;
- }
-
- maSize = Size();
- mnBitCount = 0;
-}
-
-// ------------------------------------------------------------------
-
-void Os2SalBitmap::ImplReplacehDIB1Subst( HANDLE hDIB1Subst )
-{
- if( mhDIB1Subst )
- rtl_freeMemory( (void*)mhDIB1Subst );
-
- mhDIB1Subst = hDIB1Subst;
-}
-
-// ------------------------------------------------------------------
-
-USHORT Os2SalBitmap::ImplGetDIBColorCount( HANDLE hDIB )
-{
- USHORT nColors = 0;
-
- if( hDIB )
- {
- // bitmap infos can be found at the beginning of the memory
- PBITMAPINFOHEADER2 pBIH = (PBITMAPINFOHEADER2) hDIB;
-
- if( pBIH->cBitCount <= 8 )
- {
- if( pBIH->cclrUsed )
- nColors = (USHORT) pBIH->cclrUsed;
- else
- nColors = 1 << pBIH->cBitCount;
- }
- }
-
- return nColors;
-}
-
-// ------------------------------------------------------------------
-
-HANDLE Os2SalBitmap::ImplCreateDIB( const Size& rSize, USHORT nBits, const BitmapPalette& rPal )
-{
- DBG_ASSERT( nBits == 1 || nBits == 4 || nBits == 8 || nBits == 24, "Unsupported BitCount!" );
-
- HANDLE hDIB = 0;
-
- if ( rSize.Width() && rSize.Height() && ( nBits == 1 || nBits == 4 || nBits == 8 || nBits == 24 ) )
- {
- const ULONG nImageSize = AlignedWidth4Bytes( nBits * rSize.Width() ) * rSize.Height();
- const USHORT nColors = ( nBits <= 8 ) ? ( 1 << nBits ) : 0;
-
- hDIB = (HANDLE) rtl_allocateZeroMemory( sizeof( BITMAPINFOHEADER2 ) + nColors * sizeof( RGB2 ) + nImageSize );
-
- if( hDIB )
- {
- // bitmap infos can be found at the beginning of the memory
- PBITMAPINFO2 pBI = (PBITMAPINFO2) hDIB;
- PBITMAPINFOHEADER2 pBIH = (PBITMAPINFOHEADER2) pBI;
-
- pBIH->cbFix = sizeof( BITMAPINFOHEADER2 );
- pBIH->cx = rSize.Width();
- pBIH->cy = rSize.Height();
- pBIH->cPlanes = 1;
- pBIH->cBitCount = nBits;
- pBIH->ulCompression = BCA_UNCOMP; // BI_RGB;
- pBIH->cbImage = nImageSize;
- pBIH->cxResolution = 0;
- pBIH->cyResolution = 0;
- pBIH->cclrUsed = 0;
- pBIH->cclrImportant = 0;
-
- // Rest auf 0 setzen
- memset( (PBYTE) &pBIH->usUnits, 0, (PBYTE) pBI->argbColor - (PBYTE) &pBIH->usUnits );
-
- if( nColors )
- {
- const USHORT nMinCount = Min( nColors, rPal.GetEntryCount() );
-
- if( nMinCount )
- memcpy( pBI->argbColor, rPal.ImplGetColorBuffer(), nMinCount * sizeof( RGB2 ) );
- }
- }
- }
-
- return hDIB;
-}
-
-// ------------------------------------------------------------------
-
-HANDLE Os2SalBitmap::ImplCreateDIB4FromDIB1( HANDLE hDIB1 )
-{
- PBITMAPINFO2 pBI = (PBITMAPINFO2) hDIB1;
- PBITMAPINFOHEADER2 pBIH = (PBITMAPINFOHEADER2) pBI;
- PBYTE pBits = (PBYTE) pBI + *(ULONG*) pBIH + Os2SalBitmap::ImplGetDIBColorCount( hDIB1 ) * sizeof( RGB2 );
- ULONG nWidth = pBIH->cx, nHeight = pBIH->cy;
- ULONG nAligned = AlignedWidth4Bytes( nWidth );
- ULONG nAligned4 = AlignedWidth4Bytes( nWidth << 2 );
- ULONG nSize4 = sizeof( BITMAPINFOHEADER2 ) + ( sizeof( RGB2 ) << 4 ) + nAligned4 * nHeight;
- PBYTE pDIB4 = (PBYTE) rtl_allocateZeroMemory( nSize4 );
- PBITMAPINFO2 pBI4 = (PBITMAPINFO2) pDIB4;
- PBITMAPINFOHEADER2 pBIH4 = (PBITMAPINFOHEADER2) pBI4;
- BYTE aMap[ 4 ] = { 0x00, 0x01, 0x10, 0x11 };
-
- memset( pBIH4, 0, sizeof( BITMAPINFOHEADER2 ) );
- pBIH4->cbFix = sizeof( BITMAPINFOHEADER2 );
- pBIH4->cx = nWidth;
- pBIH4->cy = nHeight;
- pBIH4->cPlanes = 1;
- pBIH4->cBitCount = 4;
-
- // die ersten beiden Eintraege der 1Bit-Farbtabelle kopieren
- memcpy( pBI4->argbColor, pBI->argbColor, sizeof( RGB2 ) << 1 );
-
- PBYTE pBits4 = (PBYTE) pBI4 + *(ULONG*) pBIH4 + ( sizeof( RGB2 ) << 4 );
-
- // 4Bit-DIB-Bilddaten setzen
- for( ULONG nY = 0UL; nY < nHeight; nY++ )
- {
- PBYTE pTmp = pBits; pBits += nAligned;
- PBYTE pTmp4 = pBits4; pBits4 += nAligned4;
-
- for( ULONG nX = 0UL; nX < nWidth; nX += 8UL )
- {
- *pTmp4++ = aMap[ ( *pTmp >> 6 ) & 3 ];
- *pTmp4++ = aMap[ ( *pTmp >> 4 ) & 3 ];
- *pTmp4++ = aMap[ ( *pTmp >> 2 ) & 3 ];
- *pTmp4++ = aMap[ *pTmp++ & 3 ];
- }
- }
-
- return (HANDLE) pDIB4;
-}
-
-// ------------------------------------------------------------------
-
-HANDLE Os2SalBitmap::ImplCopyDIBOrDDB( HANDLE hHdl, BOOL bDIB )
-{
- HANDLE hCopy = 0;
-
- if( bDIB && hHdl )
- {
- PBITMAPINFOHEADER2 pBIH = (PBITMAPINFOHEADER2) hHdl;
- const ULONG nSize = sizeof( BITMAPINFOHEADER2 )
- + ImplGetDIBColorCount( hHdl ) * sizeof( RGB2 ) +
- ( pBIH->cbImage ? pBIH->cbImage : AlignedWidth4Bytes( pBIH->cx * pBIH->cBitCount ) );
-
- BYTE* pCopy = (BYTE*)rtl_allocateZeroMemory( nSize );
- memcpy( pCopy, (BYTE*) hHdl, nSize );
- hCopy = (HANDLE) pCopy;
- }
- else if( hHdl )
- {
- HAB hAB = GetSalData()->mhAB;
- HDC hSrcMemDC;
- HDC hDestMemDC;
- HPS hSrcMemPS;
- HPS hDestMemPS;
- HBITMAP hCopyBitmap;
- BITMAPINFOHEADER2 aInfoHeader;
- DEVOPENSTRUC aDevOpenStruc;
- SIZEL size;
-
- aInfoHeader.cbFix = sizeof( BITMAPINFOHEADER2 );
- GpiQueryBitmapInfoHeader( hHdl, &aInfoHeader );
- size.cx = aInfoHeader.cx;
- size.cy = aInfoHeader.cy;
-
- // Memory DCs erzeugen
- aDevOpenStruc.pszLogAddress = 0;
- aDevOpenStruc.pszDriverName = (PSZ)"DISPLAY";
-
- hSrcMemDC = DevOpenDC( hAB, OD_MEMORY, (PSZ)"*", 2, (PDEVOPENDATA)&aDevOpenStruc, 0 );
- hDestMemDC = DevOpenDC( hAB, OD_MEMORY, (PSZ)"*", 2, (PDEVOPENDATA)&aDevOpenStruc, 0 );
-
- // Memory PSs erzeugen
- hSrcMemPS = Ft2CreatePS( hAB, hSrcMemDC, &size, GPIT_MICRO | GPIA_ASSOC | PU_PELS );
- hDestMemPS = Ft2CreatePS( hAB, hDestMemDC, &size, GPIT_MICRO | GPIA_ASSOC | PU_PELS );
-
- Ft2SetBitmap( hSrcMemPS, hHdl );
-
- if( !hHdl )
- {
- memset( &aInfoHeader, 0, sizeof( BITMAPINFOHEADER2 ) );
- aInfoHeader.cbFix = sizeof( BITMAPINFOHEADER2 );
- aInfoHeader.cx = 0;
- aInfoHeader.cy = 0;
- aInfoHeader.cPlanes = 1;
- aInfoHeader.cBitCount = 1;
- }
-
- hCopy = GpiCreateBitmap( hDestMemPS, &aInfoHeader, 0, NULL, NULL );
- Ft2SetBitmap( hDestMemPS, hCopy );
-
- POINTL pts[3];
-
- pts[0].x = 0;
- pts[0].y = 0;
- pts[1].x = size.cx;
- pts[1].y = size.cy;
- pts[2].x = 0;
- pts[2].y = 0;
-
- GpiBitBlt( hDestMemPS, hSrcMemPS, 3, pts, ROP_SRCCOPY, BBO_IGNORE );
-
- Ft2SetBitmap( hSrcMemPS, (HBITMAP)0L);
- Ft2SetBitmap( hDestMemPS, (HBITMAP)0L);
- Ft2Associate( hSrcMemPS, NULLHANDLE );
- Ft2Associate( hDestMemPS, NULLHANDLE );
- Ft2DestroyPS( hSrcMemPS );
- Ft2DestroyPS( hDestMemPS );
- DevCloseDC( hSrcMemDC );
- DevCloseDC( hDestMemDC );
- }
-
- return hCopy;
-}
-
-// ------------------------------------------------------------------
-
-BitmapBuffer* Os2SalBitmap::AcquireBuffer( bool bReadOnly )
-{
- BitmapBuffer* pBuffer = NULL;
-
- if( mhDIB )
- {
- // bitmap infos can be found at the beginning of the memory
- PBITMAPINFO2 pBI = (PBITMAPINFO2) mhDIB;
- PBITMAPINFOHEADER2 pBIH = (PBITMAPINFOHEADER2) pBI;
-
- if( ( pBIH->ulCompression == BCA_RLE4 ) || ( pBIH->ulCompression == BCA_RLE8 ) )
- {
- Size aSizePix( pBIH->cx, pBIH->cy );
- HANDLE hNewDIB = ImplCreateDIB( aSizePix, pBIH->cBitCount, BitmapPalette() );
-
- if( hNewDIB )
- {
- // bitmap infos can be found at the beginning of the memory
- PBITMAPINFO2 pNewBI = (PBITMAPINFO2) hNewDIB;
- PBITMAPINFOHEADER2 pNewBIH = (PBITMAPINFOHEADER2) pNewBI;
- const USHORT nColorCount = ImplGetDIBColorCount( hNewDIB );
- const ULONG nOffset = *(ULONG*) pBI + nColorCount * sizeof( RGB2 );
- BYTE* pOldBits = (BYTE*) pBI + nOffset;
- BYTE* pNewBits = (BYTE*) pNewBI + nOffset;
-
- memcpy( pNewBI, pBI, nOffset );
- pNewBIH->ulCompression = 0;
- ImplDecodeRLEBuffer( pOldBits, pNewBits, aSizePix, pBIH->ulCompression == BCA_RLE4 );
-
- rtl_freeMemory( (void*)mhDIB );
-
- mhDIB = hNewDIB;
- pBI = pNewBI;
- pBIH = pNewBIH;
- }
- }
-
- if( pBIH->cPlanes == 1 )
- {
- pBuffer = new BitmapBuffer;
-
- pBuffer->mnFormat = BMP_FORMAT_BOTTOM_UP |
- ( pBIH->cBitCount == 1 ? BMP_FORMAT_1BIT_MSB_PAL :
- pBIH->cBitCount == 4 ? BMP_FORMAT_4BIT_MSN_PAL :
- pBIH->cBitCount == 8 ? BMP_FORMAT_8BIT_PAL :
- pBIH->cBitCount == 16 ? BMP_FORMAT_16BIT_TC_LSB_MASK :
- pBIH->cBitCount == 24 ? BMP_FORMAT_24BIT_TC_BGR :
- pBIH->cBitCount == 32 ? BMP_FORMAT_32BIT_TC_MASK : 0UL );
-
- if( BMP_SCANLINE_FORMAT( pBuffer->mnFormat ) )
- {
- pBuffer->mnWidth = maSize.Width();
- pBuffer->mnHeight = maSize.Height();
- pBuffer->mnScanlineSize = AlignedWidth4Bytes( maSize.Width() * pBIH->cBitCount );
- pBuffer->mnBitCount = (USHORT) pBIH->cBitCount;
-
- if( pBuffer->mnBitCount <= 8 )
- {
- const USHORT nPalCount = ImplGetDIBColorCount( mhDIB );
-
- pBuffer->maPalette.SetEntryCount( nPalCount );
-
- if( nPalCount )
- memcpy( pBuffer->maPalette.ImplGetColorBuffer(), pBI->argbColor, nPalCount * sizeof( RGB2 ) );
-
- pBuffer->mpBits = (BYTE*) pBI + *(ULONG*) pBI + nPalCount * sizeof( RGB2 );
- }
- else
- pBuffer->mpBits = (BYTE*) pBI + *(ULONG*) pBI;
- }
- else
- {
- delete pBuffer;
- pBuffer = NULL;
- }
- }
- }
-
- if( pBuffer && mhDIB1Subst )
- {
- rtl_freeMemory( (void*)mhDIB1Subst );
- mhDIB1Subst = 0;
- }
-
- return pBuffer;
-}
-
-// ------------------------------------------------------------------
-
-void Os2SalBitmap::ReleaseBuffer( BitmapBuffer* pBuffer, bool bReadOnly )
-{
- if( pBuffer )
- {
- if( mhDIB )
- {
- if( !bReadOnly && !!pBuffer->maPalette )
- {
- // bitmap infos can be found at the beginning of the memory
- PBITMAPINFO2 pBI = (PBITMAPINFO2) mhDIB;
- const USHORT nCount = pBuffer->maPalette.GetEntryCount();
-
- if( nCount )
- memcpy( pBI->argbColor, pBuffer->maPalette.ImplGetColorBuffer(), nCount * sizeof( RGB2 ) );
- }
- }
-
- delete pBuffer;
- }
-}
-
-// ------------------------------------------------------------------
-
-void Os2SalBitmap::ImplDecodeRLEBuffer( const BYTE* pSrcBuf, BYTE* pDstBuf,
- const Size& rSizePixel, BOOL bRLE4 )
-{
- HPBYTE pRLE = (HPBYTE) pSrcBuf;
- HPBYTE pDIB = (HPBYTE) pDstBuf;
- HPBYTE pRow = (HPBYTE) pDstBuf;
- ULONG nWidthAl = AlignedWidth4Bytes( rSizePixel.Width() * ( bRLE4 ? 4UL : 8UL ) );
- HPBYTE pLast = pDIB + rSizePixel.Height() * nWidthAl - 1;
- ULONG nCountByte;
- ULONG nRunByte;
- ULONG nX = 0;
- ULONG i;
- BYTE cTmp;
- BOOL bEndDecoding = FALSE;
-
- if( pRLE && pDIB )
- {
- do
- {
- if( !( nCountByte = *pRLE++ ) )
- {
- nRunByte = *pRLE++;
-
- if( nRunByte > 2UL )
- {
- if( bRLE4 )
- {
- nCountByte = nRunByte >> 1UL;
-
- for( i = 0; i < nCountByte; i++ )
- {
- cTmp = *pRLE++;
- ImplSetPixel4( pDIB, nX++, cTmp >> 4 );
- ImplSetPixel4( pDIB, nX++, cTmp & 0x0f );
- }
-
- if( nRunByte & 1 )
- ImplSetPixel4( pDIB, nX++, *pRLE++ >> 4 );
-
- if( ( ( nRunByte + 1 ) >> 1 ) & 1 )
- pRLE++;
- }
- else
- {
- memcpy( &pDIB[ nX ], pRLE, nRunByte );
- pRLE += nRunByte;
- nX += nRunByte;
-
- if( nRunByte & 1 )
- pRLE++;
- }
- }
- else if( !nRunByte )
- {
- pDIB = ( pRow += nWidthAl );
- nX = 0UL;
- }
- else if( nRunByte == 1 )
- bEndDecoding = TRUE;
- else
- {
- nX += *pRLE++;
- pDIB = ( pRow += ( *pRLE++ ) * nWidthAl );
- }
- }
- else
- {
- cTmp = *pRLE++;
-
- if( bRLE4 )
- {
- nRunByte = nCountByte >> 1;
-
- for( i = 0; i < nRunByte; i++ )
- {
- ImplSetPixel4( pDIB, nX++, cTmp >> 4 );
- ImplSetPixel4( pDIB, nX++, cTmp & 0x0f );
- }
-
- if( nCountByte & 1 )
- ImplSetPixel4( pDIB, nX++, cTmp >> 4 );
- }
- else
- {
- for( i = 0; i < nCountByte; i++ )
- pDIB[ nX++ ] = cTmp;
- }
- }
- }
- while( !bEndDecoding && ( pDIB <= pLast ) );
- }
-}
-
-bool Os2SalBitmap::GetSystemData( BitmapSystemData& rData )
-{
- bool bRet = false;
- if( mhDIB || mhDDB )
- {
- bRet = true;
- rData.pDIB = (void*)mhDIB;
- rData.pDDB = (void*)mhDDB;
- }
- return bRet;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */