예제 #1
0
TEST(WebKitNix, WebViewTranslatedScaled)
{
    // This test opens a webpage that contains a white background, no viewport
    // metatag and a red rectangle (20x20)px at (0,0) position. The viewport is
    // then translated to (10,10) position. After that it's applied a scale=2.0
    // At this point we will have a red rectangle of (40x40)px at (10,10).

    const WKSize size = WKSizeMake(100, 100);
    ToolsNix::GLOffscreenBuffer offscreenBuffer(size.width, size.height);
    ASSERT_TRUE(offscreenBuffer.makeCurrent());

    WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate());
    WKRetainPtr<WKViewRef> view(AdoptWK, WKViewCreate(context.get(), 0));

    Util::ForceRepaintClient forceRepaintClient(view.get());
    forceRepaintClient.setClearColor(0, 0, 1, 1);

    const int delta = 10;
    WKViewSetUserViewportTranslation(view.get(), delta, delta);

    WKViewInitialize(view.get());
    WKPageSetUseFixedLayout(WKViewGetPage(view.get()), true);
    WKViewSetSize(view.get(), size);

    glViewport(0, 0, size.width, size.height);
    forceRepaintClient.clear();

    Util::PageLoader loader(view.get());

    loader.waitForLoadURLAndRepaint("../nix/red-square");

    for (double scale = 1.0; scale < 3.0; scale++) {
        WKViewSetContentScaleFactor(view.get(), scale);
        loader.forceRepaint();

        ToolsNix::RGBAPixel outsideTheContent = offscreenBuffer.readPixelAtPoint(delta - 1, delta - 1);
        EXPECT_EQ(ToolsNix::RGBAPixel::blue(), outsideTheContent);

        ToolsNix::RGBAPixel squareTopLeft = offscreenBuffer.readPixelAtPoint(delta, delta);
        EXPECT_EQ(ToolsNix::RGBAPixel::red(), squareTopLeft);

        const int scaledSize = scale * 20;
        ToolsNix::RGBAPixel squareBottomRight = offscreenBuffer.readPixelAtPoint(delta + scaledSize - 1, delta + scaledSize - 1);
        EXPECT_EQ(ToolsNix::RGBAPixel::red(), squareBottomRight);

        ToolsNix::RGBAPixel outsideSquare = offscreenBuffer.readPixelAtPoint(delta + scaledSize, delta + scaledSize);
        EXPECT_EQ(ToolsNix::RGBAPixel::white(), outsideSquare);
    }
}
예제 #2
0
TEST(WebKitNix, WebViewTranslated)
{
    const WKSize size = WKSizeMake(100, 100);
    ToolsNix::GLOffscreenBuffer offscreenBuffer(size.width, size.height);
    ASSERT_TRUE(offscreenBuffer.makeCurrent());

    WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate());

    const int translationDelta = 20;
    NIXViewAutoPtr view(NIXViewCreate(context.get(), 0));
    Util::ForceRepaintClient client(view.get());
    client.setClearColor(0, 0, 1, 1);

    NIXMatrix transform = NIXMatrixMakeTranslation(translationDelta, translationDelta);
    NIXViewSetUserViewportTransformation(view.get(), &transform);

    NIXViewInitialize(view.get());
    WKPageSetUseFixedLayout(NIXViewGetPage(view.get()), true);
    NIXViewSetSize(view.get(), size);

    glViewport(0, 0, size.width, size.height);
    glClearColor(0, 0, 1, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    Util::PageLoader loader(view.get());

    loader.waitForLoadURLAndRepaint("../nix/red-background");

    // Note that glReadPixels [0, 0] is at the bottom-left of the buffer, so a diagonal
    // line from the top-left, to the bottom-right, will have X values going up and Y
    // values going down. We are testing this diagonal here.

    // Original background.
    ToolsNix::RGBAPixel sample[int(size.width * size.height)];
    glReadPixels(0, 0, size.width, size.height, GL_RGBA, GL_UNSIGNED_BYTE, &sample);
    for (int x = 0, y = size.height - 1; x < translationDelta; x++, y--) {
        int index = y * size.height + x;
        EXPECT_EQ(ToolsNix::RGBAPixel::blue(), sample[index]) << "Error when checking for pixel (" << x << ", " << y << ")";
    }

    // Red background page.
    for (int x = translationDelta, y = size.height - translationDelta - 1; x < size.width; x++, y--) {
        int index = y * size.height + x;
        EXPECT_EQ(ToolsNix::RGBAPixel::red(), sample[index]) << "Error when checking for pixel (" << x << ", " << y << ")";
    }
}
예제 #3
0
void Controller::ComputeSteerableViewMap()
{
#if 0  //soc
	if ((!_Canvas) || (!_ViewMap))
		return;

	// Build 4 nodes containing the edges in the 4 directions
	NodeGroup *ng[Canvas::NB_STEERABLE_VIEWMAP];
	unsigned i;
	real c = 32.0f/255.0f; // see SteerableViewMap::readSteerableViewMapPixel() for information about this 32.
	for (i = 0; i < Canvas::NB_STEERABLE_VIEWMAP; ++i) {
		ng[i] = new NodeGroup;
	}
	NodeShape *completeNS = new NodeShape;
	completeNS->material().setDiffuse(c,c,c,1);
	ng[Canvas::NB_STEERABLE_VIEWMAP-1]->AddChild(completeNS);
	SteerableViewMap * svm = _Canvas->getSteerableViewMap();
	svm->Reset();

	ViewMap::fedges_container& fedges = _ViewMap->FEdges();
	LineRep * fRep;
	NodeShape *ns;
	for (ViewMap::fedges_container::iterator f = fedges.begin(), fend = fedges.end();
	     f != fend;
	     ++f)
	{
		if ((*f)->viewedge()->qi() != 0)
			continue;
		fRep = new LineRep((*f)->vertexA()->point2d(), (*f)->vertexB()->point2d());
		completeNS->AddRep(fRep); // add to the complete map anyway
		double *oweights = svm->AddFEdge(*f);
		for (i = 0; i < (Canvas::NB_STEERABLE_VIEWMAP - 1); ++i) {
			ns = new NodeShape;
			double wc = oweights[i]*c;
			if (oweights[i] == 0)
				continue;
			ns->material().setDiffuse(wc, wc, wc, 1);
			ns->AddRep(fRep);
			ng[i]->AddChild(ns);
		}
	}

	GrayImage *img[Canvas::NB_STEERABLE_VIEWMAP];
	//#ifdef WIN32
	QGLBasicWidget offscreenBuffer(_pView, "SteerableViewMap", _pView->width(), _pView->height());
	QPixmap pm;
	QImage qimg;
	for (i = 0; i < Canvas::NB_STEERABLE_VIEWMAP; ++i) {
		offscreenBuffer.AddNode(ng[i]);
#if 0
		img[i] = new GrayImage(_pView->width(), _pView->height());
		offscreenBuffer.readPixels(0,0,_pView->width(), _pView->height(), img[i]->getArray());
#endif
		pm = offscreenBuffer.renderPixmap(_pView->width(), _pView->height());

		if (pm.isNull()) {
			if (G.debug & G_DEBUG_FREESTYLE) {
				cout << "BuildViewMap Warning: couldn't render the steerable ViewMap" << endl;
			}
		}
		//pm.save(QString("steerable") + QString::number(i) + QString(".bmp"), "BMP");
		// FIXME!! Lost of time !
		qimg = pm.toImage();
		// FIXME !! again!
		img[i] = new GrayImage(_pView->width(), _pView->height());
		for (unsigned int y = 0; y < img[i]->height(); ++y) {
			for (unsigned int x = 0; x < img[i]->width(); ++x) {
				//img[i]->setPixel(x, y, (float)qGray(qimg.pixel(x, y)) / 255.0f);
				img[i]->setPixel(x, y, (float)qGray(qimg.pixel(x, y)));
				//float c = qGray(qimg.pixel(x, y));
				//img[i]->setPixel(x, y, qGray(qimg.pixel(x, y)));
			}
		}
		offscreenBuffer.DetachNode(ng[i]);
		ng[i]->destroy();
		delete ng[i];
		// check
#if 0
		qimg = QImage(_pView->width(), _pView->height(), 32);
		for (unsigned int y = 0; y < img[i]->height(); ++y) {
			for (unsigned int x = 0; x < img[i]->width(); ++x) {
				float v = img[i]->pixel(x, y);
				qimg.setPixel(x, y, qRgb(v, v, v));
			}
		}
		qimg.save(QString("newsteerable") + QString::number(i) + QString(".bmp"), "BMP");
#endif
	}


	svm->buildImagesPyramids(img, false, 0, 1.0f);
#endif
}
예제 #4
0
TEST(WebKitNix, SuspendResumeAPI)
{
    // This test uses a page that changes its title - showing current time.
    // As the suspend method is called the page's changes are paused. The
    // animation continues as we call the resume method. During this process
    // there are checkpoints to ensure that changes are pausing/resuming.

    const WKSize size = WKSizeMake(150, 100);
    ToolsNix::GLOffscreenBuffer offscreenBuffer(size.width, size.height);
    ASSERT_TRUE(offscreenBuffer.makeCurrent());

    WKRetainPtr<WKContextRef> context = adoptWK(WKContextCreate());
    WKRetainPtr<WKViewRef> view(AdoptWK, WKViewCreate(context.get(), 0));

    Util::ForceRepaintClient forceRepaintClient(view.get());
    forceRepaintClient.setClearColor(0, 0, 1, 1);

    WKViewInitialize(view.get());
    WKViewSetSize(view.get(), size);

    glViewport(0, 0, size.width, size.height);
    forceRepaintClient.clear();

    Util::PageLoader loader(view.get());
    loader.waitForLoadURLAndRepaint("../nix/SuspendResume");

    size_t bufferSize = WKStringGetMaximumUTF8CStringSize(WKPageCopyTitle(WKViewGetPage(view.get())));
    char firstSampleBeforeSuspend[bufferSize];
    char secondSampleBeforeSuspend[bufferSize];
    char firstSampleAfterSuspend[bufferSize];
    char secondSampleAfterSuspend[bufferSize];
    char firstSampleAfterResume[bufferSize];

    WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), firstSampleBeforeSuspend, bufferSize);

    // After collecting the first sample a repaint is needed to get viewport updated accordingly.
    // This proccess is repeated for each collected sample.
    Util::sleep(0.1);
    loader.forceRepaint();
    WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), secondSampleBeforeSuspend, bufferSize);
    // The timer is ticking - two different samples.
    EXPECT_STRNE(firstSampleBeforeSuspend, secondSampleBeforeSuspend);

    // Force an update before suspending otherwise we can get same sample value after suspending
    // and the test becomes flacky.
    Util::sleep(0.1);
    loader.forceRepaint();
    WKViewSuspendActiveDOMObjectsAndAnimations(view.get());
    Util::sleep(0.1);
    loader.forceRepaint();
    WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), firstSampleAfterSuspend, bufferSize);
    // The timer is paused - still two different samples.
    EXPECT_STRNE(secondSampleBeforeSuspend, firstSampleAfterSuspend);

    Util::sleep(0.1);
    loader.forceRepaint();
    WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), secondSampleAfterSuspend, bufferSize);
    // The timer is paused - two samples collected while paused so they are equal.
    EXPECT_STREQ(firstSampleAfterSuspend, secondSampleAfterSuspend);

    WKViewResumeActiveDOMObjectsAndAnimations(view.get());
    Util::sleep(0.1);
    loader.forceRepaint();
    WKStringGetUTF8CString(WKPageCopyTitle(WKViewGetPage(view.get())), firstSampleAfterResume, bufferSize);
    // The timer is ticking again - two different samples.
    EXPECT_STRNE(secondSampleAfterSuspend, firstSampleAfterResume);
}