[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