[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    extragear/multimedia/kmplayer
From:       Koos Vriezen <koos.vriezen () gmail ! com>
Date:       2012-01-21 17:13:13
Message-ID: 20120121171313.E7194AC892 () svn ! kde ! org
[Download RAW message or body]

SVN commit 1275102 by vriezen:

Support SMIL fit inherence of regions

Group the paint visitor context members to clean up the code a bit

 M  +13 -6     src/kmplayer_smil.cpp  
 M  +1 -0      src/kmplayer_smil.h  
 M  +30 -17    src/viewarea.cpp  
 A             tests/fit.smil  


--- trunk/extragear/multimedia/kmplayer/src/kmplayer_smil.cpp #1275101:1275102
@@ -229,7 +229,7 @@
     else if (!strcmp (cval, "slice"))
         fit = fit_slice;
     else
-        fit = fit_hidden;
+        fit = fit_default;
     return fit;
 }
 
@@ -1878,10 +1878,13 @@
 void SMIL::RegionBase::parseParam (const TrieString & name, const QString & val) {
     bool need_repaint = false;
     if (name == Ids::attr_fit) {
-        fit = parseFit (val.toAscii ().constData ());
+        Fit ft = parseFit (val.toAscii ().constData ());
+        if (ft != fit) {
+            fit = ft;
         if (region_surface)
             region_surface->scroll = fit_scroll == fit;
         need_repaint = true;
+        }
     } else if (parseBackgroundParam (background_color, name, val) ||
             parseMediaOpacityParam (media_opacity, name, val)) {
     } else if (name == "z-index") {
@@ -3338,6 +3341,8 @@
         }
     } else if (para == Ids::attr_fit) {
         fit = parseFit (val.toAscii ().constData ());
+        if (fit != effective_fit)
+            message (MsgSurfaceBoundsUpdate);
     } else if (para == Ids::attr_type) {
         mimetype = val;
     } else if (para == "panZoom") {
@@ -3379,6 +3384,7 @@
 KDE_NO_EXPORT void SMIL::MediaType::init () {
     if (Runtime::TimingsInitialized > runtime->timingstate) {
         fit = fit_default;
+        effective_fit = fit_default;
         background_color.init ();
         media_opacity.init ();
         transition.init ();
@@ -3528,9 +3534,10 @@
         SRect rr = rb->region_surface->bounds;
         Single x, y, w = size.width, h = size.height;
         sizes.calcSizes (this, &rb->sizes, rr.width(), rr.height(), x, y, w, h);
-        Fit ft = fit_default == fit ? rb->fit : fit;
+        if (fit_default != fit)
+            effective_fit = fit;
         ImageMedia *im;
-        switch (ft) {
+        switch (effective_fit) {
             case fit_scroll:
             case fit_default:
             case fit_hidden:
@@ -3540,14 +3547,14 @@
                          (im = static_cast <ImageMedia *>(media_info->media)) &&
                          !im->isEmpty () &&
                          im->cached_img->flags & ImageData::ImageScalable)))
-                    ft = fit_meet;
+                    effective_fit = fit_meet;
                 break;
             default:
                 break;
         }
 
         if (!size.isEmpty () && w > 0 && h > 0)
-            switch (ft) {
+            switch (effective_fit) {
                 case fit_meet: {
                     float iasp = 1.0 * size.width / size.height;
                     float rasp = 1.0 * w / h;
--- trunk/extragear/multimedia/kmplayer/src/kmplayer_smil.h #1275101:1275102
@@ -743,6 +743,7 @@
     CalculatedSizer sizes;
     CalculatedSizer *pan_zoom;
     Fit fit;
+    Fit effective_fit;
     SmilColorProperty background_color;
     MediaOpacity media_opacity;
     unsigned int bitrate;
--- trunk/extragear/multimedia/kmplayer/src/viewarea.cpp #1275101:1275102
@@ -175,16 +175,28 @@
             1.0 * (((c)) & 0xff) / 255,       \
             1.0 * (((c) >> 24) & 0xff) / 255)
 
-class KMPLAYER_NO_EXPORT CairoPaintVisitor : public Visitor {
+struct KMPLAYER_NO_EXPORT PaintContext
+{
+    PaintContext (const Matrix& m, const IRect& c)
+        : matrix (m)
+        , clip (c)
+        , fit (fit_default)
+        , bg_repeat (SMIL::RegionBase::BgRepeat)
+        , bg_image (NULL)
+    {}
+    Matrix matrix;
     IRect clip;
+    Fit fit;
+    SMIL::RegionBase::BackgroundRepeat bg_repeat;
+    ImageData *bg_image;
+};
+
+class KMPLAYER_NO_EXPORT CairoPaintVisitor : public Visitor, public PaintContext {
     cairo_surface_t * cairo_surface;
-    Matrix matrix;
     // stack vars need for transitions
     TransitionModule *cur_transition;
     cairo_pattern_t * cur_pat;
     cairo_matrix_t cur_mat;
-    SMIL::RegionBase::BackgroundRepeat bg_repeat;
-    ImageData *bg_image;
     float opacity;
     bool toplevel;
 
@@ -220,10 +232,8 @@
 KDE_NO_CDTOR_EXPORT
 CairoPaintVisitor::CairoPaintVisitor (cairo_surface_t * cs, Matrix m,
         const IRect & rect, QColor c, bool top)
- : clip (rect), cairo_surface (cs),
-   matrix (m),
-   bg_repeat (SMIL::RegionBase::BgRepeat), bg_image (NULL),
-   toplevel (top) {
+ : PaintContext (m, rect), cairo_surface (cs), toplevel (top)
+{
     cr = cairo_create (cs);
     if (toplevel) {
         cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
@@ -304,12 +314,10 @@
         IRect scr = matrix.toScreen (rect);
         if (clip.intersect (scr).isEmpty ())
             return;
-        Matrix m = matrix;
+        PaintContext ctx_save = *(PaintContext *) this;
         matrix = Matrix (rect.x(), rect.y(), s->xscale, s->yscale);
-        matrix.transform (m);
-        IRect clip_save = clip;
+        matrix.transform (ctx_save.matrix);
         clip = clip.intersect (scr);
-        SMIL::RegionBase::BackgroundRepeat bg_repeat_save = bg_repeat;
         if (SMIL::RegionBase::BgInherit != reg->bg_repeat)
             bg_repeat = reg->bg_repeat;
         cairo_save (cr);
@@ -318,11 +326,13 @@
         if (!s->virtual_size.isEmpty ())
             matrix.translate (-s->x_scroll, -s->y_scroll);
 
+        if (fit_default != reg->fit)
+            fit = reg->fit;
+
         ImageMedia *im = reg->media_info
             ? (ImageMedia *) reg->media_info->media
             : NULL;
 
-        ImageData *bg_save = bg_image;
         ImageData *bg_img = im && !im->isEmpty() ? im->cached_img.ptr () : NULL;
         if (reg->background_image == "inherit")
             bg_img = bg_image;
@@ -466,10 +476,7 @@
             }
         }
         cairo_restore (cr);
-        bg_image = bg_save;
-        matrix = m;
-        bg_repeat = bg_repeat_save;
-        clip = clip_save;
+        *(PaintContext *) this = ctx_save;
         s->dirty = false;
     }
 }
@@ -661,6 +668,12 @@
     }
     if (!ref->media_info)
         return;
+    if (fit_default != fit
+            && fit_default == ref->fit
+            && fit != ref->effective_fit) {
+        ref->effective_fit = fit;
+        s->resize (ref->calculateBounds(), false);
+    }
     if (ref->media_info->media &&
             ref->media_info->media->type () == MediaManager::Image) {
         if (!s)
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic