[Libreoffice-commits] core.git: Branch 'feature/opengl-vcl' - 6 commits - vcl/inc vcl/opengl vcl/source vcl/win vcl/workben
Michael Meeks
michael.meeks at collabora.com
Fri Nov 14 05:26:19 PST 2014
vcl/inc/impimagetree.hxx | 7 ++-
vcl/opengl/salbmp.cxx | 12 +++++-
vcl/source/gdi/impimage.cxx | 9 ++--
vcl/source/gdi/impimagetree.cxx | 69 +++++++++++++++++++++++--------------
vcl/win/source/gdi/winlayout.cxx | 72 +++++++++++++++++++++++++++++++--------
vcl/workben/vcldemo.cxx | 70 +++++++++++++++++++++++++++++++++----
6 files changed, 183 insertions(+), 56 deletions(-)
New commits:
commit f1e5ea6801085b9594263cf41d7421b618189973
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Fri Nov 14 11:58:28 2014 +0000
vcldemo: dump and render all icons from images.zip when zoomed in.
Change-Id: I89f37b8a1ed70334a3485bc3ca06d04cfe6d0827
diff --git a/vcl/inc/impimagetree.hxx b/vcl/inc/impimagetree.hxx
index 712ec80..9e4f579 100644
--- a/vcl/inc/impimagetree.hxx
+++ b/vcl/inc/impimagetree.hxx
@@ -55,6 +55,8 @@ public:
* be too late for the destructors of the bitmaps in m_iconCache)*/
void shutDown();
+ css::uno::Reference< css::container::XNameAccess > getNameAccess();
+
private:
bool doLoadImage(
OUString const & name, OUString const & style,
@@ -62,8 +64,7 @@ private:
typedef std::pair<
OUString,
- com::sun::star::uno::Reference<
- com::sun::star::container::XNameAccess > > Path;
+ css::uno::Reference< css::container::XNameAccess > > Path;
typedef boost::unordered_map<
OUString, bool, OUStringHash > CheckStyleCache;
@@ -78,6 +79,8 @@ private:
bool m_cacheIcons;
IconLinkHash m_linkHash;
+ bool checkPathAccess();
+
void setStyle(OUString const & style );
void resetPaths();
@@ -89,7 +92,6 @@ private:
void loadImageLinks();
void parseLinkFile(boost::shared_ptr< SvStream > stream);
OUString const & getRealImageName(OUString const & name);
- std::vector<OUString> getAllPaths();
};
typedef salhelper::SingletonRef< ImplImageTree > ImplImageTreeSingletonRef;
diff --git a/vcl/source/gdi/impimagetree.cxx b/vcl/source/gdi/impimagetree.cxx
index b5fc822..0778bec 100644
--- a/vcl/source/gdi/impimagetree.cxx
+++ b/vcl/source/gdi/impimagetree.cxx
@@ -248,17 +248,9 @@ bool ImplImageTree::find(
}
}
- if (!m_path.second.is()) {
- try {
- m_path.second = css::packages::zip::ZipFileAccess::createWithURL(comphelper::getProcessComponentContext(), m_path.first + ".zip");
- } catch (const css::uno::RuntimeException &) {
- throw;
- } catch (const css::uno::Exception & e) {
- SAL_INFO("vcl", "ImplImageTree::find exception "
- << e.Message << " for " << m_path.first);
- return false;
- }
- }
+ if (!checkPathAccess())
+ return false;
+
for (std::vector< OUString >::const_reverse_iterator j(paths.rbegin());
j != paths.rend(); ++j)
{
@@ -288,21 +280,9 @@ void ImplImageTree::loadImageLinks()
}
}
- if ( !m_path.second.is() )
- {
- try
- {
- m_path.second = css::packages::zip::ZipFileAccess::createWithURL(comphelper::getProcessComponentContext(), m_path.first + ".zip");
- } catch (const css::uno::RuntimeException &) {
- throw;
- }
- catch (const css::uno::Exception & e)
- {
- SAL_INFO("vcl", "ImplImageTree::find exception "
- << e.Message << " for " << m_path.first);
- return;
- }
- }
+ if (!checkPathAccess())
+ return;
+
if ( m_path.second->hasByName(aLinkFilename) )
{
css::uno::Reference< css::io::XInputStream > s;
@@ -349,21 +329,41 @@ OUString const & ImplImageTree::getRealImageName(OUString const & name)
return it->second;
}
-std::vector<OUString> ImplImageTree::getAllPaths()
+bool ImplImageTree::checkPathAccess()
{
- std::vector<OUString> aNames;
+ if (m_path.second.is())
+ return true;
+
+ try {
+ m_path.second = css::packages::zip::ZipFileAccess::createWithURL(comphelper::getProcessComponentContext(), m_path.first + ".zip");
+ } catch (const css::uno::RuntimeException &) {
+ throw;
+ } catch (const css::uno::Exception & e) {
+ SAL_INFO("vcl", "ImplImageTree::zip file location exception "
+ << e.Message << " for " << m_path.first);
+ return false;
+ }
+ return m_path.second.is();
+}
- return aNames;
+css::uno::Reference< css::container::XNameAccess > ImplImageTree::getNameAccess()
+{
+ checkPathAccess();
+ return m_path.second;
}
// For vcldemo / debugging
-SAL_DLLPUBLIC std::vector<OUString> ImageTree_getAllImageNames();
+SAL_DLLPUBLIC css::uno::Sequence< OUString > ImageTree_getAllImageNames();
/// Recursively dump all names ...
-std::vector<OUString> ImageTree_getAllImageNames()
+css::uno::Sequence< OUString > ImageTree_getAllImageNames()
{
static ImplImageTreeSingletonRef aImageTree;
- return aImageTree.getAllPaths();
+
+ css::uno::Reference< css::container::XNameAccess > xRef(
+ aImageTree->getNameAccess() );
+
+ return xRef->getElementNames();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 58dd92c..01c05c0 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -32,7 +32,7 @@
#endif
// debugging hook just for us
-SAL_DLLPUBLIC std::vector<OUString> ImageTree_getAllImageNames();
+SAL_DLLPUBLIC css::uno::Sequence< OUString > ImageTree_getAllImageNames();
using namespace css;
@@ -579,6 +579,7 @@ public:
struct DrawIcons : public RegionRenderer
{
+ std::vector<OUString> maIconNames;
std::vector<BitmapEx> maIcons;
bool bHasLoadedAll;
DrawIcons() : bHasLoadedAll(false)
@@ -609,18 +610,24 @@ public:
"cmd/lc_hyperlinkdialog.png",
};
for (size_t i = 0; i < SAL_N_ELEMENTS(pNames); i++)
- maIcons.push_back(BitmapEx(OUString::createFromAscii(pNames[i])));
+ {
+ maIconNames.push_back(OUString::createFromAscii(pNames[i]));
+ maIcons.push_back(BitmapEx(maIconNames[i]));
+ }
}
- void LoadAllIcons()
+ void LoadAllImages()
{
if (bHasLoadedAll)
return;
bHasLoadedAll = true;
- std::vector<OUString> aAllIcons = ImageTree_getAllImageNames();
- for (size_t i = 0; i < aAllIcons.size(); i++)
+ css::uno::Sequence< OUString > aAllIcons = ImageTree_getAllImageNames();
+ for (sal_Int32 i = 0; i < aAllIcons.getLength() && i < 1024; i++)
+ {
+ maIconNames.push_back(aAllIcons[i]);
maIcons.push_back(BitmapEx(aAllIcons[i]));
+ }
}
void doDrawIcons(OutputDevice &rDev, Rectangle r)
@@ -630,6 +637,7 @@ public:
for (size_t i = 0; i < maIcons.size(); i++)
{
Size aSize(maIcons[i].GetSizePixel());
+// sAL_DEBUG("Draw icon '" << maIconNames[i] << "'");
rDev.DrawBitmapEx(p, maIcons[i]);
p.Move(aSize.Width(), 0);
if (aSize.Height() > nMaxH)
@@ -648,6 +656,7 @@ public:
{
if (rCtx.meStyle == RENDER_EXPANDED)
{
+ LoadAllImages();
doDrawIcons(rDev, r);
}
else
commit fe72da5fa36206a4bd9bd6f1fc4aff1b8115a3b9
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Fri Nov 14 11:56:46 2014 +0000
vcl: Fix palette modification during BitmapWriteAccess lifetime.
Change-Id: I8bdedd63895ff0b3245d996cf35ac92d9ab0ff9d
diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index ab27ade..c2ebb68 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -234,9 +234,12 @@ public:
ImplPixelFormat8( const BitmapPalette& rPalette )
: mrPalette( rPalette )
{
+ if ( mrPalette.GetEntryCount() < 256 )
+ SAL_WARN( "vcl.opengl", "Bad sign, if we get an OOB pixel we die" );
}
virtual const BitmapColor& ReadPixel() SAL_OVERRIDE
{
+ assert( mrPalette.GetEntryCount() > *mpData );
return mrPalette[ *mpData++ ];
}
};
@@ -252,6 +255,8 @@ public:
ImplPixelFormat4( const BitmapPalette& rPalette )
: mrPalette( rPalette )
{
+ if ( mrPalette.GetEntryCount() < 16 )
+ SAL_WARN( "vcl.opengl", "Bad sign, if we get an OOB pixel we die" );
}
virtual void StartLine( sal_uInt8* pLine ) SAL_OVERRIDE
{
@@ -261,7 +266,9 @@ public:
}
virtual const BitmapColor& ReadPixel() SAL_OVERRIDE
{
- const BitmapColor& rColor = mrPalette[( mpData[mnX >> 1] >> mnShift) & 0x0f];
+ sal_uInt32 nIdx = ( mpData[mnX >> 1] >> mnShift) & 0x0f;
+ assert( mrPalette.GetEntryCount() > nIdx );
+ const BitmapColor& rColor = mrPalette[nIdx];
mnX++;
mnShift ^= 4;
return rColor;
@@ -508,6 +515,9 @@ void OpenGLSalBitmap::ReleaseBuffer( BitmapBuffer* pBuffer, bool bReadOnly )
maTexture = OpenGLTexture();
mbDirtyTexture = true;
}
+ // The palette is modified on read during the BitmapWriteAccess,
+ // but of course, often it is not modified; interesting.
+ maPalette = pBuffer->maPalette;
delete pBuffer;
}
commit 1c0e30c2f37c6b620c1e1601c3089189cef06d5b
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Fri Nov 14 09:47:09 2014 +0000
vcldemo: much improved icon rendering tests.
Change-Id: I853bc0a0957cf0db629a0a5f1ced67bc069d8403
diff --git a/vcl/inc/impimagetree.hxx b/vcl/inc/impimagetree.hxx
index 85e3640..712ec80 100644
--- a/vcl/inc/impimagetree.hxx
+++ b/vcl/inc/impimagetree.hxx
@@ -89,6 +89,7 @@ private:
void loadImageLinks();
void parseLinkFile(boost::shared_ptr< SvStream > stream);
OUString const & getRealImageName(OUString const & name);
+ std::vector<OUString> getAllPaths();
};
typedef salhelper::SingletonRef< ImplImageTree > ImplImageTreeSingletonRef;
diff --git a/vcl/source/gdi/impimagetree.cxx b/vcl/source/gdi/impimagetree.cxx
index e81bafe..b5fc822 100644
--- a/vcl/source/gdi/impimagetree.cxx
+++ b/vcl/source/gdi/impimagetree.cxx
@@ -349,4 +349,21 @@ OUString const & ImplImageTree::getRealImageName(OUString const & name)
return it->second;
}
+std::vector<OUString> ImplImageTree::getAllPaths()
+{
+ std::vector<OUString> aNames;
+
+ return aNames;
+}
+
+// For vcldemo / debugging
+SAL_DLLPUBLIC std::vector<OUString> ImageTree_getAllImageNames();
+
+/// Recursively dump all names ...
+std::vector<OUString> ImageTree_getAllImageNames()
+{
+ static ImplImageTreeSingletonRef aImageTree;
+ return aImageTree.getAllPaths();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/workben/vcldemo.cxx b/vcl/workben/vcldemo.cxx
index 06a6d86..58dd92c 100644
--- a/vcl/workben/vcldemo.cxx
+++ b/vcl/workben/vcldemo.cxx
@@ -31,6 +31,9 @@
# define FIXME_SELF_INTERSECTING_WORKING
#endif
+// debugging hook just for us
+SAL_DLLPUBLIC std::vector<OUString> ImageTree_getAllImageNames();
+
using namespace css;
class DemoBase :
@@ -577,39 +580,79 @@ public:
struct DrawIcons : public RegionRenderer
{
std::vector<BitmapEx> maIcons;
- DrawIcons()
+ bool bHasLoadedAll;
+ DrawIcons() : bHasLoadedAll(false)
{
+ // a few icons to start with
const char *pNames[] = {
"cmd/lc_openurl.png",
"cmd/lc_newdoc.png",
+ "cmd/lc_choosemacro.png",
"cmd/lc_save.png",
"cmd/lc_saveas.png",
+ "cmd/lc_importdialog.png",
"cmd/lc_sendmail.png",
"cmd/lc_editdoc.png",
"cmd/lc_print.png",
+ "cmd/lc_combobox.png",
+ "cmd/lc_insertformcombo.png",
"cmd/lc_printpreview.png",
"cmd/lc_cut.png",
"cmd/lc_copy.png",
"cmd/lc_paste.png",
+ "cmd/sc_autopilotmenu.png",
"cmd/lc_formatpaintbrush.png",
"cmd/lc_undo.png",
"cmd/lc_redo.png",
- };
+ "cmd/lc_marks.png",
+ "cmd/lc_fieldnames.png",
+ "cmd/lc_hyperlinkdialog.png",
+ };
for (size_t i = 0; i < SAL_N_ELEMENTS(pNames); i++)
maIcons.push_back(BitmapEx(OUString::createFromAscii(pNames[i])));
}
- virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
- const RenderContext &) SAL_OVERRIDE
+ void LoadAllIcons()
{
- Rectangle p(r);
+ if (bHasLoadedAll)
+ return;
+ bHasLoadedAll = true;
+
+ std::vector<OUString> aAllIcons = ImageTree_getAllImageNames();
+ for (size_t i = 0; i < aAllIcons.size(); i++)
+ maIcons.push_back(BitmapEx(aAllIcons[i]));
+ }
+
+ void doDrawIcons(OutputDevice &rDev, Rectangle r)
+ {
+ long nMaxH = 0, nVPos = 0;
+ Point p(r.TopLeft());
for (size_t i = 0; i < maIcons.size(); i++)
{
Size aSize(maIcons[i].GetSizePixel());
- rDev.DrawBitmapEx(p.TopLeft(), maIcons[i]);
+ rDev.DrawBitmapEx(p, maIcons[i]);
p.Move(aSize.Width(), 0);
- if (p.Left() >= r.Right())
- break;
+ if (aSize.Height() > nMaxH)
+ nMaxH = aSize.Height();
+ if (p.X() >= r.Right())
+ {
+ nVPos += nMaxH;
+ nMaxH = 0;
+ p = Point(r.Left(), r.Top() + nVPos);
+ }
+ }
+ }
+
+ virtual void RenderRegion(OutputDevice &rDev, Rectangle r,
+ const RenderContext &rCtx) SAL_OVERRIDE
+ {
+ if (rCtx.meStyle == RENDER_EXPANDED)
+ {
+ doDrawIcons(rDev, r);
+ }
+ else
+ {
+ doDrawIcons(rDev, r);
}
}
};
commit 657e9b7d97f485f3f80d92fed36761c7dea5334e
Author: Michael Meeks <michael.meeks at collabora.com>
Date: Fri Nov 14 08:40:45 2014 +0000
vcl: re-factor image rendering control-flow.
Change-Id: I923f92e5e84d35dafd1c0d1b4d63916ce690cb90
diff --git a/vcl/source/gdi/impimage.cxx b/vcl/source/gdi/impimage.cxx
index c8f4a72..0072087 100644
--- a/vcl/source/gdi/impimage.cxx
+++ b/vcl/source/gdi/impimage.cxx
@@ -331,10 +331,9 @@ pOutDev
if( !mpDisplayBmp && !maBmpEx.IsEmpty() )
{
#if defined WNT
- if( maBmpEx.IsAlpha() )
- mpDisplayBmp = new BitmapEx( maBmpEx );
- else
+ if( !maBmpEx.IsAlpha() )
{
+ // FIXME: this looks like rather an obsolete code-path to me.
const Bitmap aBmp( maBmpEx.GetBitmap().CreateDisplayBitmap( pOutDev ) );
if( maBmpEx.IsTransparent() )
@@ -342,9 +341,9 @@ pOutDev
else
mpDisplayBmp = new BitmapEx( aBmp );
}
-#else
- mpDisplayBmp = new BitmapEx( maBmpEx );
+ else
#endif
+ mpDisplayBmp = new BitmapEx( maBmpEx );
}
}
commit daf776a553c6783c93128bfec9bcab8b4472fc0d
Author: Jan Holesovsky <kendy at collabora.com>
Date: Fri Nov 14 13:58:09 2014 +0100
windows opengl: Finally got the text working.
It still does not have a transparent background, but that is pending support in
OpenGLSalGraphicsImpl.
Change-Id: I477a483e6ac940f54f6ffd6816d753d87206bf23
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index ae4ea3a..04672ce 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -192,27 +192,38 @@ void WinLayout::DrawText(SalGraphics& rGraphics) const
// TODO: check the performance of this 2nd approach at some stage and
// switch to that if it performs well.
- // FIXME so that we don't have to use enormous bitmap, move the text
- // to 0,0, size the width / height accordingly, and move it back via
- // SalTwoRects later
- const int width = 1024;
- const int height = 1024;
+ Rectangle aRect;
+ GetBoundRect(rGraphics, aRect);
+
+ const int origin_x = aRect.Left();
+ const int origin_y = aRect.Top();
+ const int width = aRect.GetWidth();
+ const int height = aRect.GetHeight();
const int bpp = 32;
HDC compatibleDC = CreateCompatibleDC(hDC);
+ // move the origin so that we always paint at 0,0 - to keep the bitmap
+ // small
+ OffsetViewportOrgEx(compatibleDC, -origin_x, -origin_y, NULL);
+
sal_uInt8 *data;
HBITMAP hBitmap = WinSalVirtualDevice::ImplCreateVirDevBitmap(compatibleDC, width, height, bpp, reinterpret_cast<void **>(&data));
- // FIXME fill transparent instead of 128, this is for testing
- memset(data, 128, width*height*4);
- // draw the text to the hidden DC with black color and white
- // background, we will use the result later as a mask only
+ // setup the hidden DC with black color and white background, we will
+ // use the result of the text drawing later as a mask only
HGDIOBJ hBitmapOld = SelectObject(compatibleDC, hBitmap);
SelectFont(compatibleDC, mhFont);
+
SetTextColor(compatibleDC, RGB(0, 0, 0));
SetBkColor(compatibleDC, RGB(255, 255, 255));
+
+ UINT nTextAlign = GetTextAlign(hDC);
+ SetTextAlign(compatibleDC, nTextAlign);
+
+ // the actual drawing
DrawTextImpl(compatibleDC);
+
SelectObject(compatibleDC, hBitmapOld);
// and turn it into a texture
@@ -227,8 +238,8 @@ void WinLayout::DrawText(SalGraphics& rGraphics) const
aRects.mnSrcY = 0;
aRects.mnSrcWidth = width;
aRects.mnSrcHeight = height;
- aRects.mnDestX = 0;
- aRects.mnDestY = 0;
+ aRects.mnDestX = origin_x;
+ aRects.mnDestY = origin_y;
aRects.mnDestWidth = width;
aRects.mnDestHeight = height;
commit 69baf1300689632faff35465f952ca58429f19c9
Author: Jan Holesovsky <kendy at collabora.com>
Date: Fri Nov 14 11:15:17 2014 +0100
windows opengl: Explain the concept of the text drawing + minor fixes.
Change-Id: I4651e7e9b8163844be548d4ed975a881d4f83fff
diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx
index 3d3c625..ae4ea3a 100644
--- a/vcl/win/source/gdi/winlayout.cxx
+++ b/vcl/win/source/gdi/winlayout.cxx
@@ -163,7 +163,34 @@ void WinLayout::DrawText(SalGraphics& rGraphics) const
}
else
{
- // we have to render the text to a hidden texture, and draw it
+ // We have to render the text to a hidden texture, and draw it.
+ //
+ // Note that Windows GDI does not really support the alpha correctly
+ // when drawing - ie. it draws nothing to the alpha channel when
+ // rendering the text, even the antialiasing is done as 'real' pixels,
+ // not alpha...
+ //
+ // Luckily, this does not really limit us:
+ //
+ // To blend properly, we draw the texture, but then use it as an alpha
+ // channel for solid color (that will define the text color). This
+ // destroys the subpixel antialiasing - turns it into 'classic'
+ // antialiasing - but that is the best we can do, because the subpixel
+ // antialiasing needs to know what is in the background: When the
+ // background is white, or white-ish, it does the subpixel, but when
+ // there is a color, it just darkens the color (and does this even
+ // when part of the character is on a colored background, and part on
+ // white). It has to work this way, the results would look strange
+ // otherwise.
+ //
+ // For the GL rendering to work even with the subpixel antialiasing,
+ // we would need to get the current texture from the screen, let GDI
+ // draw the text to it (so that it can decide well where to use the
+ // subpixel and where not), and draw the result - but in that case we
+ // don't need alpha anyway.
+ //
+ // TODO: check the performance of this 2nd approach at some stage and
+ // switch to that if it performs well.
// FIXME so that we don't have to use enormous bitmap, move the text
// to 0,0, size the width / height accordingly, and move it back via
@@ -176,12 +203,15 @@ void WinLayout::DrawText(SalGraphics& rGraphics) const
sal_uInt8 *data;
HBITMAP hBitmap = WinSalVirtualDevice::ImplCreateVirDevBitmap(compatibleDC, width, height, bpp, reinterpret_cast<void **>(&data));
- // FIXME fill transparent instead of 128
+ // FIXME fill transparent instead of 128, this is for testing
memset(data, 128, width*height*4);
- // draw the text to the hidden DC
+ // draw the text to the hidden DC with black color and white
+ // background, we will use the result later as a mask only
HGDIOBJ hBitmapOld = SelectObject(compatibleDC, hBitmap);
SelectFont(compatibleDC, mhFont);
+ SetTextColor(compatibleDC, RGB(0, 0, 0));
+ SetBkColor(compatibleDC, RGB(255, 255, 255));
DrawTextImpl(compatibleDC);
SelectObject(compatibleDC, hBitmapOld);
@@ -203,7 +233,12 @@ void WinLayout::DrawText(SalGraphics& rGraphics) const
aRects.mnDestHeight = height;
pImpl->PreDraw();
- pImpl->DrawAlphaTexture(aTexture, aRects);
+ COLORREF color = GetTextColor(hDC);
+ SalColor salColor = MAKE_SALCOLOR(GetRValue(color), GetGValue(color), GetBValue(color));
+ // TODO when we have it:
+ // pImpl->DrawSolidColorWithMask(salColor, aTexture, aRects);
+ // and kill the following interim thing:
+ pImpl->DrawTexture(aTexture, aRects);
pImpl->PostDraw();
}
More information about the Libreoffice-commits
mailing list