diff options
Diffstat (limited to 'vcl/os2/source/gdi/salgdi2.cxx')
-rw-r--r-- | vcl/os2/source/gdi/salgdi2.cxx | 786 |
1 files changed, 0 insertions, 786 deletions
diff --git a/vcl/os2/source/gdi/salgdi2.cxx b/vcl/os2/source/gdi/salgdi2.cxx deleted file mode 100644 index 2ab59b8a3c46..000000000000 --- a/vcl/os2/source/gdi/salgdi2.cxx +++ /dev/null @@ -1,786 +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 <string.h> -#include <svpm.h> - -#define _SV_SALGDI2_CXX -#include <salbmp.h> -#include <saldata.hxx> -#include <salids.hrc> -#include <salgdi.h> -#include <salvd.h> -#include <vcl/salbtype.hxx> - -#ifndef __H_FT2LIB -#include <wingdi.h> -#include <ft2lib.h> -#endif - -BOOL bFastTransparent = FALSE; - -// ----------- -// - Defines - -// ----------- - -#define RGBCOLOR( r, g, b ) ((ULONG)(((BYTE)(b)|((USHORT)(g)<<8))|(((ULONG)(BYTE)(r))<<16))) -#define TY( y ) (mnHeight-(y)-1) - -// --------------- -// - SalGraphics - -// --------------- - -bool Os2SalGraphics::supportsOperation( OutDevSupportType ) const -{ - return false; -} - - -void Os2SalGraphics::copyBits( const SalTwoRect* pPosAry, SalGraphics* pSrcGraphics ) -{ - HPS hSrcPS; - POINTL thePoints[4]; - long nSrcHeight; - - if ( pSrcGraphics ) - { - //hSrcPS = pSrcGraphics->mhPS; - //nSrcHeight = pSrcGraphics->mnHeight; - hSrcPS = static_cast<Os2SalGraphics*>(pSrcGraphics)->mhPS; - nSrcHeight = static_cast<Os2SalGraphics*>(pSrcGraphics)->mnHeight; - } - else - { - hSrcPS = mhPS; - nSrcHeight = mnHeight; - } - - // lower-left corner of target - thePoints[0].x = pPosAry->mnDestX; - thePoints[0].y = TY( pPosAry->mnDestY + pPosAry->mnDestHeight - 1 ); - - // upper-right corner of target - thePoints[1].x = pPosAry->mnDestX + pPosAry->mnDestWidth; - thePoints[1].y = TY( pPosAry->mnDestY - 1 ); - - // lower-left corner of source - thePoints[2].x = pPosAry->mnSrcX; - thePoints[2].y = nSrcHeight - ( pPosAry->mnSrcY + pPosAry->mnSrcHeight ); - - if ( ( pPosAry->mnDestWidth != pPosAry->mnSrcWidth ) || ( pPosAry->mnDestHeight != pPosAry->mnSrcHeight ) ) - { - // upper-right corner of Source - thePoints[3].x = pPosAry->mnSrcX + pPosAry->mnSrcWidth; - thePoints[3].y = nSrcHeight - pPosAry->mnSrcY + pPosAry->mnSrcHeight; - - GpiBitBlt( mhPS, hSrcPS, 4, thePoints, - mbXORMode ? ROP_SRCINVERT : ROP_SRCCOPY, BBO_IGNORE ); - } - else - { - GpiBitBlt( mhPS, hSrcPS, 3, thePoints, - mbXORMode ? ROP_SRCINVERT : ROP_SRCCOPY, BBO_IGNORE ); - } -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::copyArea( long nDestX, long nDestY, - long nSrcX, long nSrcY, - long nSrcWidth, long nSrcHeight, - USHORT nFlags ) -{ - POINTL thePoints[3]; - - // lower-left corner of target - thePoints[0].x = nDestX; - thePoints[0].y = TY( nDestY + nSrcHeight - 1 ); - - // upper-right corner of target - thePoints[1].x = nDestX + nSrcWidth; - thePoints[1].y = TY( nDestY - 1 ); - - // lower-left corner of source - thePoints[2].x = nSrcX; - thePoints[2].y = TY( nSrcY + nSrcHeight - 1); - - if ( (nFlags & SAL_COPYAREA_WINDOWINVALIDATE) && mbWindow ) - { - // Overlap-Bereich berechnen und invalidieren - Point aVCLSrcPos( nSrcX, nSrcY ); - Size aVCLSrcSize( nSrcWidth, nSrcHeight ); - Rectangle aVCLSrcRect( aVCLSrcPos, aVCLSrcSize ); - Rectangle aVCLClipRect; - SWP aSWP; - - WinQueryWindowPos( mhWnd, &aSWP ); - aVCLClipRect.Right() = aSWP.cx-1; - aVCLClipRect.Bottom() = aSWP.cy-1; - if ( !aVCLSrcRect.Intersection( aVCLClipRect ).IsEmpty() ) - { - RECTL aSrcRect; - RECTL aTempRect; - HRGN hInvalidateRgn; - HRGN hTempRgn; - HWND hWnd; - long nRgnType; - - long nVCLScrHeight = aVCLSrcRect.GetHeight(); - aSrcRect.xLeft = aVCLSrcRect.Left(); - aSrcRect.yBottom = TY( aVCLSrcRect.Top()+nVCLScrHeight-1 ); - aSrcRect.xRight = aSrcRect.xLeft+aVCLSrcRect.GetWidth(); - aSrcRect.yTop = aSrcRect.yBottom+nVCLScrHeight; - - // Rechteck in Screen-Koordinaaten umrechnen - POINTL aPt; - long nScreenDX = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ); - long nScreenDY = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ); - aPt.x = 0; - aPt.y = 0; - WinMapWindowPoints( mhWnd, HWND_DESKTOP, &aPt, 1 ); - aSrcRect.xLeft += aPt.x; - aSrcRect.yTop += aPt.y; - aSrcRect.xRight += aPt.x; - aSrcRect.yBottom += aPt.y; - hInvalidateRgn = 0; - // Bereiche ausserhalb des sichtbaren Bereiches berechnen - if ( aSrcRect.xLeft < 0 ) - { - if ( !hInvalidateRgn ) - hInvalidateRgn = GpiCreateRegion( mhPS, 1, &aSrcRect ); - aTempRect.xLeft = -31999; - aTempRect.yBottom = 0; - aTempRect.xRight = 0; - aTempRect.yTop = 31999; - hTempRgn = GpiCreateRegion( mhPS, 1, &aTempRect ); - GpiCombineRegion( mhPS, hInvalidateRgn, hInvalidateRgn, hTempRgn, CRGN_DIFF ); - GpiDestroyRegion( mhPS, hTempRgn ); - } - if ( aSrcRect.yBottom < 0 ) - { - if ( !hInvalidateRgn ) - hInvalidateRgn = GpiCreateRegion( mhPS, 1, &aSrcRect ); - aTempRect.xLeft = 0; - aTempRect.yBottom = -31999; - aTempRect.xRight = 31999; - aTempRect.yTop = 0; - hTempRgn = GpiCreateRegion( mhPS, 1, &aTempRect ); - GpiCombineRegion( mhPS, hInvalidateRgn, hInvalidateRgn, hTempRgn, CRGN_DIFF ); - GpiDestroyRegion( mhPS, hTempRgn ); - } - if ( aSrcRect.xRight > nScreenDX ) - { - if ( !hInvalidateRgn ) - hInvalidateRgn = GpiCreateRegion( mhPS, 1, &aSrcRect ); - aTempRect.xLeft = nScreenDX; - aTempRect.yBottom = 0; - aTempRect.xRight = 31999; - aTempRect.yTop = 31999; - hTempRgn = GpiCreateRegion( mhPS, 1, &aTempRect ); - GpiCombineRegion( mhPS, hInvalidateRgn, hInvalidateRgn, hTempRgn, CRGN_DIFF ); - GpiDestroyRegion( mhPS, hTempRgn ); - } - if ( aSrcRect.yTop > nScreenDY ) - { - if ( !hInvalidateRgn ) - hInvalidateRgn = GpiCreateRegion( mhPS, 1, &aSrcRect ); - aTempRect.xLeft = 0; - aTempRect.yBottom = nScreenDY; - aTempRect.xRight = 31999; - aTempRect.yTop = 31999; - hTempRgn = GpiCreateRegion( mhPS, 1, &aTempRect ); - GpiCombineRegion( mhPS, hInvalidateRgn, hInvalidateRgn, hTempRgn, CRGN_DIFF ); - GpiDestroyRegion( mhPS, hTempRgn ); - } - - // Bereiche die von anderen Fenstern ueberlagert werden berechnen - // Calculate areas that are overlapped by other windows - HWND hWndParent = WinQueryWindow( mhWnd, QW_PARENT ); - hWnd = WinQueryWindow( HWND_DESKTOP, QW_TOP ); - aVCLSrcRect = Rectangle( aSrcRect.xLeft, aSrcRect.yBottom, aSrcRect.xRight, aSrcRect.yTop ); - while ( hWnd ) - { - if ( hWnd == hWndParent ) - break; - if ( WinIsWindowVisible( hWnd ) ) - { - WinQueryWindowPos( hWnd, &aSWP ); - if ( !(aSWP.fl & SWP_MINIMIZE) ) - { - aVCLClipRect = Rectangle( Point( aSWP.x, aSWP.y ), Size( aSWP.cx, aSWP.cy ) ); - if ( aVCLSrcRect.IsOver( aVCLClipRect ) ) - { - if ( !hInvalidateRgn ) - hInvalidateRgn = GpiCreateRegion( mhPS, 1, &aSrcRect ); - aTempRect.xLeft = aSWP.x; - aTempRect.yBottom = aSWP.y; - aTempRect.xRight = aTempRect.xLeft+aSWP.cx; - aTempRect.yTop = aTempRect.yBottom+aSWP.cy; - hTempRgn = GpiCreateRegion( mhPS, 1, &aTempRect ); - GpiCombineRegion( mhPS, hInvalidateRgn, hInvalidateRgn, hTempRgn, CRGN_DIFF ); - GpiDestroyRegion( mhPS, hTempRgn ); - } - } - } - hWnd = WinQueryWindow( hWnd, QW_NEXT ); - } - - if ( hInvalidateRgn ) - { - hTempRgn = GpiCreateRegion( mhPS, 1, &aSrcRect ); - nRgnType = GpiCombineRegion( mhPS, hInvalidateRgn, hTempRgn, hInvalidateRgn, CRGN_DIFF ); - GpiDestroyRegion( mhPS, hTempRgn ); - if ( (nRgnType != RGN_ERROR) && (nRgnType != RGN_NULL) ) - { - long nOffX = (nDestX-nSrcX); - long nOffY = (nSrcY-nDestY); - aPt.x = nOffX-aPt.x; - aPt.y = nOffY-aPt.y; - GpiOffsetRegion( mhPS, hInvalidateRgn, &aPt ); - WinInvalidateRegion( mhWnd, hInvalidateRgn, TRUE ); - // Hier loesen wir nur ein Update aus, wenn es der - // MainThread ist, damit es beim Bearbeiten der - // Paint-Message keinen Deadlock gibt, da der - // SolarMutex durch diesen Thread schon gelockt ist - SalData* pSalData = GetSalData(); - ULONG nCurThreadId = GetCurrentThreadId(); - if ( pSalData->mnAppThreadId == nCurThreadId ) - WinUpdateWindow( mhWnd ); - } - GpiDestroyRegion( mhPS, hInvalidateRgn ); - } - } - } - - GpiBitBlt( mhPS, mhPS, 3, thePoints, - ROP_SRCCOPY, BBO_IGNORE ); - -} - -// ----------------------------------------------------------------------- - -void ImplDrawBitmap( HPS hPS, long nScreenHeight, - const SalTwoRect* pPosAry, const Os2SalBitmap& rSalBitmap, - BOOL bPrinter, int nDrawMode ) -{ - if( hPS ) - { - HANDLE hDrawDIB; - HBITMAP hDrawDDB = rSalBitmap.ImplGethDDB(); - Os2SalBitmap* pTmpSalBmp = NULL; - BOOL bPrintDDB = ( bPrinter && hDrawDDB ); - BOOL bDrawDDB1 = ( ( rSalBitmap.GetBitCount() == 1 ) && hDrawDDB ); - - if( bPrintDDB || bDrawDDB1 ) - { - pTmpSalBmp = new Os2SalBitmap; - pTmpSalBmp->Create( rSalBitmap, rSalBitmap.GetBitCount() ); - hDrawDIB = pTmpSalBmp->ImplGethDIB(); - } - else - hDrawDIB = rSalBitmap.ImplGethDIB(); - - if( hDrawDIB ) - { - HANDLE hSubst = rSalBitmap.ImplGethDIB1Subst(); - POINTL pts[ 4 ]; - BITMAPINFO2* pBI = (BITMAPINFO2*) hDrawDIB; - BITMAPINFOHEADER2* pBIH = (BITMAPINFOHEADER2*) pBI; - const long nHeight = pBIH->cy; - long nInfoSize = *(ULONG*) pBI + rSalBitmap.ImplGetDIBColorCount( hDrawDIB ) * sizeof( RGB2 ); - BYTE* pBits = (BYTE*) pBI + nInfoSize; - - pts[0].x = pPosAry->mnDestX; - pts[0].y = nScreenHeight - pPosAry->mnDestY - pPosAry->mnDestHeight; - pts[1].x = pPosAry->mnDestX + pPosAry->mnDestWidth - 1; - pts[1].y = nScreenHeight - pPosAry->mnDestY - 1; - - pts[2].x = pPosAry->mnSrcX; - pts[2].y = nHeight - ( pPosAry->mnSrcY + pPosAry->mnSrcHeight ); - pts[3].x = pPosAry->mnSrcX + pPosAry->mnSrcWidth; - pts[3].y = nHeight - pPosAry->mnSrcY; - - // if we've got a 1Bit DIB, we create a 4Bit substitute - if( ( pBIH->cBitCount == 1 ) && !hSubst ) - { - // create 4Bit substitute - hSubst = Os2SalBitmap::ImplCreateDIB4FromDIB1( hDrawDIB ); - - // replace substitute only, if it is no temporary SalBitmap - if( !( bPrintDDB || bDrawDDB1 ) ) - ( (Os2SalBitmap&) rSalBitmap ).ImplReplacehDIB1Subst( hSubst ); - } - - if( hSubst ) - { - pBI = (BITMAPINFO2*) hSubst; - pBIH = (BITMAPINFOHEADER2*) pBI; - nInfoSize = *(ULONG*) pBI + rSalBitmap.ImplGetDIBColorCount( hSubst ) * sizeof( RGB2 ); - pBits = (BYTE*) pBI + nInfoSize; - } - - if( bPrinter ) - { - BYTE* pDummy; - - // expand 8Bit-DIB's to 24Bit-DIB's, because some printer drivers - // have problems to print these DIB's (strange) - if( pBIH->cBitCount == 8 && pBIH->ulCompression == BCA_UNCOMP ) - { - const long nWidth = pBIH->cx; - const long nHeight = pBIH->cy; - const long nWidthAl8 = AlignedWidth4Bytes( nWidth * 8 ); - const long nWidthAl24 = AlignedWidth4Bytes( nWidth * 24 ); - const long nNewImageSize = nHeight * nWidthAl24; - BITMAPINFOHEADER2* pNewInfo; - - pDummy = new BYTE[ sizeof( BITMAPINFO2 ) + nNewImageSize ]; - memset( pDummy, 0, sizeof( BITMAPINFO2 ) ); - - pNewInfo = (BITMAPINFOHEADER2*) pDummy; - pNewInfo->cbFix = sizeof( BITMAPINFOHEADER2 ); - pNewInfo->cx = nWidth; - pNewInfo->cy = nHeight; - pNewInfo->cPlanes = 1; - pNewInfo->cBitCount = 24; - pNewInfo->ulCompression = BCA_UNCOMP; - pNewInfo->cbImage = nNewImageSize; - - BYTE* pBitsSrc = (BYTE*) pBIH + nInfoSize; - BYTE* pBitsDst = pDummy + sizeof( BITMAPINFO2 ); - - for( long nY = 0UL; nY < nHeight; nY++ ) - { - BYTE* pSrcLine = pBitsSrc + nY * nWidthAl8; - BYTE* pDstLine = pBitsDst + nY * nWidthAl24; - - for( long nX = 0UL; nX < nWidth; nX++ ) - { - const RGB2& rQuad = pBI->argbColor[ *pSrcLine++ ]; - - *pDstLine++ = rQuad.bBlue; - *pDstLine++ = rQuad.bGreen; - *pDstLine++ = rQuad.bRed; - } - } - - nInfoSize = sizeof( BITMAPINFO2 ); - } - else - { - const long nImageSize = ( pBIH->cbImage ? pBIH->cbImage : ( pBIH->cy * AlignedWidth4Bytes( pBIH->cx * pBIH->cBitCount ) ) ); - const long nTotalSize = nInfoSize + nImageSize; - - pDummy = new BYTE[ nTotalSize ]; - memcpy( pDummy, pBI, nTotalSize ); - } - - GpiDrawBits( hPS, pDummy + nInfoSize, (BITMAPINFO2*) pDummy, 4L, pts, nDrawMode, BBO_IGNORE ); - delete[] pDummy; - } - else - GpiDrawBits( hPS, pBits, pBI, 4L, pts, nDrawMode, BBO_IGNORE ); - } - else if( hDrawDDB && !bPrintDDB ) - { - POINTL pts[ 4 ]; - - pts[0].x = pPosAry->mnDestX; - pts[0].y = nScreenHeight - pPosAry->mnDestY - pPosAry->mnDestHeight; - pts[1].x = pPosAry->mnDestX + pPosAry->mnDestWidth - 1; - pts[1].y = nScreenHeight - pPosAry->mnDestY - 1; - - pts[2].x = pPosAry->mnSrcX; - pts[2].y = rSalBitmap.GetSize().Height() - ( pPosAry->mnSrcY + pPosAry->mnSrcHeight ); - pts[3].x = pPosAry->mnSrcX + pPosAry->mnSrcWidth; - pts[3].y = rSalBitmap.GetSize().Height() - pPosAry->mnSrcY; - - GpiWCBitBlt( hPS, hDrawDDB, 4L, pts, nDrawMode, BBO_IGNORE ); -/* - HPS hDrawPS = ImplGetCachedPS( CACHED_HPS_DRAW, hDrawDDB ); - Ft2BitBlt( hPS, hDrawPS, 4, pts, nDrawMode, BBO_IGNORE ); - ImplReleaseCachedPS( CACHED_HPS_DRAW ); -*/ - } - - if( bPrintDDB || bDrawDDB1 ) - delete pTmpSalBmp; - } -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::drawBitmap( const SalTwoRect* pPosAry, - const SalBitmap& rSalBitmap ) -{ - ImplDrawBitmap( mhPS, mnHeight, - pPosAry, static_cast<const Os2SalBitmap&>(rSalBitmap), - mbPrinter, - mbXORMode ? ROP_SRCINVERT : ROP_SRCCOPY ); -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::drawBitmap( const SalTwoRect* pPosAry, - const SalBitmap& rSalBitmap, - SalColor nTransparentColor ) -{ - DBG_ASSERT( !mbPrinter, "No transparency print possible!" ); - //const Os2SalBitmap& rSalBitmap = static_cast<const Os2SalBitmap&>(rSSalBitmap); - // an FM: kann erst einmal unberuecksichtigt bleiben - drawBitmap( pPosAry, rSalBitmap ); -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::drawBitmap( const SalTwoRect* pPosAry, - const SalBitmap& rSSalBitmap, - const SalBitmap& rSTransparentBitmap ) -{ - DBG_ASSERT( !mbPrinter, "No transparency print possible!" ); - - const Os2SalBitmap& rSalBitmap = static_cast<const Os2SalBitmap&>(rSSalBitmap); - const Os2SalBitmap& rTransparentBitmap = static_cast<const Os2SalBitmap&>(rSTransparentBitmap); - - if( bFastTransparent ) - { - ImplDrawBitmap( mhPS, mnHeight, pPosAry, rTransparentBitmap, FALSE, ROP_SRCAND ); - ImplDrawBitmap( mhPS, mnHeight, pPosAry, rSalBitmap, FALSE, ROP_SRCPAINT ); - } - else - { - SalTwoRect aPosAry = *pPosAry; - int nDstX = (int) aPosAry.mnDestX; - int nDstY = (int) aPosAry.mnDestY; - int nDstWidth = (int) aPosAry.mnDestWidth; - int nDstHeight = (int) aPosAry.mnDestHeight; - HAB hAB = GetSalData()->mhAB; - HPS hPS = mhPS; - DEVOPENSTRUC aDevOpenStruc = { NULL, (PSZ)"DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL }; - SIZEL aSizeL = { nDstWidth, nDstHeight }; - POINTL aPtL[ 3 ]; - - HDC hMemDC = DevOpenDC( hAB, OD_MEMORY, (PSZ)"*", 5L, (PDEVOPENDATA)&aDevOpenStruc, 0 ); - HPS hMemPS = Ft2CreatePS( hAB, hMemDC, &aSizeL, GPIT_MICRO | GPIA_ASSOC | PU_PELS ); - HBITMAP hMemBitmap = ImplCreateVirDevBitmap( hMemDC, hMemPS, nDstWidth, nDstHeight, 0 ); - HBITMAP hMemOld = (HBITMAP) Ft2SetBitmap( hMemPS, hMemBitmap ); - HDC hMaskDC = DevOpenDC( hAB, OD_MEMORY, (PSZ)"*", 5L, (PDEVOPENDATA)&aDevOpenStruc, 0 ); - HPS hMaskPS = Ft2CreatePS( hAB, hMaskDC, &aSizeL, GPIT_MICRO | GPIA_ASSOC | PU_PELS ); - HBITMAP hMaskBitmap = ImplCreateVirDevBitmap( hMaskDC, hMaskPS, nDstWidth, nDstHeight, 0 ); - HBITMAP hMaskOld = (HBITMAP) Ft2SetBitmap( hMaskPS, hMaskBitmap ); -/* - HPS hMemPS = ImplGetCachedPS( CACHED_HPS_1, 0 ); - HPS hMaskPS = ImplGetCachedPS( CACHED_HPS_2, 0 ); -*/ - aPosAry.mnDestX = aPosAry.mnDestY = 0L; - - aPtL[ 0 ].x = 0; - aPtL[ 0 ].y = 0; - aPtL[ 1 ].x = nDstWidth; - aPtL[ 1 ].y = nDstHeight; - aPtL[ 2 ].x = nDstX; - aPtL[ 2 ].y = TY( nDstY + nDstHeight - 1 ); - - GpiBitBlt( hMemPS, hPS, 3, aPtL, ROP_SRCCOPY, BBO_IGNORE ); - ImplDrawBitmap( hMaskPS, nDstHeight, &aPosAry, rTransparentBitmap, FALSE, ROP_SRCCOPY ); - - aPtL[ 2 ].x = 0; - aPtL[ 2 ].y = 0; - - GpiBitBlt( hMemPS, hMaskPS, 3, aPtL, ROP_SRCAND, BBO_IGNORE ); - ImplDrawBitmap( hMaskPS, nDstHeight, &aPosAry, rSalBitmap, FALSE, ROP_SRCERASE ); - GpiBitBlt( hMemPS, hMaskPS, 3, aPtL, ROP_SRCPAINT, BBO_IGNORE ); - - aPtL[ 0 ].x = nDstX; - aPtL[ 0 ].y = TY( nDstY + nDstHeight - 1 ); - aPtL[ 1 ].x = nDstX + nDstWidth; - aPtL[ 1 ].y = TY( nDstY - 1 ); - - GpiBitBlt( hPS, hMemPS, 3, aPtL, ROP_SRCCOPY, BBO_IGNORE ); - - Ft2SetBitmap( hMaskPS, hMaskOld ); - Ft2DestroyPS( hMaskPS ); - DevCloseDC( hMaskDC ); - GpiDeleteBitmap( hMaskBitmap ); - - Ft2SetBitmap( hMemPS, hMemOld ); - Ft2DestroyPS( hMemPS ); - DevCloseDC( hMemDC ); - GpiDeleteBitmap( hMemBitmap ); - -/* - ImplReleaseCachedPS( CACHED_HPS_1 ); - ImplReleaseCachedPS( CACHED_HPS_2 ); -*/ - } -} - -// ----------------------------------------------------------------------- - -bool Os2SalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, - const SalBitmap& rSrcBitmap, - const SalBitmap& rAlphaBmp ) -{ - // TODO(P3) implement alpha blending - return false; -} - -// ----------------------------------------------------------------------- - -bool Os2SalGraphics::drawAlphaRect( long nX, long nY, long nWidth, - long nHeight, sal_uInt8 nTransparency ) -{ - // TODO(P3) implement alpha blending - return false; -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::drawMask( const SalTwoRect* pPosAry, - const SalBitmap& rSSalBitmap, - SalColor nMaskColor ) -{ - DBG_ASSERT( !mbPrinter, "No transparency print possible!" ); - - const Os2SalBitmap& rSalBitmap = static_cast<const Os2SalBitmap&>(rSSalBitmap); - - SalTwoRect aPosAry = *pPosAry; - HPS hPS = mhPS; - IMAGEBUNDLE aBundle, aOldBundle; - AREABUNDLE aAreaBundle, aOldAreaBundle; - const ULONG nColor = RGBCOLOR( SALCOLOR_RED( nMaskColor ), - SALCOLOR_GREEN( nMaskColor ), - SALCOLOR_BLUE( nMaskColor ) ); - - GpiQueryAttrs( hPS, PRIM_IMAGE, IBB_COLOR | IBB_BACK_COLOR, &aOldBundle ); - aBundle.lColor = RGBCOLOR( 0, 0, 0 ); - aBundle.lBackColor = RGBCOLOR( 0xFF, 0xFF, 0xFF ); - Ft2SetAttrs( hPS, PRIM_IMAGE, IBB_COLOR | IBB_BACK_COLOR, 0, &aBundle ); - - GpiQueryAttrs( hPS, PRIM_AREA, ABB_COLOR | ABB_BACK_COLOR | ABB_SYMBOL | - ABB_MIX_MODE | ABB_BACK_MIX_MODE, &aOldAreaBundle ); - aAreaBundle.lColor = nColor; - aAreaBundle.lBackColor = nColor; - aAreaBundle.usSymbol = PATSYM_SOLID; - aAreaBundle.usMixMode = FM_OVERPAINT; - aAreaBundle.usBackMixMode = BM_OVERPAINT; - Ft2SetAttrs( hPS, PRIM_AREA, ABB_COLOR | ABB_BACK_COLOR | ABB_SYMBOL | - ABB_MIX_MODE | ABB_BACK_MIX_MODE, 0, &aAreaBundle ); - - ImplDrawBitmap( hPS, mnHeight, &aPosAry, rSalBitmap, FALSE, 0x00B8L ); - - Ft2SetAttrs( hPS, PRIM_IMAGE, IBB_COLOR | IBB_BACK_COLOR, 0, &aOldBundle ); - Ft2SetAttrs( hPS, PRIM_AREA, ABB_COLOR | ABB_BACK_COLOR | ABB_SYMBOL | - ABB_MIX_MODE | ABB_BACK_MIX_MODE, 0, &aOldAreaBundle ); -} - -// ----------------------------------------------------------------------- - -SalBitmap* Os2SalGraphics::getBitmap( long nX, long nY, long nDX, long nDY ) -{ - HAB hAB = GetSalData()->mhAB; - SIZEL size = { nDX, nDY }; - Os2SalBitmap* pSalBitmap = NULL; - - // create device context (at this time allways display compatible) - 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, &size, GPIT_MICRO | GPIA_ASSOC | PU_PELS ); - HBITMAP hMemBmp = ImplCreateVirDevBitmap( hMemDC, hMemPS, nDX, nDY, 0 ); - HBITMAP hMemOld = Ft2SetBitmap( hMemPS, hMemBmp ); - - // creation successfull? - if( hMemDC && hMemPS && hMemBmp ) - { - POINTL thePoints[ 3 ]; - - // lower-left corner of target - thePoints[ 0 ].x = 0; - thePoints[ 0 ].y = 0; - - // upper-right corner of target - thePoints[ 1 ].x = nDX; - thePoints[ 1 ].y = nDY; - - // lower-left corner of source - thePoints[ 2 ].x = nX; - thePoints[ 2 ].y = TY( nY + nDY - 1 ); - - long lHits = GpiBitBlt( hMemPS, mhPS, 3, thePoints, - mbXORMode ? ROP_SRCINVERT : ROP_SRCCOPY, BBO_IGNORE ); - - if( hMemPS ) - { - Ft2SetBitmap( hMemPS, hMemOld ); - Ft2DestroyPS( hMemPS ); - } - - if( hMemDC ) - DevCloseDC( hMemDC ); - - if( lHits == GPI_OK ) - { - pSalBitmap = new Os2SalBitmap; - - if( !pSalBitmap->Create( hMemBmp, FALSE, FALSE ) ) - { - delete pSalBitmap; - pSalBitmap = NULL; - } - } - } - - if( !pSalBitmap ) - GpiDeleteBitmap( hMemBmp ); - - // return pointer to SAL-Bitmap - return pSalBitmap; -} - -// ----------------------------------------------------------------------- - -SalColor Os2SalGraphics::getPixel( long nX, long nY ) -{ - POINTL aPt = { nX, TY( nY ) }; - LONG nColor = Ft2QueryPel( mhPS, &aPt ); - - return MAKE_SALCOLOR( (BYTE) ( nColor >> 16 ), (BYTE) ( nColor >> 8 ), (BYTE) nColor ); -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags ) -{ - if( nFlags & SAL_INVERT_TRACKFRAME ) - { - // save old vylues - LINEBUNDLE oldLb; - LINEBUNDLE lb; - GpiQueryAttrs( mhPS, PRIM_LINE, LBB_MIX_MODE | LBB_TYPE | LBB_COLOR, &oldLb ); - - // set linetype to short dash - lb.lColor = RGBCOLOR( 255, 255, 255 ); - lb.usMixMode = FM_XOR; - lb.usType = LINETYPE_ALTERNATE; - Ft2SetAttrs( mhPS, PRIM_LINE, LBB_MIX_MODE | LBB_TYPE | LBB_COLOR, 0, &lb ); - - // draw inverted box - POINTL aPt; - - aPt.x = nX; - aPt.y = TY( nY ); - - Ft2Move( mhPS, &aPt ); - - aPt.x = nX + nWidth - 1; - aPt.y = TY( nY + nHeight - 1 ); - - Ft2Box( mhPS, DRO_OUTLINE, &aPt, 0, 0 ); - - // restore old values - Ft2SetAttrs( mhPS, PRIM_LINE, LBB_MIX_MODE | LBB_TYPE | LBB_COLOR, 0, &oldLb ); - - } - else - { - // save old values - AREABUNDLE oldAb; - AREABUNDLE ab; - - GpiQueryAttrs( mhPS, PRIM_AREA, ABB_COLOR | ABB_MIX_MODE | ABB_SYMBOL, &oldAb ); - - // set fill color to black - ab.lColor = RGBCOLOR( 255, 255, 255 ); - ab.usMixMode = FM_XOR; - ab.usSymbol = (nFlags & SAL_INVERT_50) ? PATSYM_DENSE5 : PATSYM_SOLID; - Ft2SetAttrs( mhPS, PRIM_AREA, ABB_COLOR | ABB_MIX_MODE | ABB_SYMBOL, 0, &ab ); - - // draw inverted box - POINTL aPt; - - aPt.x = nX; - aPt.y = TY( nY ); - - Ft2Move( mhPS, &aPt ); - - aPt.x = nX + nWidth - 1; - aPt.y = TY( nY + nHeight - 1 ); - - Ft2Box( mhPS, DRO_FILL, &aPt, 0, 0 ); - - // restore old values - Ft2SetAttrs( mhPS, PRIM_AREA, ABB_COLOR | ABB_MIX_MODE | ABB_SYMBOL, 0, &oldAb ); - } -} - -// ----------------------------------------------------------------------- - -void Os2SalGraphics::invert( ULONG nPoints, const SalPoint* pPtAry, SalInvert nFlags ) -{ - if( nFlags & SAL_INVERT_TRACKFRAME ) - { - // save old vylues - LINEBUNDLE oldLb; - LINEBUNDLE lb; - GpiQueryAttrs( mhPS, PRIM_LINE, LBB_MIX_MODE | LBB_TYPE | LBB_COLOR, &oldLb ); - - // set linetype to short dash - lb.lColor = RGBCOLOR( 255, 255, 255 ); - lb.usMixMode = FM_XOR; - lb.usType = LINETYPE_ALTERNATE; - Ft2SetAttrs( mhPS, PRIM_LINE, LBB_MIX_MODE | LBB_TYPE | LBB_COLOR, 0, &lb ); - - // Draw Polyline - drawPolyLine( nPoints, pPtAry ); - - // restore old values - Ft2SetAttrs( mhPS, PRIM_LINE, LBB_MIX_MODE | LBB_TYPE | LBB_COLOR, 0, &oldLb ); - } - else - { - // save old values - AREABUNDLE oldAb; - AREABUNDLE ab; - - GpiQueryAttrs( mhPS, PRIM_AREA, ABB_COLOR | ABB_MIX_MODE | ABB_SYMBOL, &oldAb ); - - // set fill color to black - ab.lColor = RGBCOLOR( 255, 255, 255 ); - ab.usMixMode = FM_XOR; - ab.usSymbol = (nFlags & SAL_INVERT_50) ? PATSYM_DENSE5 : PATSYM_SOLID; - Ft2SetAttrs( mhPS, PRIM_AREA, ABB_COLOR | ABB_MIX_MODE | ABB_SYMBOL, 0, &ab ); - - // Draw Polyline - drawPolygon( nPoints, pPtAry ); - - // restore old values - Ft2SetAttrs( mhPS, PRIM_AREA, ABB_COLOR | ABB_MIX_MODE | ABB_SYMBOL, 0, &oldAb ); - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |