src/openvg/qpaintengine_vg.cpp
changeset 25 e24348a560a6
parent 23 89e065397ea6
child 30 5dc02b23752f
equal deleted inserted replaced
23:89e065397ea6 25:e24348a560a6
   118 };
   118 };
   119 
   119 
   120 class QVGPaintEnginePrivate : public QPaintEngineExPrivate
   120 class QVGPaintEnginePrivate : public QPaintEngineExPrivate
   121 {
   121 {
   122 public:
   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     QVGPaintEnginePrivate();
   152     QVGPaintEnginePrivate();
   124     ~QVGPaintEnginePrivate();
   153     ~QVGPaintEnginePrivate();
   125 
   154 
   126     void init();
   155     void init();
   127     void initObjects();
   156     void initObjects();
   215 #if !defined(QVG_NO_DRAW_GLYPHS)
   244 #if !defined(QVG_NO_DRAW_GLYPHS)
   216     QVGFontCache fontCache;
   245     QVGFontCache fontCache;
   217     QVGFontEngineCleaner *fontEngineCleaner;
   246     QVGFontEngineCleaner *fontEngineCleaner;
   218 #endif
   247 #endif
   219 
   248 
       
   249     bool hasAdvancedBlending;
       
   250 
   220     QScopedPointer<QPixmapFilter> convolutionFilter;
   251     QScopedPointer<QPixmapFilter> convolutionFilter;
   221     QScopedPointer<QPixmapFilter> colorizeFilter;
   252     QScopedPointer<QPixmapFilter> colorizeFilter;
   222     QScopedPointer<QPixmapFilter> dropShadowFilter;
   253     QScopedPointer<QPixmapFilter> dropShadowFilter;
   223     QScopedPointer<QPixmapFilter> blurFilter;
   254     QScopedPointer<QPixmapFilter> blurFilter;
   224 
   255 
   367     clearOpacity = 1.0f;
   398     clearOpacity = 1.0f;
   368 
   399 
   369 #if !defined(QVG_NO_DRAW_GLYPHS)
   400 #if !defined(QVG_NO_DRAW_GLYPHS)
   370     fontEngineCleaner = 0;
   401     fontEngineCleaner = 0;
   371 #endif
   402 #endif
       
   403 
       
   404     hasAdvancedBlending = false;
   372 
   405 
   373     clearModes();
   406     clearModes();
   374 }
   407 }
   375 
   408 
   376 QVGPaintEnginePrivate::~QVGPaintEnginePrivate()
   409 QVGPaintEnginePrivate::~QVGPaintEnginePrivate()
   444                             2,    // segmentCapacityHint
   477                             2,    // segmentCapacityHint
   445                             4,    // coordCapacityHint
   478                             4,    // coordCapacityHint
   446                             VG_PATH_CAPABILITY_ALL);
   479                             VG_PATH_CAPABILITY_ALL);
   447     vgAppendPathData(linePath, 2, segments, coords);
   480     vgAppendPathData(linePath, 2, segments, coords);
   448 #endif
   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 
   451 void QVGPaintEnginePrivate::destroy()
   488 void QVGPaintEnginePrivate::destroy()
   452 {
   489 {
   453     if (penPaint)
   490     if (penPaint)
  2290 void QVGPaintEngine::compositionModeChanged()
  2327 void QVGPaintEngine::compositionModeChanged()
  2291 {
  2328 {
  2292     Q_D(QVGPaintEngine);
  2329     Q_D(QVGPaintEngine);
  2293     d->dirty |= QPaintEngine::DirtyCompositionMode;
  2330     d->dirty |= QPaintEngine::DirtyCompositionMode;
  2294 
  2331 
  2295     VGBlendMode vgMode = VG_BLEND_SRC_OVER;
  2332     VGint vgMode = VG_BLEND_SRC_OVER;
  2296 
  2333 
  2297     switch (state()->composition_mode) {
  2334     switch (state()->composition_mode) {
  2298     case QPainter::CompositionMode_SourceOver:
  2335     case QPainter::CompositionMode_SourceOver:
  2299         vgMode = VG_BLEND_SRC_OVER;
  2336         vgMode = VG_BLEND_SRC_OVER;
  2300         break;
  2337         break;
  2324         break;
  2361         break;
  2325     case QPainter::CompositionMode_Lighten:
  2362     case QPainter::CompositionMode_Lighten:
  2326         vgMode = VG_BLEND_LIGHTEN;
  2363         vgMode = VG_BLEND_LIGHTEN;
  2327         break;
  2364         break;
  2328     default:
  2365     default:
  2329         qWarning() << "QVGPaintEngine::compositionModeChanged unsupported mode" << state()->composition_mode;
  2366         if (d->hasAdvancedBlending) {
  2330         break;  // Fall back to VG_BLEND_SRC_OVER.
  2367             switch (state()->composition_mode) {
  2331     }
  2368             case QPainter::CompositionMode_Overlay:
  2332 
  2369                 vgMode = QVGPaintEnginePrivate::QT_VG_BLEND_OVERLAY_KHR;
  2333     d->setBlendMode(vgMode);
  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));
  2334 }
  2413 }
  2335 
  2414 
  2336 void QVGPaintEngine::renderHintsChanged()
  2415 void QVGPaintEngine::renderHintsChanged()
  2337 {
  2416 {
  2338     Q_D(QVGPaintEngine);
  2417     Q_D(QVGPaintEngine);