[Libreoffice-commits] core.git: cui/source
Noel Grandin
noel.grandin at collabora.co.uk
Sat Feb 10 05:53:25 UTC 2018
cui/source/dialogs/colorpicker.cxx | 106 +++++++++++++------------------------
1 file changed, 39 insertions(+), 67 deletions(-)
New commits:
commit db42098d99bd8648fcd7b6f669e3e5ad4142670a
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date: Fri Feb 9 10:47:48 2018 +0200
use VirtualDevice in ColorFieldControl
as part of moving use of BitmapWriteAccess inside of vcl/
Change-Id: Ia092eee7d56a6c6a6485555f470de10f31be8ed1
Reviewed-on: https://gerrit.libreoffice.org/49415
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/cui/source/dialogs/colorpicker.cxx b/cui/source/dialogs/colorpicker.cxx
index eb34b074f503..4fa2d98c1802 100644
--- a/cui/source/dialogs/colorpicker.cxx
+++ b/cui/source/dialogs/colorpicker.cxx
@@ -226,7 +226,7 @@ private:
double mdX;
double mdY;
Point maPosition;
- Bitmap* mpBitmap;
+ VclPtr<VirtualDevice> mxBitmap;
std::vector<sal_uInt8> maRGB_Horiz;
std::vector<sal_uInt16> maGrad_Horiz;
std::vector<sal_uInt16> maPercent_Horiz;
@@ -239,7 +239,6 @@ ColorFieldControl::ColorFieldControl( vcl::Window* pParent, WinBits nStyle )
, meMode( DefaultMode )
, mdX( -1.0 )
, mdY( -1.0 )
-, mpBitmap( nullptr )
{
SetControlBackground();
}
@@ -251,8 +250,7 @@ ColorFieldControl::~ColorFieldControl()
void ColorFieldControl::dispose()
{
- delete mpBitmap;
- mpBitmap = nullptr;
+ mxBitmap.disposeAndClear();
Control::dispose();
}
@@ -267,43 +265,41 @@ void ColorFieldControl::UpdateBitmap()
{
const Size aSize(GetOutputSizePixel());
- if (mpBitmap && mpBitmap->GetSizePixel() != aSize)
- {
- delete mpBitmap;
- mpBitmap = nullptr;
- }
-
const sal_Int32 nWidth = aSize.Width();
const sal_Int32 nHeight = aSize.Height();
if (nWidth == 0 || nHeight == 0)
return;
- if (!mpBitmap)
- {
- mpBitmap = new Bitmap( aSize, 24 );
+ if (mxBitmap && mxBitmap->GetOutputSizePixel() == aSize)
+ return;
- maRGB_Horiz.resize( nWidth );
- maGrad_Horiz.resize( nWidth );
- maPercent_Horiz.resize( nWidth );
+ mxBitmap.disposeAndClear();
+ mxBitmap = VclPtr<VirtualDevice>::Create();
+ mxBitmap->SetOutputSizePixel(aSize);
- sal_uInt8* pRGB = maRGB_Horiz.data();
- sal_uInt16* pGrad = maGrad_Horiz.data();
- sal_uInt16* pPercent = maPercent_Horiz.data();
+ maRGB_Horiz.resize( nWidth );
+ maGrad_Horiz.resize( nWidth );
+ maPercent_Horiz.resize( nWidth );
- for( sal_Int32 x = 0; x < nWidth; x++ )
- {
- *pRGB++ = static_cast<sal_uInt8>((x * 256) / nWidth);
- *pGrad++ = static_cast<sal_uInt16>((x * 359) / nWidth);
- *pPercent++ = static_cast<sal_uInt16>((x * 100) / nWidth);
- }
+ sal_uInt8* pRGB = maRGB_Horiz.data();
+ sal_uInt16* pGrad = maGrad_Horiz.data();
+ sal_uInt16* pPercent = maPercent_Horiz.data();
+
+ for( sal_Int32 x = 0; x < nWidth; x++ )
+ {
+ *pRGB++ = static_cast<sal_uInt8>((x * 256) / nWidth);
+ *pGrad++ = static_cast<sal_uInt16>((x * 359) / nWidth);
+ *pPercent++ = static_cast<sal_uInt16>((x * 100) / nWidth);
+ }
- maRGB_Vert.resize(nHeight);
- maPercent_Vert.resize(nHeight);
+ maRGB_Vert.resize(nHeight);
+ maPercent_Vert.resize(nHeight);
- pRGB = maRGB_Vert.data();
- pPercent = maPercent_Vert.data();
+ pRGB = maRGB_Vert.data();
+ pPercent = maPercent_Vert.data();
+ {
sal_Int32 y = nHeight;
while (y--)
{
@@ -318,10 +314,7 @@ void ColorFieldControl::UpdateBitmap()
sal_uInt8* pRGB_Vert = maRGB_Vert.data();
sal_uInt16* pPercent_Vert = maPercent_Vert.data();
- Bitmap::ScopedWriteAccess pWriteAccess(*mpBitmap);
- if (pWriteAccess)
- {
- BitmapColor aBitmapColor(maColor);
+ Color aBitmapColor(maColor);
sal_uInt16 nHue, nSat, nBri;
maColor.RGBtoHSB(nHue, nSat, nBri);
@@ -335,97 +328,90 @@ void ColorFieldControl::UpdateBitmap()
case HUE:
while (y--)
{
- Scanline pScanline = pWriteAccess->GetScanline( y );
nBri = pPercent_Vert[y];
x = nWidth;
while (x--)
{
nSat = pPercent_Horiz[x];
- pWriteAccess->SetPixelOnData(pScanline, x, BitmapColor(Color(Color::HSBtoRGB(nHue, nSat, nBri))));
+ mxBitmap->DrawPixel(Point(x,y), Color(Color::HSBtoRGB(nHue, nSat, nBri)));
}
}
break;
case SATURATION:
while (y--)
{
- Scanline pScanline = pWriteAccess->GetScanline( y );
nBri = pPercent_Vert[y];
x = nWidth;
while (x--)
{
nHue = pGrad_Horiz[x];
- pWriteAccess->SetPixelOnData(pScanline, x, BitmapColor(Color(Color::HSBtoRGB(nHue, nSat, nBri))));
+ mxBitmap->DrawPixel(Point(x,y), Color(Color::HSBtoRGB(nHue, nSat, nBri)));
}
}
break;
case BRIGHTNESS:
while (y--)
{
- Scanline pScanline = pWriteAccess->GetScanline( y );
nSat = pPercent_Vert[y];
x = nWidth;
while (x--)
{
nHue = pGrad_Horiz[x];
- pWriteAccess->SetPixelOnData(pScanline, x, BitmapColor(Color(Color::HSBtoRGB(nHue, nSat, nBri))));
+ mxBitmap->DrawPixel(Point(x,y), Color(Color::HSBtoRGB(nHue, nSat, nBri)));
}
}
break;
case RED:
while (y--)
{
- Scanline pScanline = pWriteAccess->GetScanline( y );
aBitmapColor.SetGreen(pRGB_Vert[y]);
x = nWidth;
while (x--)
{
aBitmapColor.SetBlue(pRGB_Horiz[x]);
- pWriteAccess->SetPixelOnData(pScanline, x, aBitmapColor);
+ mxBitmap->DrawPixel(Point(x,y), aBitmapColor);
}
}
break;
case GREEN:
while (y--)
{
- Scanline pScanline = pWriteAccess->GetScanline( y );
aBitmapColor.SetRed(pRGB_Vert[y]);
x = nWidth;
while (x--)
{
aBitmapColor.SetBlue(pRGB_Horiz[x]);
- pWriteAccess->SetPixelOnData(pScanline, x, aBitmapColor);
+ mxBitmap->DrawPixel(Point(x,y), aBitmapColor);
}
}
break;
case BLUE:
while (y--)
{
- Scanline pScanline = pWriteAccess->GetScanline( y );
aBitmapColor.SetGreen(pRGB_Vert[y]);
x = nWidth;
while (x--)
{
aBitmapColor.SetRed(pRGB_Horiz[x]);
- pWriteAccess->SetPixelOnData(pScanline, x, aBitmapColor);
+ mxBitmap->DrawPixel(Point(x,y), aBitmapColor);
}
}
break;
}
- }
}
void ColorFieldControl::ShowPosition( const Point& rPos, bool bUpdate )
{
- if (!mpBitmap)
+ if (!mxBitmap)
{
UpdateBitmap();
Invalidate();
}
- if (!mpBitmap)
+ if (!mxBitmap)
return;
- const Size aSize(mpBitmap->GetSizePixel());
+ const Size aSize(mxBitmap->GetOutputSizePixel());
long nX = rPos.X();
long nY = rPos.Y();
@@ -450,14 +436,7 @@ void ColorFieldControl::ShowPosition( const Point& rPos, bool bUpdate )
mdX = double(nX) / double(aSize.Width() - 1.0);
mdY = double(aSize.Height() - 1.0 - nY) / double(aSize.Height() - 1.0);
- BitmapReadAccess* pReadAccess = mpBitmap->AcquireReadAccess();
- if (pReadAccess != nullptr)
- {
- // mpBitmap always has a bit count of 24 => use of GetPixel(...) is safe
- maColor = pReadAccess->GetPixel(nY, nX).GetColor();
- Bitmap::ReleaseAccess(pReadAccess);
- pReadAccess = nullptr;
- }
+ maColor = mxBitmap->GetPixel(Point(nX, nY)).GetColor();
}
}
@@ -535,18 +514,11 @@ void ColorFieldControl::KeyInput( const KeyEvent& rKEvt )
void ColorFieldControl::Paint(vcl::RenderContext& rRenderContext, const ::tools::Rectangle& rRect)
{
- if (!mpBitmap)
+ if (!mxBitmap)
UpdateBitmap();
- if (mpBitmap)
- {
- Bitmap aOutputBitmap(*mpBitmap);
-
- if (GetBitCount() <= 8)
- aOutputBitmap.Dither();
-
- rRenderContext.DrawBitmap(rRect.TopLeft(), rRect.GetSize(), rRect.TopLeft(), rRect.GetSize(), aOutputBitmap);
- }
+ if (mxBitmap)
+ rRenderContext.DrawOutDev(rRect.TopLeft(), rRect.GetSize(), rRect.TopLeft(), rRect.GetSize(), *mxBitmap);
// draw circle around current color
if (maColor.IsDark())
More information about the Libreoffice-commits
mailing list