[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:       2009-06-21 21:53:59
Message-ID: 1245621239.823770.25376.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 985032 by vriezen:

Implement region's backgroundRepeat, make text bg color default transparent

Not sure about the latter, but w3c 2.1 test suite for backgroundRepeat
suggested it in case of norepeat/repeatX, as else the effect isn't visible

 M  +17 -3     src/kmplayer_smil.cpp  
 M  +3 -0      src/kmplayer_smil.h  
 M  +12 -0     src/surface.cpp  
 M  +1 -0      src/surface.h  
 M  +30 -6     src/viewarea.cpp  
 M  +2 -2      tests/timings.smil  


--- trunk/extragear/multimedia/kmplayer/src/kmplayer_smil.cpp #985031:985032
@@ -1321,6 +1321,7 @@
 KDE_NO_EXPORT void SMIL::RegionBase::activate () {
     show_background = ShowAlways;
     bg_opacity = 100;
+    bg_repeat = BgRepeat;
     fit = fit_default;
     Node *n = parentNode ();
     if (n && SMIL::id_node_layout == n->id)
@@ -1445,6 +1446,17 @@
         else
             show_background = ShowAlways;
         need_repaint = true;
+    } else if (name == "backgroundRepeat") {
+        if (val == "norepeat")
+            bg_repeat = BgNoRepeat;
+        else if (val == "repeatX")
+            bg_repeat = BgRepeatX;
+        else if (val == "repeatY")
+            bg_repeat = BgRepeatY;
+        else if (val == "inherit")
+            bg_repeat = BgInherit;
+        else
+            bg_repeat = BgRepeat;
     } else if (name == "backgroundImage") {
         if (val == "none") {
             if (!background_image.isEmpty ()) {
@@ -1472,7 +1484,7 @@
     if (active ()) {
         Surface *s = (Surface *) role (RoleDisplay);
         if (s && s->background_color != background_color){
-            s->background_color = background_color;
+            s->setBackgroundColor (background_color);
             need_repaint = true;
         }
         if (need_repaint && s)
@@ -2838,7 +2850,7 @@
         pan_zoom->width = coords[2];
         pan_zoom->height = coords[3];
     } else if (para == "backgroundColor" || para == "background-color") {
-        background_color = val.isEmpty () ? 0xffffffff : QColor (val).rgba ();
+        background_color = val.isEmpty () ? 0 : QColor (val).rgba ();
         background_color = setRGBA (background_color, bg_opacity);
     } else if (para == "mediaOpacity") {
         opacity = (int) SizeType (val, true).size (100);
@@ -2874,6 +2886,7 @@
     }
     if (sub_surface) {
         sub_surface->markDirty ();
+        sub_surface->setBackgroundColor (background_color);
         sub_surface->repaint ();
     }
 }
@@ -2883,7 +2896,7 @@
         trans_out_active = false;
         trans_start_time = 0;
         fit = fit_default;
-        background_color = 0xffffffff;
+        background_color = 0;
         opacity = 100;
         bg_opacity = 100;
         Mrl::init (); // sets all attributes
@@ -3307,6 +3320,7 @@
         Surface *rs = (Surface *) region_node->role (RoleDisplay);
         if (rs) {
             sub_surface = rs->createSurface (this, SRect ());
+            sub_surface->setBackgroundColor (background_color);
             message (MsgSurfaceBoundsUpdate);
         }
     }
--- trunk/extragear/multimedia/kmplayer/src/kmplayer_smil.h #985031:985032
@@ -334,6 +334,9 @@
     unsigned int background_color;
     int bg_opacity;
     QString background_image;
+    enum BackgroundRepeat {
+        BgRepeat, BgRepeatX, BgRepeatY, BgNoRepeat, BgInherit
+    } bg_repeat;
     ShowBackground show_background;
     Fit fit;
     ConnectionList m_AttachedMediaTypes;   // active attached mediatypes
--- trunk/extragear/multimedia/kmplayer/src/surface.cpp #985031:985032
@@ -136,6 +136,18 @@
     return matrix.toScreen (SRect (0, 0, size));
 }
 
+void Surface::setBackgroundColor (unsigned int argb) {
+#ifdef KMPLAYER_WITH_CAIRO
+    if (surface &&
+            ((background_color & 0xff000000) < 0xff000000) !=
+            ((argb & 0xff000000) < 0xff000000)) {
+        cairo_surface_destroy (surface);
+        surface = NULL;
+    }
+#endif
+    background_color = argb;
+}
+
 static void clipToScreen (Surface *s, Matrix &m, IRect &clip) {
     Surface *ps = s->parentNode ();
     if (!ps) {
--- trunk/extragear/multimedia/kmplayer/src/surface.h #985031:985032
@@ -48,6 +48,7 @@
     void markDirty ();             // mark this and ancestors dirty
     void updateChildren (bool parent_resized=false);
     SSize dimension () const { return size.isEmpty () ? bounds.size : size; }
+    void setBackgroundColor (unsigned int argb);
 
     NodePtrW node;
     SRect bounds;                  // bounds in parent coord.
--- trunk/extragear/multimedia/kmplayer/src/viewarea.cpp #985031:985032
@@ -181,6 +181,7 @@
     SMIL::MediaType *cur_media;
     cairo_pattern_t * cur_pat;
     cairo_matrix_t cur_mat;
+    SMIL::RegionBase::BackgroundRepeat bg_repeat;
     float opacity;
     bool toplevel;
 
@@ -217,7 +218,7 @@
 CairoPaintVisitor::CairoPaintVisitor (cairo_surface_t * cs, Matrix m,
         const IRect & rect, QColor c, bool top)
  : clip (rect), cairo_surface (cs),
-   matrix (m), toplevel (top) {
+   matrix (m), bg_repeat (SMIL::RegionBase::BgRepeat), toplevel (top) {
     cr = cairo_create (cs);
     if (toplevel) {
         cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
@@ -328,6 +329,9 @@
         matrix.transform (m);
         IRect clip_save = clip;
         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);
 
         Surface *cs = s->firstChild ();
@@ -370,8 +374,27 @@
                 cairo_matrix_init_translate (&mat, -scr.x (), -scr.y ());
                 cairo_pattern_set_matrix (pat, &mat);
                 cairo_set_source (cr, pat);
-                cairo_rectangle (cr,
-                        clip.x (), clip.y (), clip.width (), clip.height ());
+                int cw = clip.width ();
+                int ch = clip.height ();
+                switch (bg_repeat) {
+                case SMIL::RegionBase::BgRepeatX:
+                    if (h < ch)
+                        ch = h;
+                    break;
+                case SMIL::RegionBase::BgRepeatY:
+                    if (w < cw)
+                        cw = w;
+                    break;
+                case SMIL::RegionBase::BgNoRepeat:
+                    if (w < cw)
+                        cw = w;
+                    if (h < ch)
+                        ch = h;
+                    break;
+                default:
+                    break;
+                }
+                cairo_rectangle (cr, clip.x (), clip.y (), cw, ch);
                 cairo_fill (cr);
                 cairo_pattern_destroy (pat);
                 if (bg_img->has_alpha)
@@ -458,6 +481,7 @@
         }
         cairo_restore (cr);
         matrix = m;
+        bg_repeat = bg_repeat_save;
         clip = clip_save;
         s->dirty = false;
     }
@@ -828,7 +852,7 @@
             calculateTextDimensions (desc, text.data (),
                     w, 2 * ft_size, &pxw, &pxh, false);
         }
-        unsigned int bg_alpha = txt->background_color & 0xff000000;
+        unsigned int bg_alpha = s->background_color & 0xff000000;
         if (!s->surface)
             s->surface = cairo_surface_create_similar (cairo_surface,
                     bg_alpha < 0xff000000
@@ -842,9 +866,9 @@
 
         if (bg_alpha) {
             if (bg_alpha < 0xff000000)
-                CAIRO_SET_SOURCE_ARGB (cr_txt, txt->background_color);
+                CAIRO_SET_SOURCE_ARGB (cr_txt, s->background_color);
             else
-                CAIRO_SET_SOURCE_RGB (cr_txt, txt->background_color);
+                CAIRO_SET_SOURCE_RGB (cr_txt, s->background_color);
             cairo_paint (cr_txt);
         }
 
--- trunk/extragear/multimedia/kmplayer/tests/timings.smil #985031:985032
@@ -58,7 +58,7 @@
                fill="freeze"/>
         </par>
         <par id="rep_seq">
-          <text src="data:,%3Cseq%20repeat=3%3E"
+          <text src="data:,%3Cseq%20repeat=3%3E" fontColor="LightGray"
                 region="reg1"/>
           <set target="rep_seq_txt" attribute="background-color" to="green"/>
           <set target="reg2" attribute="background-color" to="white"/>
@@ -70,7 +70,7 @@
         </par>
         <par id="multi_trigger" dur="20">
           <text id="multi_text" \
src="data:,begin=%224;start_text.activateEvent%22%2Cend=%228;end_text.activateEvent%22"
                
-                region="reg1"/>
+                fontColor="LightGray" region="reg1"/>
           <text id="start_text" src="data:,Start" background-color="green"
                 region="reg2"/>
           <text id="end_text" src="data:,Stop" background-color="IndianRed"


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

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