Changeset 769 for trunk/src/openvg
- Timestamp:
- Aug 2, 2010, 9:27:30 PM (15 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
- Property svn:mergeinfo changed
/branches/vendor/nokia/qt/4.6.3 (added) merged: 768 /branches/vendor/nokia/qt/current merged: 767 /branches/vendor/nokia/qt/4.6.2 removed
- Property svn:mergeinfo changed
-
trunk/src/openvg/openvg.pro
r561 r769 34 34 } 35 35 36 symbian: DEFINES += QVG_RECREATE_ON_SIZE_CHANGE QVG_BUFFER_SCROLLING 37 36 38 include(../qbase.pri) 37 39 -
trunk/src/openvg/qpaintengine_vg.cpp
r651 r769 76 76 #if !defined(QVG_NO_DRAW_GLYPHS) 77 77 78 extern int qt_defaultDpiX();79 extern int qt_defaultDpiY();78 Q_DECL_IMPORT extern int qt_defaultDpiX(); 79 Q_DECL_IMPORT extern int qt_defaultDpiY(); 80 80 81 81 class QVGPaintEnginePrivate; … … 121 121 { 122 122 public: 123 // Extra blending modes from VG_KHR_advanced_blending extension. 124 // Use the QT_VG prefix to avoid conflicts with any definitions 125 // that may come in via <VG/vgext.h>. 126 enum AdvancedBlending { 127 QT_VG_BLEND_OVERLAY_KHR = 0x2010, 128 QT_VG_BLEND_HARDLIGHT_KHR = 0x2011, 129 QT_VG_BLEND_SOFTLIGHT_SVG_KHR = 0x2012, 130 QT_VG_BLEND_SOFTLIGHT_KHR = 0x2013, 131 QT_VG_BLEND_COLORDODGE_KHR = 0x2014, 132 QT_VG_BLEND_COLORBURN_KHR = 0x2015, 133 QT_VG_BLEND_DIFFERENCE_KHR = 0x2016, 134 QT_VG_BLEND_SUBTRACT_KHR = 0x2017, 135 QT_VG_BLEND_INVERT_KHR = 0x2018, 136 QT_VG_BLEND_EXCLUSION_KHR = 0x2019, 137 QT_VG_BLEND_LINEARDODGE_KHR = 0x201a, 138 QT_VG_BLEND_LINEARBURN_KHR = 0x201b, 139 QT_VG_BLEND_VIVIDLIGHT_KHR = 0x201c, 140 QT_VG_BLEND_LINEARLIGHT_KHR = 0x201d, 141 QT_VG_BLEND_PINLIGHT_KHR = 0x201e, 142 QT_VG_BLEND_HARDMIX_KHR = 0x201f, 143 QT_VG_BLEND_CLEAR_KHR = 0x2020, 144 QT_VG_BLEND_DST_KHR = 0x2021, 145 QT_VG_BLEND_SRC_OUT_KHR = 0x2022, 146 QT_VG_BLEND_DST_OUT_KHR = 0x2023, 147 QT_VG_BLEND_SRC_ATOP_KHR = 0x2024, 148 QT_VG_BLEND_DST_ATOP_KHR = 0x2025, 149 QT_VG_BLEND_XOR_KHR = 0x2026 150 }; 151 123 152 QVGPaintEnginePrivate(); 124 153 ~QVGPaintEnginePrivate(); … … 218 247 #endif 219 248 249 bool hasAdvancedBlending; 250 220 251 QScopedPointer<QPixmapFilter> convolutionFilter; 221 252 QScopedPointer<QPixmapFilter> colorizeFilter; … … 370 401 fontEngineCleaner = 0; 371 402 #endif 403 404 hasAdvancedBlending = false; 372 405 373 406 clearModes(); … … 447 480 vgAppendPathData(linePath, 2, segments, coords); 448 481 #endif 482 483 const char *extensions = reinterpret_cast<const char *>(vgGetString(VG_EXTENSIONS)); 484 if (extensions) 485 hasAdvancedBlending = strstr(extensions, "VG_KHR_advanced_blending") != 0; 449 486 } 450 487 … … 497 534 } 498 535 499 extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale);536 Q_DECL_IMPORT extern bool qt_scaleForTransform(const QTransform &transform, qreal *scale); 500 537 501 538 void QVGPaintEnginePrivate::updateTransform(QPaintDevice *pdev) 502 539 { 503 VGfloat devh = pdev->height() - 1;540 VGfloat devh = pdev->height(); 504 541 505 542 // Construct the VG transform by combining the Qt transform with 506 543 // the following viewport transformation: 507 // | 1 0 0 | | 1 0 0.5 | | 1 0 0.5 |508 // | 0 -1 devh | * | 0 1 -0.5 | = | 0 -1 (0.5 + devh) |509 // | 0 0 1 | | 0 0 1 | | 0 0 1 |544 // | 1 0 0 | 545 // | 0 -1 devh | 546 // | 0 0 1 | 510 547 // The full VG transform is effectively: 511 548 // 1. Apply the user's transformation matrix. 512 // 2. Translate by (0.5, -0.5) to correct for Qt and VG putting 513 // the centre of the pixel at different positions. 514 // 3. Flip the co-ordinate system upside down. 549 // 2. Flip the co-ordinate system upside down. 515 550 QTransform viewport(1.0f, 0.0f, 0.0f, 516 551 0.0f, -1.0f, 0.0f, 517 0.5f, devh + 0.5f, 1.0f); 518 519 // The image transform is always the full transformation, 520 // because it can be projective. 521 imageTransform = transform * viewport; 522 523 // Determine if the transformation is projective. 524 bool projective = (imageTransform.m13() != 0.0f || 525 imageTransform.m23() != 0.0f || 526 imageTransform.m33() != 1.0f); 552 0.0f, devh, 1.0f); 553 554 // Compute the path transform and determine if it is projective. 555 pathTransform = transform * viewport; 556 bool projective = (pathTransform.m13() != 0.0f || 557 pathTransform.m23() != 0.0f || 558 pathTransform.m33() != 1.0f); 527 559 if (projective) { 528 560 // The engine cannot do projective path transforms for us, … … 532 564 simpleTransform = false; 533 565 } else { 534 pathTransform = imageTransform;535 566 simpleTransform = true; 536 567 } 537 568 pathTransformSet = false; 569 570 // The image transform is always the full transformation, 571 imageTransform = transform * viewport; 538 572 539 573 // Calculate the scaling factor to use for turning cosmetic pens … … 968 1002 } 969 1003 970 extern QImage qt_imageForBrush(int style, bool invert);1004 Q_DECL_IMPORT extern QImage qt_imageForBrush(int style, bool invert); 971 1005 972 1006 static QImage colorizeBitmap(const QImage &image, const QColor &color) … … 2063 2097 (QVGPaintEngine *engine, int width, int height) 2064 2098 { 2099 scissorMask = false; 2065 2100 if (maskIsSet) { 2066 2101 vgMask(VG_INVALID_HANDLE, VG_FILL_MASK, 0, 0, width, height); … … 2295 2330 d->dirty |= QPaintEngine::DirtyCompositionMode; 2296 2331 2297 VG BlendModevgMode = VG_BLEND_SRC_OVER;2332 VGint vgMode = VG_BLEND_SRC_OVER; 2298 2333 2299 2334 switch (state()->composition_mode) { … … 2329 2364 break; 2330 2365 default: 2331 qWarning() << "QVGPaintEngine::compositionModeChanged unsupported mode" << state()->composition_mode; 2332 break; // Fall back to VG_BLEND_SRC_OVER. 2333 } 2334 2335 d->setBlendMode(vgMode); 2366 if (d->hasAdvancedBlending) { 2367 switch (state()->composition_mode) { 2368 case QPainter::CompositionMode_Overlay: 2369 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_OVERLAY_KHR; 2370 break; 2371 case QPainter::CompositionMode_ColorDodge: 2372 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_COLORDODGE_KHR; 2373 break; 2374 case QPainter::CompositionMode_ColorBurn: 2375 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_COLORBURN_KHR; 2376 break; 2377 case QPainter::CompositionMode_HardLight: 2378 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_HARDLIGHT_KHR; 2379 break; 2380 case QPainter::CompositionMode_SoftLight: 2381 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_SOFTLIGHT_KHR; 2382 break; 2383 case QPainter::CompositionMode_Difference: 2384 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_DIFFERENCE_KHR; 2385 break; 2386 case QPainter::CompositionMode_Exclusion: 2387 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_EXCLUSION_KHR; 2388 break; 2389 case QPainter::CompositionMode_SourceOut: 2390 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_SRC_OUT_KHR; 2391 break; 2392 case QPainter::CompositionMode_DestinationOut: 2393 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_DST_OUT_KHR; 2394 break; 2395 case QPainter::CompositionMode_SourceAtop: 2396 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_SRC_ATOP_KHR; 2397 break; 2398 case QPainter::CompositionMode_DestinationAtop: 2399 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_DST_ATOP_KHR; 2400 break; 2401 case QPainter::CompositionMode_Xor: 2402 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_XOR_KHR; 2403 break; 2404 default: break; // Fall back to VG_BLEND_SRC_OVER. 2405 } 2406 } 2407 if (vgMode == VG_BLEND_SRC_OVER) 2408 qWarning() << "QVGPaintEngine::compositionModeChanged unsupported mode" << state()->composition_mode; 2409 break; 2410 } 2411 2412 d->setBlendMode(VGBlendMode(vgMode)); 2336 2413 } 2337 2414 … … 2400 2477 2401 2478 // Check to see if we can use vgClear() for faster filling. 2402 if (brush.style() == Qt::SolidPattern && 2479 if (brush.style() == Qt::SolidPattern && brush.isOpaque() && 2403 2480 clipTransformIsSimple(d->transform) && d->opacity == 1.0f && 2404 2481 clearRect(rect, brush.color())) { … … 2443 2520 2444 2521 // Check to see if we can use vgClear() for faster filling. 2445 if (clipTransformIsSimple(d->transform) && d->opacity == 1.0f && 2522 if (clipTransformIsSimple(d->transform) && d->opacity == 1.0f && color.alpha() == 255 && 2446 2523 clearRect(rect, color)) { 2447 2524 return; … … 3240 3317 } 3241 3318 } 3242 origin[0] = -metrics.x.toReal() + 0.5f;3243 origin[1] = -metrics.y.toReal() + 0.5f;3244 escapement[0] = metrics.xoff.toReal();3245 escapement[1] = metrics.yoff.toReal();3319 origin[0] = -metrics.x.toReal(); 3320 origin[1] = -metrics.y.toReal(); 3321 escapement[0] = 0; 3322 escapement[1] = 0; 3246 3323 vgSetGlyphToImage(font, glyph, vgImage, origin, escapement); 3247 3324 vgDestroyImage(vgImage); // Reduce reference count. … … 3259 3336 origin[0] = 0; 3260 3337 origin[1] = 0; 3261 escapement[0] = metrics.xoff.toReal();3262 escapement[1] = metrics.yoff.toReal();3338 escapement[0] = 0; 3339 escapement[1] = 0; 3263 3340 vgSetGlyphToPath(font, glyph, vgPath, VG_FALSE, origin, escapement); 3264 3341 vgDestroyPath(vgPath); // Reduce reference count. … … 3285 3362 QVarLengthArray<QFixedPoint> positions; 3286 3363 QVarLengthArray<glyph_t> glyphs; 3287 QTransform matrix = d->transform; 3288 matrix.translate(p.x(), p.y()); 3289 ti.fontEngine->getGlyphPositions 3290 (ti.glyphs, matrix, ti.flags, glyphs, positions); 3364 QTransform matrix; 3365 ti.fontEngine->getGlyphPositions(ti.glyphs, matrix, ti.flags, glyphs, positions); 3291 3366 3292 3367 // Find the glyph cache for this font. … … 3322 3397 glyphCache->cacheGlyphs(d, ti, glyphs); 3323 3398 3399 // Create the array of adjustments between glyphs 3400 QVarLengthArray<VGfloat> adjustments_x(glyphs.size()); 3401 QVarLengthArray<VGfloat> adjustments_y(glyphs.size()); 3402 for (int i = 1; i < glyphs.size(); ++i) { 3403 adjustments_x[i-1] = (positions[i].x - positions[i-1].x).toReal(); 3404 adjustments_y[i-1] = (positions[i].y - positions[i-1].y).toReal(); 3405 } 3406 3324 3407 // Set the glyph drawing origin. 3325 3408 VGfloat origin[2]; 3326 origin[0] = 0;3327 origin[1] = 0;3409 origin[0] = positions[0].x.toReal(); 3410 origin[1] = positions[0].y.toReal(); 3328 3411 vgSetfv(VG_GLYPH_ORIGIN, 2, origin); 3329 3412 … … 3340 3423 d->ensureBrush(state()->pen.brush()); 3341 3424 vgDrawGlyphs(glyphCache->font, glyphs.size(), (VGuint*)glyphs.data(), 3342 NULL, NULL, VG_FILL_PATH, VG_TRUE);3425 adjustments_x.data(), adjustments_y.data(), VG_FILL_PATH, VG_TRUE); 3343 3426 #else 3344 3427 // OpenGL 1.0 does not have support for VGFont and glyphs, … … 3645 3728 } else { 3646 3729 // Set the path transform to the default viewport transformation. 3647 VGfloat devh = screenSize.height() - 1;3730 VGfloat devh = screenSize.height(); 3648 3731 QTransform viewport(1.0f, 0.0f, 0.0f, 3649 3732 0.0f, -1.0f, 0.0f, 3650 -0.5f, devh + 0.5f, 1.0f);3733 0.0f, devh, 1.0f); 3651 3734 d->setTransform(VG_MATRIX_PATH_USER_TO_SURFACE, viewport); 3652 3735 … … 3684 3767 3685 3768 // Set the image transformation and modes. 3686 VGfloat devh = screenSize.height() - 1;3769 VGfloat devh = screenSize.height(); 3687 3770 QTransform transform(1.0f, 0.0f, 0.0f, 3688 3771 0.0f, -1.0f, 0.0f, 3689 -0.5f, devh + 0.5f, 1.0f);3772 0.0f, devh, 1.0f); 3690 3773 transform.translate(offset.x(), offset.y()); 3691 3774 d->setTransform(VG_MATRIX_IMAGE_USER_TO_SURFACE, transform); -
trunk/src/openvg/qpixmapdata_vg.cpp
r651 r769 46 46 #include "qvgimagepool_p.h" 47 47 48 #if def QT_SYMBIAN_SUPPORTS_SGIMAGE48 #if defined(Q_OS_SYMBIAN) 49 49 #include <private/qt_s60_p.h> 50 50 #include <fbs.h> 51 #include <graphics/sgimage.h> 51 #endif 52 #ifdef QT_SYMBIAN_SUPPORTS_SGIMAGE 53 #include <sgresource/sgimage.h> 52 54 typedef EGLImageKHR (*pfnEglCreateImageKHR)(EGLDisplay, EGLContext, EGLenum, EGLClientBuffer, EGLint*); 53 55 typedef EGLBoolean (*pfnEglDestroyImageKHR)(EGLDisplay, EGLImageKHR); … … 353 355 } 354 356 355 extern int qt_defaultDpiX();356 extern int qt_defaultDpiY();357 Q_DECL_IMPORT extern int qt_defaultDpiX(); 358 Q_DECL_IMPORT extern int qt_defaultDpiY(); 357 359 358 360 int QVGPixmapData::metric(QPaintDevice::PaintDeviceMetric metric) const … … 465 467 void QVGPixmapData::fromNativeType(void* pixmap, NativeType type) 466 468 { 469 if (type == QPixmapData::SgImage && pixmap) { 467 470 #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL) 468 if (type == QPixmapData::SgImage && pixmap) {469 471 RSgImage *sgImage = reinterpret_cast<RSgImage*>(pixmap); 470 // when "0" used as argument then471 // default display, context are used472 if (!context)473 context = qt_vg_create_context(0, QInternal::Pixmap);474 472 475 473 destroyImages(); … … 478 476 TInt err = 0; 479 477 480 err = SgDriver::Open(); 481 if(err != KErrNone) { 478 RSgDriver driver; 479 err = driver.Open(); 480 if (err != KErrNone) { 482 481 cleanup(); 483 482 return; 484 483 } 485 484 486 if (sgImage->IsNull()) {485 if (sgImage->IsNull()) { 487 486 cleanup(); 488 SgDriver::Close();487 driver.Close(); 489 488 return; 490 489 } … … 492 491 TSgImageInfo sgImageInfo; 493 492 err = sgImage->GetInfo(sgImageInfo); 494 if (err != KErrNone) {493 if (err != KErrNone) { 495 494 cleanup(); 496 SgDriver::Close();495 driver.Close(); 497 496 return; 498 497 } … … 502 501 pfnVgCreateEGLImageTargetKHR vgCreateEGLImageTargetKHR = (pfnVgCreateEGLImageTargetKHR) eglGetProcAddress("vgCreateEGLImageTargetKHR"); 503 502 504 if (eglGetError() != EGL_SUCCESS || !eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateEGLImageTargetKHR) {503 if (eglGetError() != EGL_SUCCESS || !eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateEGLImageTargetKHR) { 505 504 cleanup(); 506 SgDriver::Close();505 driver.Close(); 507 506 return; 508 507 } 509 508 510 509 const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE}; 511 EGLImageKHR eglImage = eglCreateImageKHR( context->display(),510 EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(), 512 511 EGL_NO_CONTEXT, 513 512 EGL_NATIVE_PIXMAP_KHR, … … 515 514 (EGLint*)KEglImageAttribs); 516 515 517 if (eglGetError() != EGL_SUCCESS) {516 if (eglGetError() != EGL_SUCCESS) { 518 517 cleanup(); 519 SgDriver::Close();518 driver.Close(); 520 519 return; 521 520 } 522 521 523 522 vgImage = vgCreateEGLImageTargetKHR(eglImage); 524 if (vgGetError() != VG_NO_ERROR) {523 if (vgGetError() != VG_NO_ERROR) { 525 524 cleanup(); 526 eglDestroyImageKHR( context->display(), eglImage);527 SgDriver::Close();525 eglDestroyImageKHR(QEglContext::display(), eglImage); 526 driver.Close(); 528 527 return; 529 528 } … … 538 537 setSerialNumber(++qt_vg_pixmap_serial); 539 538 // release stuff 540 eglDestroyImageKHR(context->display(), eglImage); 541 SgDriver::Close(); 539 eglDestroyImageKHR(QEglContext::display(), eglImage); 540 driver.Close(); 541 #endif 542 542 } else if (type == QPixmapData::FbsBitmap) { 543 543 CFbsBitmap *bitmap = reinterpret_cast<CFbsBitmap*>(pixmap); … … 585 585 delete bitmap; 586 586 } 587 #else588 Q_UNUSED(pixmap);589 Q_UNUSED(type);590 #endif591 587 } 592 588 593 589 void* QVGPixmapData::toNativeType(NativeType type) 594 590 { 591 if (type == QPixmapData::SgImage) { 595 592 #if defined(QT_SYMBIAN_SUPPORTS_SGIMAGE) && !defined(QT_NO_EGL) 596 if (type == QPixmapData::SgImage) {597 593 toVGImage(); 598 594 599 if (!isValid() || vgImage == VG_INVALID_HANDLE)595 if (!isValid() || vgImage == VG_INVALID_HANDLE) 600 596 return 0; 601 597 602 598 TInt err = 0; 603 599 604 err = SgDriver::Open(); 605 if(err != KErrNone) 600 RSgDriver driver; 601 err = driver.Open(); 602 if (err != KErrNone) 606 603 return 0; 607 604 … … 609 606 sgInfo.iPixelFormat = EUidPixelFormatARGB_8888_PRE; 610 607 sgInfo.iSizeInPixels.SetSize(w, h); 611 sgInfo.iUsage = ESgUsageOpenVgImage | ESgUsageOpenVgTarget; 612 sgInfo.iShareable = ETrue; 613 sgInfo.iCpuAccess = ESgCpuAccessNone; 614 sgInfo.iScreenId = KSgScreenIdMain; //KSgScreenIdAny; 615 sgInfo.iUserAttributes = NULL; 616 sgInfo.iUserAttributeCount = 0; 608 sgInfo.iUsage = ESgUsageBitOpenVgImage | ESgUsageBitOpenVgSurface; 617 609 618 610 RSgImage *sgImage = q_check_ptr(new RSgImage()); 619 611 err = sgImage->Create(sgInfo, NULL, NULL); 620 if (err != KErrNone) {621 SgDriver::Close();612 if (err != KErrNone) { 613 driver.Close(); 622 614 return 0; 623 615 } … … 627 619 pfnVgCreateEGLImageTargetKHR vgCreateEGLImageTargetKHR = (pfnVgCreateEGLImageTargetKHR) eglGetProcAddress("vgCreateEGLImageTargetKHR"); 628 620 629 if (eglGetError() != EGL_SUCCESS || !eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateEGLImageTargetKHR) {630 SgDriver::Close();621 if (eglGetError() != EGL_SUCCESS || !eglCreateImageKHR || !eglDestroyImageKHR || !vgCreateEGLImageTargetKHR) { 622 driver.Close(); 631 623 return 0; 632 624 } 633 625 634 626 const EGLint KEglImageAttribs[] = {EGL_IMAGE_PRESERVED_SYMBIAN, EGL_TRUE, EGL_NONE}; 635 EGLImageKHR eglImage = eglCreateImageKHR( context->display(),627 EGLImageKHR eglImage = eglCreateImageKHR(QEglContext::display(), 636 628 EGL_NO_CONTEXT, 637 629 EGL_NATIVE_PIXMAP_KHR, 638 630 (EGLClientBuffer)sgImage, 639 631 (EGLint*)KEglImageAttribs); 640 if (eglGetError() != EGL_SUCCESS) {632 if (eglGetError() != EGL_SUCCESS) { 641 633 sgImage->Close(); 642 SgDriver::Close();634 driver.Close(); 643 635 return 0; 644 636 } 645 637 646 638 VGImage dstVgImage = vgCreateEGLImageTargetKHR(eglImage); 647 if (vgGetError() != VG_NO_ERROR) {648 eglDestroyImageKHR( context->display(), eglImage);639 if (vgGetError() != VG_NO_ERROR) { 640 eglDestroyImageKHR(QEglContext::display(), eglImage); 649 641 sgImage->Close(); 650 SgDriver::Close();642 driver.Close(); 651 643 return 0; 652 644 } … … 656 648 w, h, VG_FALSE); 657 649 658 if (vgGetError() != VG_NO_ERROR) {650 if (vgGetError() != VG_NO_ERROR) { 659 651 sgImage->Close(); 660 652 sgImage = 0; … … 662 654 // release stuff 663 655 vgDestroyImage(dstVgImage); 664 eglDestroyImageKHR( context->display(), eglImage);665 SgDriver::Close();656 eglDestroyImageKHR(QEglContext::display(), eglImage); 657 driver.Close(); 666 658 return reinterpret_cast<void*>(sgImage); 659 #endif 667 660 } else if (type == QPixmapData::FbsBitmap) { 668 661 CFbsBitmap *bitmap = q_check_ptr(new CFbsBitmap); … … 686 679 return reinterpret_cast<void*>(bitmap); 687 680 } 688 #else689 Q_UNUSED(type);690 681 return 0; 691 #endif692 682 } 693 683 #endif //Q_OS_SYMBIAN -
trunk/src/openvg/qwindowsurface_vg.cpp
r651 r769 58 58 // Create the default type of EGL window surface for windows. 59 59 d_ptr = new QVGEGLWindowSurfaceDirect(this); 60 setStaticContentsSupport(d_ptr->supportsStaticContents()); 60 61 } 61 62 … … 90 91 bool QVGWindowSurface::scroll(const QRegion &area, int dx, int dy) 91 92 { 92 return QWindowSurface::scroll(area, dx, dy); 93 if (!d_ptr->scroll(window(), area, dx, dy)) 94 return QWindowSurface::scroll(area, dx, dy); 95 return true; 93 96 } 94 97 -
trunk/src/openvg/qwindowsurface_vgegl.cpp
r651 r769 178 178 } else { 179 179 QVGSharedContext *shared = sharedContext(); 180 shared->firstPixmap = pd->next; 180 if (shared) 181 shared->firstPixmap = pd->next; 181 182 } 182 183 } … … 226 227 context = new QEglContext(); 227 228 context->setApi(QEgl::OpenVG); 228 if (!context->openDisplay(device)) {229 delete context;230 return 0;231 }232 229 233 230 // Set the swap interval for the display. 234 231 QByteArray interval = qgetenv("QT_VG_SWAP_INTERVAL"); 235 232 if (!interval.isEmpty()) 236 eglSwapInterval( context->display(), interval.toInt());233 eglSwapInterval(QEglContext::display(), interval.toInt()); 237 234 else 238 eglSwapInterval( context->display(), 1);235 eglSwapInterval(QEglContext::display(), 1); 239 236 240 237 #ifdef EGL_RENDERABLE_TYPE … … 250 247 EGLConfig cfg; 251 248 if (eglChooseConfig 252 ( context->display(), properties, &cfg, 1, &matching) &&249 (QEglContext::display(), properties, &cfg, 1, &matching) && 253 250 matching > 0) { 254 251 // Check that the selected configuration actually supports OpenVG … … 257 254 EGLint type = 0; 258 255 eglGetConfigAttrib 259 ( context->display(), cfg, EGL_CONFIG_ID, &id);256 (QEglContext::display(), cfg, EGL_CONFIG_ID, &id); 260 257 eglGetConfigAttrib 261 ( context->display(), cfg, EGL_RENDERABLE_TYPE, &type);258 (QEglContext::display(), cfg, EGL_RENDERABLE_TYPE, &type); 262 259 if (cfgId == id && (type & EGL_OPENVG_BIT) != 0) { 263 260 context->setConfig(cfg); … … 338 335 shared->context->doneCurrent(); 339 336 if (shared->surface != EGL_NO_SURFACE) { 340 eglDestroySurface( shared->context->display(), shared->surface);337 eglDestroySurface(QEglContext::display(), shared->surface); 341 338 shared->surface = EGL_NO_SURFACE; 342 339 } … … 416 413 } 417 414 shared->surface = eglCreatePbufferSurface 418 ( shared->context->display(), shared->context->config(), attribs);415 (QEglContext::display(), shared->context->config(), attribs); 419 416 } 420 417 return shared->surface; … … 559 556 recreateBackBuffer = false; 560 557 if (backBufferSurface != EGL_NO_SURFACE) { 561 eglDestroySurface( context->display(), backBufferSurface);558 eglDestroySurface(QEglContext::display(), backBufferSurface); 562 559 backBufferSurface = EGL_NO_SURFACE; 563 560 } … … 572 569 // Create an EGL surface for rendering into the VGImage. 573 570 backBufferSurface = eglCreatePbufferFromClientBuffer 574 ( context->display(), EGL_OPENVG_IMAGE,571 (QEglContext::display(), EGL_OPENVG_IMAGE, 575 572 (EGLClientBuffer)(backBuffer), 576 573 context->config(), NULL); … … 663 660 windowSurface = context->createSurface(widget, &surfaceProps); 664 661 isPaintingActive = false; 662 needToSwap = true; 665 663 } 666 664 #else … … 708 706 // Did we get a direct to window rendering surface? 709 707 EGLint buffer = 0; 710 if (eglQueryContext( context->display(), context->context(),708 if (eglQueryContext(QEglContext::display(), context->context(), 711 709 EGL_RENDER_BUFFER, &buffer) && 712 710 buffer == EGL_SINGLE_BUFFER) { … … 714 712 } 715 713 #endif 716 #if !defined(QVG_NO_PRESERVED_SWAP)717 // Try to force the surface back buffer to preserve its contents.718 if (needToSwap) {719 eglGetError(); // Clear error state first.720 eglSurfaceAttrib(context->display(), surface,721 EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED);722 if (eglGetError() != EGL_SUCCESS) {723 qWarning("QVG: could not enable preserved swap");724 }725 }726 #endif727 714 windowSurface = surface; 728 715 isPaintingActive = false; 729 716 } 717 718 #if !defined(QVG_NO_PRESERVED_SWAP) 719 // Try to force the surface back buffer to preserve its contents. 720 if (needToSwap) { 721 eglGetError(); // Clear error state first. 722 eglSurfaceAttrib(QEglContext::display(), windowSurface, 723 EGL_SWAP_BEHAVIOR, EGL_BUFFER_PRESERVED); 724 if (eglGetError() != EGL_SUCCESS) { 725 qWarning("QVG: could not enable preserved swap"); 726 } 727 } 728 #endif 730 729 return context; 731 730 } … … 760 759 } 761 760 761 bool QVGEGLWindowSurfaceDirect::supportsStaticContents() const 762 { 763 #if defined(QVG_BUFFER_SCROLLING) && !defined(QVG_NO_PRESERVED_SWAP) 764 return true; 765 #else 766 return QVGEGLWindowSurfacePrivate::supportsStaticContents(); 767 #endif 768 } 769 770 bool QVGEGLWindowSurfaceDirect::scroll(QWidget *widget, const QRegion& area, int dx, int dy) 771 { 772 #ifdef QVG_BUFFER_SCROLLING 773 QEglContext *context = ensureContext(widget); 774 if (context) { 775 context->makeCurrent(windowSurface); 776 QRect scrollRect = area.boundingRect(); 777 int sx = scrollRect.x(); 778 int sy = size.height() - scrollRect.y() - scrollRect.height(); 779 vgSeti(VG_SCISSORING, VG_FALSE); 780 vgCopyPixels(sx + dx, sy - dy, sx, sy, scrollRect.width(), scrollRect.height()); 781 context->lazyDoneCurrent(); 782 return true; 783 } 784 #endif 785 return false; 786 } 787 762 788 QT_END_NAMESPACE 763 789 -
trunk/src/openvg/qwindowsurface_vgegl_p.h
r651 r769 78 78 virtual VGImage surfaceImage() const; 79 79 virtual QSize surfaceSize() const = 0; 80 virtual bool supportsStaticContents() const { return false; } 81 virtual bool scroll(QWidget *, const QRegion&, int, int) { return false; } 80 82 81 83 private: … … 129 131 void endPaint(QWidget *widget, const QRegion& region, QImage *image); 130 132 QSize surfaceSize() const { return size; } 133 bool supportsStaticContents() const; 134 bool scroll(QWidget *widget, const QRegion& area, int dx, int dy); 131 135 132 136 protected:
Note:
See TracChangeset
for help on using the changeset viewer.