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); } }
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 << ")"; } }
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 }
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); }