[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