2016-08-22 18:10:02 +09:00
|
|
|
/* -*- 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/.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <math.h>
|
|
|
|
#include <rtl/math.hxx>
|
|
|
|
|
|
|
|
#include <comphelper/processfactory.hxx>
|
|
|
|
#include <comphelper/random.hxx>
|
|
|
|
#include <cppuhelper/bootstrap.hxx>
|
|
|
|
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
|
|
|
|
#include <com/sun/star/lang/XInitialization.hpp>
|
|
|
|
#include <com/sun/star/registry/XSimpleRegistry.hpp>
|
|
|
|
#include <com/sun/star/ucb/UniversalContentBroker.hpp>
|
|
|
|
|
|
|
|
#include <osl/time.h>
|
|
|
|
#include <vcl/vclmain.hxx>
|
|
|
|
#include <vcl/layout.hxx>
|
|
|
|
#include <salhelper/thread.hxx>
|
|
|
|
|
|
|
|
#include <tools/urlobj.hxx>
|
|
|
|
#include <tools/stream.hxx>
|
|
|
|
#include <tools/poly.hxx>
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#include <vcl/pngread.hxx>
|
|
|
|
#include <vcl/wrkwin.hxx>
|
|
|
|
#include <vcl/virdev.hxx>
|
|
|
|
#include <vcl/graphicfilter.hxx>
|
|
|
|
#include <vcl/button.hxx>
|
|
|
|
#include <vcl/toolbox.hxx>
|
|
|
|
#include <vcl/pngwrite.hxx>
|
|
|
|
#include <vcl/floatwin.hxx>
|
|
|
|
#include <vcl/salbtype.hxx>
|
|
|
|
#include <vcl/bitmapaccess.hxx>
|
|
|
|
#include <vcl/help.hxx>
|
|
|
|
|
|
|
|
#include <basegfx/numeric/ftools.hxx>
|
|
|
|
#include <basegfx/matrix/b2dhommatrix.hxx>
|
|
|
|
#include <vcldemo-debug.hxx>
|
|
|
|
|
|
|
|
#include <rtl/math.hxx>
|
|
|
|
|
|
|
|
#include <chrono>
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
#include "test/outputdevice.hxx"
|
|
|
|
|
|
|
|
using namespace css;
|
|
|
|
|
|
|
|
void drawBitmapCentered(Rectangle& rRect, Bitmap aBitmap, vcl::RenderContext& rRenderContext)
|
|
|
|
{
|
|
|
|
long nWidth = rRect.GetWidth();
|
|
|
|
long nHeight = rRect.GetHeight();
|
|
|
|
|
|
|
|
Size aBitmapSize(aBitmap.GetSizePixel());
|
|
|
|
|
|
|
|
Point aPoint(rRect.TopLeft());
|
|
|
|
|
|
|
|
aPoint.X() += (nWidth - aBitmapSize.Width()) / 2;
|
|
|
|
aPoint.Y() += (nHeight - aBitmapSize.Height()) / 2;
|
|
|
|
|
|
|
|
rRenderContext.DrawBitmap(aPoint, aBitmap);
|
|
|
|
}
|
|
|
|
|
|
|
|
void drawBitmapScaledAndCentered(Rectangle& rRect, Bitmap aBitmap, vcl::RenderContext& rRenderContext, BmpScaleFlag aFlag = BmpScaleFlag::Fast)
|
|
|
|
{
|
|
|
|
long nWidth = rRect.GetWidth();
|
|
|
|
long nHeight = rRect.GetHeight();
|
|
|
|
|
|
|
|
Size aBitmapSize(aBitmap.GetSizePixel());
|
|
|
|
|
|
|
|
double fWidthHeight = nWidth > nHeight ? nHeight : nWidth;
|
|
|
|
double fScale = fWidthHeight / aBitmapSize.Width();
|
|
|
|
aBitmap.Scale(fScale, fScale, aFlag);
|
|
|
|
|
|
|
|
drawBitmapCentered(rRect, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
void drawBackgroundRect(Rectangle& rRect, Color aColor, vcl::RenderContext& rRenderContext)
|
|
|
|
{
|
|
|
|
rRenderContext.Push(PushFlags::LINECOLOR | PushFlags::FILLCOLOR);
|
|
|
|
rRenderContext.SetFillColor(aColor);
|
|
|
|
rRenderContext.SetLineColor(aColor);
|
|
|
|
rRenderContext.DrawRect(rRect);
|
|
|
|
rRenderContext.Pop();
|
|
|
|
}
|
|
|
|
|
|
|
|
void assertAndSetBackground(vcl::test::TestResult eResult, Rectangle& rRect, vcl::RenderContext& rRenderContext)
|
|
|
|
{
|
|
|
|
if (eResult == vcl::test::TestResult::Passed)
|
|
|
|
drawBackgroundRect(rRect, COL_GREEN, rRenderContext);
|
|
|
|
else if (eResult == vcl::test::TestResult::PassedWithQuirks)
|
|
|
|
drawBackgroundRect(rRect, COL_YELLOW, rRenderContext);
|
|
|
|
else if (eResult == vcl::test::TestResult::Failed)
|
|
|
|
drawBackgroundRect(rRect, COL_RED, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
class VisualBackendTestWindow : public WorkWindow
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
Timer maUpdateTimer;
|
|
|
|
std::vector<std::chrono::high_resolution_clock::time_point> mTimePoints;
|
|
|
|
unsigned char mnNumberOfTests;
|
|
|
|
unsigned char mnTest;
|
|
|
|
bool mbAnimate;
|
|
|
|
ScopedVclPtr<VirtualDevice> mpVDev;
|
|
|
|
|
|
|
|
public:
|
|
|
|
VisualBackendTestWindow()
|
2016-08-23 16:36:20 +10:00
|
|
|
: WorkWindow(nullptr, WB_APP | WB_STDWORK)
|
2016-08-22 18:10:02 +09:00
|
|
|
, mnNumberOfTests(6)
|
|
|
|
, mnTest(10 * mnNumberOfTests)
|
|
|
|
, mbAnimate(mnTest % mnNumberOfTests == mnNumberOfTests - 1)
|
|
|
|
, mpVDev(VclPtr<VirtualDevice>::Create())
|
|
|
|
{
|
|
|
|
maUpdateTimer.SetTimeoutHdl(LINK(this, VisualBackendTestWindow, updateHdl));
|
|
|
|
maUpdateTimer.SetPriority(SchedulerPriority::REPAINT);
|
|
|
|
if (mbAnimate)
|
|
|
|
{
|
|
|
|
maUpdateTimer.SetTimeout(1000.0);
|
|
|
|
maUpdateTimer.Start();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-13 13:09:01 +02:00
|
|
|
virtual ~VisualBackendTestWindow() override
|
2016-08-22 18:10:02 +09:00
|
|
|
{
|
|
|
|
disposeOnce();
|
|
|
|
}
|
|
|
|
|
|
|
|
DECL_LINK_TYPED(updateHdl, Timer*, void);
|
|
|
|
|
|
|
|
virtual void dispose() override
|
|
|
|
{
|
|
|
|
WorkWindow::dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void KeyInput(const KeyEvent& rKEvt) override
|
|
|
|
{
|
|
|
|
sal_uInt16 nCode = rKEvt.GetKeyCode().GetCode();
|
|
|
|
|
|
|
|
if (nCode == KEY_BACKSPACE)
|
|
|
|
mnTest--;
|
|
|
|
else if(nCode == KEY_SPACE)
|
|
|
|
mnTest++;
|
|
|
|
|
|
|
|
if (nCode == KEY_BACKSPACE || nCode == KEY_SPACE)
|
|
|
|
{
|
|
|
|
if (mnTest % mnNumberOfTests == mnNumberOfTests - 1)
|
|
|
|
{
|
|
|
|
mbAnimate = true;
|
|
|
|
maUpdateTimer.Start();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mbAnimate = false;
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-23 16:36:20 +10:00
|
|
|
static std::vector<Rectangle> setupRegions(int nPartitionsX, int nPartitionsY, int nWidth, int nHeight)
|
2016-08-22 18:10:02 +09:00
|
|
|
{
|
|
|
|
std::vector<Rectangle> aRegions;
|
|
|
|
|
|
|
|
for (int y = 0; y < nPartitionsY; y++)
|
|
|
|
{
|
|
|
|
for (int x = 0; x < nPartitionsX; x++)
|
|
|
|
{
|
|
|
|
long x1 = x * (nWidth / nPartitionsX);
|
|
|
|
long y1 = y * (nHeight / nPartitionsY);
|
|
|
|
long x2 = (x+1) * (nWidth / nPartitionsX);
|
|
|
|
long y2 = (y+1) * (nHeight / nPartitionsY);
|
|
|
|
|
|
|
|
aRegions.push_back(Rectangle(x1 + 1, y1 + 1, x2 - 2, y2 - 2));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return aRegions;
|
|
|
|
}
|
|
|
|
|
2016-08-23 16:36:20 +10:00
|
|
|
static void testRectangles(vcl::RenderContext& rRenderContext, int nWidth, int nHeight)
|
2016-08-22 18:10:02 +09:00
|
|
|
{
|
|
|
|
Rectangle aRectangle;
|
|
|
|
size_t index = 0;
|
|
|
|
|
|
|
|
std::vector<Rectangle> aRegions = setupRegions(3, 2, nWidth, nHeight);
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestRect aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPixel aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolyLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolyPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-23 16:36:20 +10:00
|
|
|
static void testFilledRectangles(vcl::RenderContext& rRenderContext, int nWidth, int nHeight)
|
2016-08-22 18:10:02 +09:00
|
|
|
{
|
|
|
|
Rectangle aRectangle;
|
|
|
|
size_t index = 0;
|
|
|
|
|
|
|
|
std::vector<Rectangle> aRegions = setupRegions(3, 2, nWidth, nHeight);
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestRect aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupFilledRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkFilledRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupFilledRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkFilledRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolyPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupFilledRectangle();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkFilledRectangle(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDiamond();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkDiamond(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDiamond();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkDiamond(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolyLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDiamond();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkDiamond(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-23 16:36:20 +10:00
|
|
|
static void testLines(vcl::RenderContext& rRenderContext, int nWidth, int nHeight)
|
2016-08-22 18:10:02 +09:00
|
|
|
{
|
|
|
|
Rectangle aRectangle;
|
|
|
|
size_t index = 0;
|
|
|
|
|
|
|
|
std::vector<Rectangle> aRegions = setupRegions(3, 2, nWidth, nHeight);
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupLines();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkLines(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolyLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupLines();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkLines(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupLines();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkLines(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupAALines();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkAALines(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolyLine aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupAALines();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkAALines(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestPolygon aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupAALines();
|
2016-08-23 15:28:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestCommon::checkAALines(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-23 16:36:20 +10:00
|
|
|
static void testBitmaps(vcl::RenderContext& rRenderContext, int nWidth, int nHeight)
|
2016-08-22 18:10:02 +09:00
|
|
|
{
|
|
|
|
Rectangle aRectangle;
|
|
|
|
size_t index = 0;
|
|
|
|
|
|
|
|
std::vector<Rectangle> aRegions = setupRegions(2, 2, nWidth, nHeight);
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestBitmap aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDrawBitmap();
|
2016-08-23 16:06:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestBitmap::checkTransformedBitmap(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestBitmap aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDrawTransformedBitmap();
|
2016-08-23 16:06:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestBitmap::checkTransformedBitmap(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestBitmap aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDrawBitmapExWithAlpha();
|
2016-08-23 16:06:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestBitmap::checkBitmapExWithAlpha(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestBitmap aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDrawMask();
|
2016-08-23 16:06:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestBitmap::checkMask(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
virtual void Paint(vcl::RenderContext& rRenderContext, const Rectangle& /*rRect*/) override
|
|
|
|
{
|
|
|
|
if (mnTest % mnNumberOfTests == mnNumberOfTests - 1)
|
|
|
|
{
|
|
|
|
rRenderContext.SetBackground(Wallpaper(COL_GREEN));
|
|
|
|
|
|
|
|
static size_t nTimeIndex = 0;
|
|
|
|
static const size_t constSamplesFPS = 120;
|
|
|
|
double fps = 0.0;
|
|
|
|
|
|
|
|
if (mTimePoints.size() < constSamplesFPS)
|
|
|
|
{
|
|
|
|
mTimePoints.push_back(std::chrono::high_resolution_clock::now());
|
|
|
|
nTimeIndex++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
size_t current = nTimeIndex % constSamplesFPS;
|
|
|
|
mTimePoints[current] = std::chrono::high_resolution_clock::now();
|
|
|
|
size_t last = (nTimeIndex + 1) % constSamplesFPS;
|
|
|
|
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(mTimePoints[current] - mTimePoints[last]).count();
|
|
|
|
fps = constSamplesFPS * 1000.0 / ms;
|
|
|
|
nTimeIndex++;
|
|
|
|
}
|
|
|
|
|
|
|
|
double fTime = 0.5 + std::sin(nTimeIndex / 100.0) / 2.0;
|
|
|
|
|
|
|
|
Size aSizePixel = GetSizePixel();
|
|
|
|
|
|
|
|
mpVDev->SetAntialiasing(AntialiasingFlags::EnableB2dDraw | AntialiasingFlags::PixelSnapHairline);
|
|
|
|
mpVDev->SetOutputSizePixel(aSizePixel);
|
|
|
|
mpVDev->SetBackground(Wallpaper(COL_LIGHTGRAY));
|
|
|
|
mpVDev->Erase();
|
|
|
|
mpVDev->SetFillColor(COL_LIGHTRED);
|
|
|
|
mpVDev->SetLineColor(COL_LIGHTBLUE);
|
|
|
|
|
|
|
|
basegfx::B2DPolyPolygon polyPolygon;
|
|
|
|
|
|
|
|
for (int b=10; b<14; b++)
|
|
|
|
{
|
|
|
|
basegfx::B2DPolygon polygon;
|
|
|
|
for (double a=0.0; a<360.0; a+=0.5)
|
|
|
|
{
|
|
|
|
double x = std::sin(a*M_PI / 180.0) * (b+1) * 20;
|
|
|
|
double y = std::cos(a*M_PI / 180.0) * (b+1) * 20;
|
|
|
|
polygon.append(basegfx::B2DPoint(x + 200 + 500 * fTime, y + 200 + 500 * fTime));
|
|
|
|
}
|
|
|
|
polygon.setClosed(true);
|
|
|
|
polyPolygon.append(polygon);
|
|
|
|
}
|
|
|
|
|
|
|
|
mpVDev->DrawPolyPolygon(polyPolygon);
|
|
|
|
|
|
|
|
Rectangle aGradientRect(Point(200, 200), Size(200 + fTime * 300, 200 + fTime * 300));
|
2016-09-02 10:53:14 +02:00
|
|
|
mpVDev->DrawGradient(aGradientRect, Gradient(GradientStyle::Linear, COL_YELLOW, COL_BLUE));
|
2016-08-22 18:10:02 +09:00
|
|
|
|
|
|
|
rRenderContext.DrawOutDev(Point(), mpVDev->GetOutputSizePixel(),
|
|
|
|
Point(), mpVDev->GetOutputSizePixel(),
|
|
|
|
*mpVDev.get());
|
|
|
|
rRenderContext.SetTextColor(COL_LIGHTRED);
|
2016-08-23 16:36:20 +10:00
|
|
|
rRenderContext.DrawText(Point(10, 10), "FPS: " + OUString::number(int(fps)));
|
2016-08-22 18:10:02 +09:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
rRenderContext.SetBackground(Wallpaper(COL_GREEN));
|
|
|
|
|
|
|
|
Size aSize = GetOutputSizePixel();
|
|
|
|
|
|
|
|
long nWidth = aSize.Width();
|
|
|
|
long nHeight = aSize.Height();
|
|
|
|
|
|
|
|
Rectangle aRectangle;
|
|
|
|
size_t index = 0;
|
|
|
|
|
|
|
|
if (mnTest % mnNumberOfTests == 0)
|
|
|
|
{
|
|
|
|
testRectangles(rRenderContext, nWidth, nHeight);
|
|
|
|
}
|
|
|
|
else if (mnTest % mnNumberOfTests == 1)
|
|
|
|
{
|
|
|
|
testFilledRectangles(rRenderContext, nWidth, nHeight);
|
|
|
|
}
|
|
|
|
else if (mnTest % mnNumberOfTests == 2)
|
|
|
|
{
|
|
|
|
testLines(rRenderContext, nWidth, nHeight);
|
|
|
|
}
|
|
|
|
else if (mnTest % mnNumberOfTests == 3)
|
|
|
|
{
|
|
|
|
testBitmaps(rRenderContext, nWidth, nHeight);
|
|
|
|
}
|
|
|
|
else if (mnTest % mnNumberOfTests == 4)
|
|
|
|
{
|
|
|
|
std::vector<Rectangle> aRegions = setupRegions(3, 2, nWidth, nHeight);
|
|
|
|
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestAnotherOutDev aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupDrawOutDev();
|
2016-08-23 16:06:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestAnotherOutDev::checkDrawOutDev(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestAnotherOutDev aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupXOR();
|
2016-08-23 16:06:35 +10:00
|
|
|
assertAndSetBackground(vcl::test::OutputDeviceTestAnotherOutDev::checkXOR(aBitmap), aRectangle, rRenderContext);
|
2016-08-22 18:10:02 +09:00
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestGradient aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupLinearGradient();
|
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
aRectangle = aRegions[index++];
|
|
|
|
{
|
|
|
|
vcl::test::OutputDeviceTestGradient aOutDevTest;
|
|
|
|
Bitmap aBitmap = aOutDevTest.setupRadialGradient();
|
|
|
|
drawBitmapScaledAndCentered(aRectangle, aBitmap, rRenderContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
IMPL_LINK_NOARG_TYPED(VisualBackendTestWindow, updateHdl, Timer *, void)
|
|
|
|
{
|
|
|
|
if (mbAnimate)
|
|
|
|
{
|
|
|
|
maUpdateTimer.SetTimeout(1000.0 / 60.0);
|
|
|
|
maUpdateTimer.Start();
|
|
|
|
Invalidate();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class VisualBackendTestApp : public Application
|
|
|
|
{
|
|
|
|
|
|
|
|
public:
|
|
|
|
VisualBackendTestApp()
|
|
|
|
{}
|
|
|
|
|
|
|
|
virtual int Main() override
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
ScopedVclPtrInstance<VisualBackendTestWindow> aMainWindow;
|
|
|
|
|
|
|
|
aMainWindow->SetText("VCL Test");
|
|
|
|
aMainWindow->Show();
|
|
|
|
|
|
|
|
Application::Execute();
|
|
|
|
}
|
|
|
|
catch (const css::uno::Exception& rException)
|
|
|
|
{
|
|
|
|
SAL_WARN("vcl.app", "Fatal exception: " << rException.Message);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
catch (const std::exception& rException)
|
|
|
|
{
|
|
|
|
SAL_WARN("vcl.app", "Fatal exception: " << rException.what());
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
uno::Reference<lang::XMultiServiceFactory> xMSF;
|
|
|
|
|
|
|
|
void Init() override
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
uno::Reference<uno::XComponentContext> xComponentContext = ::cppu::defaultBootstrap_InitialComponentContext();
|
|
|
|
xMSF = uno::Reference<lang::XMultiServiceFactory>(xComponentContext->getServiceManager(), uno::UNO_QUERY);
|
|
|
|
|
|
|
|
if (!xMSF.is())
|
|
|
|
Application::Abort("Bootstrap failure - no service manager");
|
|
|
|
|
|
|
|
comphelper::setProcessServiceFactory(xMSF);
|
|
|
|
}
|
|
|
|
catch (const uno::Exception &e)
|
|
|
|
{
|
|
|
|
Application::Abort("Bootstrap exception " + e.Message);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DeInit() override
|
|
|
|
{
|
|
|
|
uno::Reference<lang::XComponent> xComponent(comphelper::getProcessComponentContext(), uno::UNO_QUERY_THROW);
|
|
|
|
xComponent->dispose();
|
|
|
|
comphelper::setProcessServiceFactory(nullptr);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
void vclmain::createApplication()
|
|
|
|
{
|
|
|
|
static VisualBackendTestApp aApplication;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|