/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #ifndef IOS #include "headless/svpbmp.hxx" #include #include #include #include #include #include using namespace basebmp; using namespace basegfx; SvpSalBitmap::~SvpSalBitmap() { } bool SvpSalBitmap::Create( const Size& rSize, sal_uInt16 nBitCount, const BitmapPalette& rPalette ) { basebmp::Format nFormat = SVP_DEFAULT_BITMAP_FORMAT; SAL_INFO( "vcl.headless", "SvpSalBitmap::Create(" << rSize.Width() << "," << rSize.Height() << "," << nBitCount << ")" ); switch( nBitCount ) { case 1: nFormat = FORMAT_ONE_BIT_MSB_PAL; break; case 4: nFormat = FORMAT_FOUR_BIT_MSB_PAL; break; case 8: nFormat = FORMAT_EIGHT_BIT_PAL; break; #ifdef OSL_BIGENDIAN case 16: nFormat = FORMAT_SIXTEEN_BIT_MSB_TC_MASK; break; #else case 16: nFormat = FORMAT_SIXTEEN_BIT_LSB_TC_MASK; break; #endif case 24: nFormat = FORMAT_TWENTYFOUR_BIT_TC_MASK; break; #ifdef ANDROID case 32: nFormat = FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA; break; #else case 32: nFormat = FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA; break; #endif } B2IVector aSize( rSize.Width(), rSize.Height() ); if( aSize.getX() == 0 ) aSize.setX( 1 ); if( aSize.getY() == 0 ) aSize.setY( 1 ); if( nBitCount > 8 ) m_aBitmap = createBitmapDevice( aSize, false, nFormat ); else { // prepare palette unsigned int nEntries = 1U << nBitCount; std::vector* pPalette = new std::vector( nEntries, basebmp::Color(COL_WHITE) ); unsigned int nColors = rPalette.GetEntryCount(); for( unsigned int i = 0; i < nColors; i++ ) { const BitmapColor& rCol = rPalette[i]; (*pPalette)[i] = basebmp::Color( rCol.GetRed(), rCol.GetGreen(), rCol.GetBlue() ); } m_aBitmap = createBitmapDevice( aSize, false, nFormat, basebmp::RawMemorySharedArray(), basebmp::PaletteMemorySharedVector( pPalette ) ); } return true; } bool SvpSalBitmap::Create( const SalBitmap& rSalBmp ) { const SvpSalBitmap& rSrc = static_cast(rSalBmp); const BitmapDeviceSharedPtr& rSrcBmp = rSrc.getBitmap(); if( rSrcBmp.get() ) { B2IVector aSize = rSrcBmp->getSize(); m_aBitmap = cloneBitmapDevice( aSize, rSrcBmp ); B2IBox aRect( 0, 0, aSize.getX(), aSize.getY() ); m_aBitmap->drawBitmap( rSrcBmp, aRect, aRect, DrawMode_PAINT ); } else m_aBitmap.reset(); return true; } bool SvpSalBitmap::Create( const SalBitmap& /*rSalBmp*/, SalGraphics* /*pGraphics*/ ) { return false; } bool SvpSalBitmap::Create( const SalBitmap& /*rSalBmp*/, sal_uInt16 /*nNewBitCount*/ ) { return false; } bool SvpSalBitmap::Create( const ::com::sun::star::uno::Reference< ::com::sun::star::rendering::XBitmapCanvas > /*xBitmapCanvas*/, Size& /*rSize*/, bool /*bMask*/ ) { return false; } void SvpSalBitmap::Destroy() { m_aBitmap.reset(); } Size SvpSalBitmap::GetSize() const { Size aSize; if( m_aBitmap.get() ) { B2IVector aVec( m_aBitmap->getSize() ); aSize = Size( aVec.getX(), aVec.getY() ); } return aSize; } sal_uInt16 SvpSalBitmap::GetBitCount() const { sal_uInt16 nDepth = 0; if( m_aBitmap.get() ) nDepth = getBitCountFromScanlineFormat( m_aBitmap->getScanlineFormat() ); return nDepth; } BitmapBuffer* SvpSalBitmap::AcquireBuffer( bool ) { BitmapBuffer* pBuf = NULL; if( m_aBitmap.get() ) { pBuf = new BitmapBuffer(); sal_uInt16 nBitCount = 1; switch( m_aBitmap->getScanlineFormat() ) { case FORMAT_ONE_BIT_MSB_GREY: case FORMAT_ONE_BIT_MSB_PAL: nBitCount = 1; pBuf->mnFormat = BMP_FORMAT_1BIT_MSB_PAL; break; case FORMAT_ONE_BIT_LSB_GREY: case FORMAT_ONE_BIT_LSB_PAL: nBitCount = 1; pBuf->mnFormat = BMP_FORMAT_1BIT_LSB_PAL; break; case FORMAT_FOUR_BIT_MSB_GREY: case FORMAT_FOUR_BIT_MSB_PAL: nBitCount = 4; pBuf->mnFormat = BMP_FORMAT_4BIT_MSN_PAL; break; case FORMAT_FOUR_BIT_LSB_GREY: case FORMAT_FOUR_BIT_LSB_PAL: nBitCount = 4; pBuf->mnFormat = BMP_FORMAT_4BIT_LSN_PAL; break; case FORMAT_EIGHT_BIT_PAL: nBitCount = 8; pBuf->mnFormat = BMP_FORMAT_8BIT_PAL; break; case FORMAT_EIGHT_BIT_GREY: nBitCount = 8; pBuf->mnFormat = BMP_FORMAT_8BIT_PAL; break; case FORMAT_SIXTEEN_BIT_LSB_TC_MASK: nBitCount = 16; pBuf->mnFormat = BMP_FORMAT_16BIT_TC_LSB_MASK; pBuf->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); break; case FORMAT_SIXTEEN_BIT_MSB_TC_MASK: nBitCount = 16; pBuf->mnFormat = BMP_FORMAT_16BIT_TC_MSB_MASK; pBuf->maColorMask = ColorMask( 0xf800, 0x07e0, 0x001f ); break; case FORMAT_TWENTYFOUR_BIT_TC_MASK: nBitCount = 24; pBuf->mnFormat = BMP_FORMAT_24BIT_TC_BGR; break; case FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA: nBitCount = 32; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; #ifdef OSL_BIGENDIAN pBuf->maColorMask = ColorMask( 0x0000ff00, 0x00ff0000, 0xff000000 ); #else pBuf->maColorMask = ColorMask( 0x00ff0000, 0x0000ff00, 0x000000ff ); #endif break; case FORMAT_THIRTYTWO_BIT_TC_MASK_ARGB: nBitCount = 32; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; #ifdef OSL_BIGENDIAN pBuf->maColorMask = ColorMask( 0x00ff0000, 0x0000ff00, 0x000000ff ); #else pBuf->maColorMask = ColorMask( 0x0000ff00, 0x00ff0000, 0xff000000 ); #endif break; case FORMAT_THIRTYTWO_BIT_TC_MASK_ABGR: nBitCount = 32; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; #ifdef OSL_BIGENDIAN pBuf->maColorMask = ColorMask( 0x000000ff, 0x0000ff00, 0x00ff0000 ); #else pBuf->maColorMask = ColorMask( 0xff000000, 0x00ff0000, 0x0000ff00 ); #endif break; case FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA: nBitCount = 32; pBuf->mnFormat = BMP_FORMAT_32BIT_TC_MASK; #ifdef OSL_BIGENDIAN pBuf->maColorMask = ColorMask( 0xff000000, 0x00ff0000, 0x0000ff00 ); #else pBuf->maColorMask = ColorMask( 0x000000ff, 0x0000ff00, 0x00ff0000 ); #endif break; default: // this is an error case !!!!! nBitCount = 1; pBuf->mnFormat = BMP_FORMAT_1BIT_MSB_PAL; break; } if( m_aBitmap->isTopDown() ) pBuf->mnFormat |= BMP_FORMAT_TOP_DOWN; B2IVector aSize = m_aBitmap->getSize(); pBuf->mnWidth = aSize.getX(); pBuf->mnHeight = aSize.getY(); pBuf->mnScanlineSize = m_aBitmap->getScanlineStride(); pBuf->mnBitCount = nBitCount; pBuf->mpBits = (sal_uInt8*)m_aBitmap->getBuffer().get(); if( nBitCount <= 8 ) { if( m_aBitmap->getScanlineFormat() == FORMAT_EIGHT_BIT_GREY || m_aBitmap->getScanlineFormat() == FORMAT_FOUR_BIT_LSB_GREY || m_aBitmap->getScanlineFormat() == FORMAT_FOUR_BIT_MSB_GREY || m_aBitmap->getScanlineFormat() == FORMAT_ONE_BIT_LSB_GREY || m_aBitmap->getScanlineFormat() == FORMAT_ONE_BIT_MSB_GREY ) pBuf->maPalette = Bitmap::GetGreyPalette( 1U << nBitCount ); else { basebmp::PaletteMemorySharedVector aPalette = m_aBitmap->getPalette(); if( aPalette.get() ) { unsigned int nColors = aPalette->size(); if( nColors > 0 ) { pBuf->maPalette.SetEntryCount( nColors ); for( unsigned int i = 0; i < nColors; i++ ) { const basebmp::Color& rCol = (*aPalette)[i]; pBuf->maPalette[i] = BitmapColor( rCol.getRed(), rCol.getGreen(), rCol.getBlue() ); } } } } } } return pBuf; } void SvpSalBitmap::ReleaseBuffer( BitmapBuffer* pBuffer, bool bReadOnly ) { if( !bReadOnly && pBuffer->maPalette.GetEntryCount() ) { // palette might have changed, clone device (but recycle // memory) sal_uInt16 nBitCount = 0; switch( m_aBitmap->getScanlineFormat() ) { case FORMAT_ONE_BIT_MSB_GREY: // FALLTHROUGH intended case FORMAT_ONE_BIT_MSB_PAL: // FALLTHROUGH intended case FORMAT_ONE_BIT_LSB_GREY: // FALLTHROUGH intended case FORMAT_ONE_BIT_LSB_PAL: nBitCount = 1; break; case FORMAT_FOUR_BIT_MSB_GREY: // FALLTHROUGH intended case FORMAT_FOUR_BIT_MSB_PAL: // FALLTHROUGH intended case FORMAT_FOUR_BIT_LSB_GREY: // FALLTHROUGH intended case FORMAT_FOUR_BIT_LSB_PAL: nBitCount = 4; break; case FORMAT_EIGHT_BIT_PAL: // FALLTHROUGH intended case FORMAT_EIGHT_BIT_GREY: nBitCount = 8; break; default: break; } if( nBitCount ) { sal_uInt32 nEntries = 1U << nBitCount; boost::shared_ptr< std::vector > pPal( new std::vector( nEntries, basebmp::Color(COL_WHITE))); const sal_uInt32 nColors = std::min( (sal_uInt32)pBuffer->maPalette.GetEntryCount(), nEntries); for( sal_uInt32 i = 0; i < nColors; i++ ) { const BitmapColor& rCol = pBuffer->maPalette[i]; (*pPal)[i] = basebmp::Color( rCol.GetRed(), rCol.GetGreen(), rCol.GetBlue() ); } m_aBitmap = basebmp::createBitmapDevice( m_aBitmap->getSize(), m_aBitmap->isTopDown(), m_aBitmap->getScanlineFormat(), m_aBitmap->getBuffer(), pPal ); } } delete pBuffer; } bool SvpSalBitmap::GetSystemData( BitmapSystemData& ) { return false; } sal_uInt32 SvpSalBitmap::getBitCountFromScanlineFormat( basebmp::Format nFormat ) { sal_uInt32 nBitCount = 1; switch( nFormat ) { case FORMAT_ONE_BIT_MSB_GREY: case FORMAT_ONE_BIT_LSB_GREY: case FORMAT_ONE_BIT_MSB_PAL: case FORMAT_ONE_BIT_LSB_PAL: nBitCount = 1; break; case FORMAT_FOUR_BIT_MSB_GREY: case FORMAT_FOUR_BIT_LSB_GREY: case FORMAT_FOUR_BIT_MSB_PAL: case FORMAT_FOUR_BIT_LSB_PAL: nBitCount = 4; break; case FORMAT_EIGHT_BIT_PAL: case FORMAT_EIGHT_BIT_GREY: nBitCount = 8; break; case FORMAT_SIXTEEN_BIT_LSB_TC_MASK: case FORMAT_SIXTEEN_BIT_MSB_TC_MASK: nBitCount = 16; break; case FORMAT_TWENTYFOUR_BIT_TC_MASK: nBitCount = 24; break; case FORMAT_THIRTYTWO_BIT_TC_MASK_BGRA: case FORMAT_THIRTYTWO_BIT_TC_MASK_ARGB: case FORMAT_THIRTYTWO_BIT_TC_MASK_ABGR: case FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA: nBitCount = 32; break; default: OSL_FAIL( "unsupported basebmp format" ); break; } return nBitCount; } #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ e/cib_contract3756b LibreOffice 核心代码仓库文档基金会
summaryrefslogtreecommitdiff
tore?h=feature/wasm&id=2e677c39818f3a6479ac9103ac9c7e8ef985eeb0'>gbuild: split uwinapi out of gb_STDLIBS
AgeCommit message (Expand)Author
2017-03-17convert SvxBorderStyle to scoped enumNoel Grandin
2017-02-16replace SwFootnoteAdj with css::text::HorizontalAdjustCaolán McNamara
2017-02-16crashtesting: enum values need to not changeCaolán McNamara
Michael Stahl
2012-09-17migrate some of the biggest consumer of osl_*InterlockedCount to osl_atomicNorbert Thiebaud
2012-09-14remove use of SAL_MIN() macroNorbert Thiebaud
2012-08-22remove unused module-description xml filesMatúš Kukan
2012-08-22do not deliver these module-description xml filesMatúš Kukan
2012-07-28Partially revert "Remove some unused defines and controls"Thomas Arnhold
2012-07-20Globally unique symbols missing from some map filesStephan Bergmann
2012-06-29Remove some unused defines and controlsThomas Arnhold
2012-06-29Remove some more include guardsThomas Arnhold
2012-06-27re-base on ALv2 code.Michael Meeks
2012-06-21re-base on ALv2 code.Michael Meeks
2012-06-21re-base on ALv2 code.Michael Meeks
2012-06-01targeted string re-workNorbert Thiebaud
2012-05-29gbuild conversion: store moduleDavid Ostrovsky
2012-05-07add gb_STDLIBSDavid Tardon
2012-05-07gbuild conversion: store moduleDavid Ostrovsky
2012-04-29make gbuild the default assumption of build.plBjoern Michaelsen
2012-04-24WaE: MSVC2008 C4530 exception handler without unwind semanticsCaolán McNamara
2012-03-23Make default zero-initialization explicitStephan Bergmann
2012-03-23Initialize m_hFile in FileMapping constructor.Catalin Iacob
2012-03-14Enable -Wnon-virtual-dtor for GCC 4.6Stephan Bergmann
2012-02-21WaE: silence some documentation errorsThomas Arnhold
2012-02-06Added READMEs for modules related to URE, with content from the wikiJosh Heidenreich
2012-01-31SimplificationStephan Bergmann
2012-01-21Removed some unused parameters; added SAL_UNUSED_PARAMETER.Stephan Bergmann
2012-01-10valgrind: have MappedLockBytes take complete ownership of the file handleCaolán McNamara
2011-12-21osl_unmapFile can't work for files bundled inside the .apk on AndroidTor Lillqvist
2011-12-11I don't see NO_BSYMBOLIC being used anywhereTor Lillqvist
2011-11-27remove precompiled_xxx.hxx/cxxNorbert Thiebaud
2011-11-27remove include of pch header from storeNorbert Thiebaud
2011-11-27remove PCH support in dmake-moduleNorbert Thiebaud
2011-11-10Deliver libstore.so for AndroidTor Lillqvist
2011-09-21OSL_TRACE: Remove trailing newlinesThomas Arnhold
2011-09-06[cppchecker] suppression of unread VariablePierre-André Jacquod
2011-08-08Deliver also static libstoreTor Lillqvist
2011-06-18Drop duplicateTor Lillqvist
2011-06-18Just make -lstore work for MinGW as it does for other Unix-style compilersTor Lillqvist
2011-06-03Drop %_EXT% which was always emptyTor Lillqvist
2011-05-25Use special DLL and library name just for MSCTor Lillqvist
2011-03-23Merge commit 'ooo/DEV300_m103'Jan Holesovsky
2011-02-01Remove RCS informationThomas Arnhold
2010-12-10RTL_CONSTASCII_USTRINGPARAM in ure 2Gert Faller
2010-12-10RTL_CONSTASCII_USTRINGPARAM in ure 1Gert Faller
2010-11-25Update from sibling repository.Matthias Huetsch [mhu]
2010-11-25#i115784# store: fix memory errors uncovered by valgrind and other tools.Matthias Huetsch [mhu]
2010-10-27add modelines to .h and .c files as wellCaolán McNamara