22#include <osl/diagnose.h>
31#include <com/sun/star/awt/ImageStatus.hpp>
32#include <com/sun/star/io/XInputStream.hpp>
41 css::uno::Reference< css::io::XInputStream > xStmRef;
42 css::uno::Sequence<sal_Int8> maSeq;
46 ImgProdLockBytes(
SvStream* pStm,
bool bOwner );
47 explicit ImgProdLockBytes( css::uno::Reference< css::io::XInputStream > xStreamRef );
49 virtual ErrCode ReadAt( sal_uInt64 nPos,
void* pBuffer, std::size_t nCount, std::size_t * pRead )
const override;
50 virtual ErrCode WriteAt( sal_uInt64 nPos,
const void* pBuffer, std::size_t nCount, std::size_t * pWritten )
override;
58ImgProdLockBytes::ImgProdLockBytes(
SvStream* pStm,
bool bOwner ) :
64ImgProdLockBytes::ImgProdLockBytes( css::uno::Reference< css::io::XInputStream > _xStmRef ) :
65 xStmRef(
std::move( _xStmRef ))
70 const sal_uInt32 nBytesToRead = 65535;
75 css::uno::Sequence< sal_Int8 > aReadSeq;
77 nRead = xStmRef->readSomeBytes( aReadSeq, nBytesToRead );
81 const sal_uInt32 nOldLength = maSeq.getLength();
82 maSeq.realloc( nOldLength + nRead );
83 memcpy( maSeq.getArray() + nOldLength, aReadSeq.getConstArray(), aReadSeq.getLength() );
86 while( nBytesToRead == nRead );
89ErrCode ImgProdLockBytes::ReadAt(sal_uInt64
const nPos,
90 void* pBuffer, std::size_t nCount, std::size_t * pRead)
const
94 const_cast<SvStream*
>(GetStream())->ResetError();
96 const_cast<SvStream*
>(GetStream())->ResetError();
101 const std::size_t nSeqLen = maSeq.getLength();
105 if( ( nPos + nCount ) > nSeqLen )
106 nCount = nSeqLen - nPos;
108 memcpy( pBuffer, maSeq.getConstArray() + nPos, nCount );
119ErrCode ImgProdLockBytes::WriteAt(sal_uInt64
const nPos,
120 const void* pBuffer, std::size_t nCount, std::size_t * pWritten)
126 DBG_ASSERT( xStmRef.is(),
"ImgProdLockBytes::WriteAt: xInputStream has no reference..." );
132ErrCode ImgProdLockBytes::Flush()
const
138ErrCode ImgProdLockBytes::SetSize(sal_uInt64
const nSize)
144 OSL_FAIL(
"ImgProdLockBytes::SetSize not supported for xInputStream..." );
156 DBG_ASSERT( xStmRef.is(),
"ImgProdLockBytes::Stat: xInputStream has no reference..." );
157 pStat->
nSize = maSeq.getLength();
178 css::uno::Any aRet = ::cppu::queryInterface( rType,
179 static_cast< css::lang::XInitialization*
>(
this),
180 static_cast< css::lang::XServiceInfo*
>(
this),
181 static_cast< css::awt::XImageProducer*
>(
this) );
182 return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
188 DBG_ASSERT( rxConsumer.is(),
"::AddConsumer(...): No consumer referenced!" );
189 if( rxConsumer.is() )
196 ConsumerList_t::reverse_iterator riter = std::find(
maConsList.rbegin(),
maConsList.rend(),rxConsumer);
210 if ( ::svt::GraphicAccess::isSupportedURL(
maURL ) )
212 mpStm = ::svt::GraphicAccess::getImageStream( ::comphelper::getProcessComponentContext(),
maURL );
214 else if( !
maURL.isEmpty() )
218 mpStm.reset(
new SvStream(
new ImgProdLockBytes( pIStm.release(),
true ) ) );
229 mpStm.reset(
new SvStream(
new ImgProdLockBytes( &rStm,
false ) ) );
240 if( rInputStmRef.is() )
241 mpStm.reset(
new SvStream(
new ImgProdLockBytes( rInputStmRef ) ) );
257 bool bNotifyEmptyGraphics =
false;
270 if(
moGraphic->GetType() != GraphicType::NONE )
273 bNotifyEmptyGraphics =
true;
276 bNotifyEmptyGraphics =
true;
278 if ( !bNotifyEmptyGraphics )
286 for (
auto const& elem : aTmp)
289 elem->complete( css::awt::ImageStatus::IMAGESTATUS_STATICIMAGEDONE,
this );
328 for (
auto const& elem : aTmp)
329 elem->complete( css::awt::ImageStatus::IMAGESTATUS_STATICIMAGEDONE,
this );
336 sal_uInt32 nRMask = 0;
337 sal_uInt32 nGMask = 0;
338 sal_uInt32 nBMask = 0;
339 sal_uInt32 nAMask = 0;
340 sal_uInt32 nWidth = 0;
341 sal_uInt32 nHeight = 0;
343 css::uno::Sequence< sal_Int32 > aRGBPal;
350 for (
auto const& elem : aTmp)
352 elem->init( nWidth, nHeight );
353 elem->setColorModel(
nBitCount,aRGBPal, nRMask, nGMask, nBMask, nAMask );
377 const tools::Long nPartWidth = nEndX - nStartX + 1;
378 const tools::Long nPartHeight = nEndY - nStartY + 1;
396 css::uno::Sequence<sal_Int8>
aData( nPartWidth * nPartHeight );
406 *pTmp++ = sal::static_int_cast< sal_Int8 >(
414 for (
auto const& elem : aTmp)
415 elem->setPixelsByBytes( nStartX, nStartY, nPartWidth, nPartHeight,
aData, 0
UL, nPartWidth );
419 css::uno::Sequence<sal_Int32>
aData( nPartWidth * nPartHeight );
420 sal_Int32* pTmp =
aData.getArray();
436 for (
auto const& elem : aTmp)
437 elem->setPixelsByLongs( nStartX, nStartY, nPartWidth, nPartHeight,
aData, 0
UL, nPartWidth );
442 css::uno::Sequence<sal_Int32>
aData( nPartWidth * nPartHeight );
444 sal_Int32* pTmp =
aData.getArray();
450 for(
tools::Long nX = nStartX; nX <= nEndX; nX++, pTmp++ )
454 *pTmp =
static_cast<sal_Int32
>(aCol.GetRed()) << 24;
455 *pTmp |=
static_cast<sal_Int32
>(aCol.GetGreen()) << 16;
456 *pTmp |=
static_cast<sal_Int32
>(aCol.GetBlue()) << 8;
459 *pTmp |= 0x000000ffUL;
464 for (
auto const& elem : aTmp)
465 elem->setPixelsByLongs( nStartX, nStartY, nPartWidth, nPartHeight,
aData, 0
UL, nPartWidth );
477 css::uno::Any aArg =
aArguments.getConstArray()[0];
487 return "com.sun.star.form.ImageProducer";
495 return {
"com.sun.star.awt.ImageProducer"};
499extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
501 css::uno::Sequence<css::uno::Any>
const &)
void Erase(sal_uInt8 cTransparency)
sal_uInt8 GetIndex() const
const AlphaMask & GetAlphaMask() const
Bitmap GetBitmap(Color aTransparentReplaceColor) const
void GetColorModel(css::uno::Sequence< sal_Int32 > &rRGBPalette, sal_uInt32 &rnRedMask, sal_uInt32 &rnGreenMask, sal_uInt32 &rnBlueMask, sal_uInt32 &rnAlphaMask, sal_uInt32 &rnTransparencyIndex, sal_uInt32 &rnWidth, sal_uInt32 &rnHeight, sal_uInt8 &rnBitCount)
tools::Long Height() const
tools::Long Width() const
BitmapColor GetBestMatchingColor(const BitmapColor &rBitmapColor) const
BitmapColor GetPixelFromData(const sal_uInt8 *pData, tools::Long nX) const
Scanline GetScanline(tools::Long nY) const
Size GetSizePixel() const
static void ReleaseAccess(BitmapInfoAccess *pAccess)
BitmapReadAccess * AcquireReadAccess()
static ErrCode Import(SvStream &rIStm, Graphic &rGraphic, ConvertDataFormat nFormat=ConvertDataFormat::Unknown)
BitmapEx GetBitmapEx(const GraphicConversionParameters &rParameters=GraphicConversionParameters()) const
void SAL_CALL removeConsumer(const css::uno::Reference< css::awt::XImageConsumer > &rxConsumer) override
bool ImplImportGraphic(Graphic &rGraphic)
void SAL_CALL startProduction() override
OUString SAL_CALL getImplementationName() override
ConsumerList_t maConsList
std::unique_ptr< SvStream > mpStm
void SAL_CALL addConsumer(const css::uno::Reference< css::awt::XImageConsumer > &rxConsumer) override
std::vector< css::uno::Reference< css::awt::XImageConsumer > > ConsumerList_t
void ImplUpdateData(const Graphic &rGraphic)
virtual ~ImageProducer() override
void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
void ImplInitConsumer(const Graphic &rGraphic)
css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
void SetImage(const OUString &rPath)
css::uno::Any SAL_CALL queryInterface(const css::uno::Type &rType) override
void ImplUpdateConsumer(const Graphic &rGraphic)
std::optional< Graphic > moGraphic
Link< Graphic *, void > maDoneHdl
sal_Bool SAL_CALL supportsService(OUString const &ServiceName) override
void setImage(css::uno::Reference< css::io::XInputStream > const &rStmRef)
virtual ErrCode WriteAt(sal_uInt64 nPos, const void *pBuffer, std::size_t nCount, std::size_t *pWritten)
virtual ErrCode ReadAt(sal_uInt64 nPos, void *pBuffer, std::size_t nCount, std::size_t *pRead) const
virtual ErrCode Flush() const
virtual ErrCode Stat(SvLockBytesStat *pStat) const
virtual ErrCode SetSize(sal_uInt64 nSize)
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
constexpr ::Color COL_WHITE(0xFF, 0xFF, 0xFF)
constexpr ::Color COL_ALPHA_TRANSPARENT(0x00, 0x00, 0x00)
#define DBG_ASSERT(sCon, aError)
#define ERRCODE_IO_PENDING
#define ERRCODE_IO_CANTWRITE
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_form_ImageProducer_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
Sequence< PropertyValue > aArguments
constexpr OUStringLiteral aData
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)