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