From 7cbec7fbf26011bc6428fc1e680ac8516c97ae9d Mon Sep 17 00:00:00 2001 From: maroy Date: Wed, 13 Apr 2005 14:47:55 +0000 Subject: [PATCH] made windows and the image buttons transparent, at last fix for issue #793, see http://bugs.campware.org/view.php?id=793 --- .../include/LiveSupport/Widgets/BlueBin.h | 27 +++- .../LiveSupport/Widgets/CornerBitmaps.h | 138 ++++++++++++++++++ .../include/LiveSupport/Widgets/ImageButton.h | 14 +- .../LiveSupport/Widgets/WidgetFactory.h | 11 +- livesupport/modules/widgets/src/BlueBin.cxx | 62 +++++++- .../modules/widgets/src/ImageButton.cxx | 19 ++- .../modules/widgets/src/TestWindow.cxx | 6 +- .../modules/widgets/src/WhiteWindow.cxx | 6 +- .../modules/widgets/src/WidgetFactory.cxx | 21 ++- .../widgets/var/imageButton/hugePlay.png | Bin 0 -> 3658 bytes .../widgets/var/imageButton/hugePlayRoll.png | Bin 0 -> 3683 bytes 11 files changed, 274 insertions(+), 30 deletions(-) create mode 100644 livesupport/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h create mode 100644 livesupport/modules/widgets/var/imageButton/hugePlay.png create mode 100644 livesupport/modules/widgets/var/imageButton/hugePlayRoll.png diff --git a/livesupport/modules/widgets/include/LiveSupport/Widgets/BlueBin.h b/livesupport/modules/widgets/include/LiveSupport/Widgets/BlueBin.h index 3c4fbbb4f..7a9b8eb0b 100644 --- a/livesupport/modules/widgets/include/LiveSupport/Widgets/BlueBin.h +++ b/livesupport/modules/widgets/include/LiveSupport/Widgets/BlueBin.h @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.6 $ + Author : $Author: maroy $ + Version : $Revision: 1.7 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/include/LiveSupport/Widgets/BlueBin.h,v $ ------------------------------------------------------------------------------*/ @@ -44,6 +44,7 @@ #include "LiveSupport/Core/Ptr.h" #include "LiveSupport/Widgets/CornerImages.h" +#include "LiveSupport/Widgets/CornerBitmaps.h" #include "LiveSupport/Widgets/Colors.h" @@ -63,12 +64,19 @@ using namespace LiveSupport::Core; /** * A container holding exactly one child, habing a light blue border to it. * - * @author $Author: fgerlits $ - * @version $Revision: 1.6 $ + * @author $Author: maroy $ + * @version $Revision: 1.7 $ */ class BlueBin : public Gtk::Bin { private: + /** + * Flag to indicate if the bin should try to make its border + * transparent (only where the border images are transparent, + * of course). + */ + bool transparentBorder; + /** * The Gdk::Window object, used to draw inside this button. */ @@ -94,6 +102,11 @@ class BlueBin : public Gtk::Bin */ Ptr::Ref cornerImages; + /** + * The corner bitmaps, for masking for transparency. + */ + Ptr::Ref cornerBitmaps; + /** * Default constructor. */ @@ -221,9 +234,13 @@ class BlueBin : public Gtk::Bin * * @param backgroundColor the RGB value for the background color. * @param cornerImages the corner images. + * @param transparentBorder flag to indicate if the widget should + * make its border transparent, where the border images + * are transparent themselves */ BlueBin(Colors::ColorName backgroundColor, - Ptr::Ref cornerImages) + Ptr::Ref cornerImages, + bool transparentBorder = false) throw (); /** diff --git a/livesupport/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h b/livesupport/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h new file mode 100644 index 000000000..137529aef --- /dev/null +++ b/livesupport/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h @@ -0,0 +1,138 @@ +/*------------------------------------------------------------------------------ + + Copyright (c) 2004 Media Development Loan Fund + + This file is part of the LiveSupport project. + http://livesupport.campware.org/ + To report bugs, send an e-mail to bugs@campware.org + + LiveSupport is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + LiveSupport is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LiveSupport; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + + Author : $Author: maroy $ + Version : $Revision: 1.1 $ + Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/include/LiveSupport/Widgets/CornerBitmaps.h,v $ + +------------------------------------------------------------------------------*/ +#ifndef LiveSupport_Widgets_CornerBitmaps_h +#define LiveSupport_Widgets_CornerBitmaps_h + +#ifndef __cplusplus +#error This is a C++ include file +#endif + + +/* ============================================================ include files */ + +#ifdef HAVE_CONFIG_H +#include "configure.h" +#endif + +#include + +#include "gdkmm/bitmap.h" + + +namespace LiveSupport { +namespace Widgets { + +/* ================================================================ constants */ + + +/* =================================================================== macros */ + + +/* =============================================================== data types */ + +/** + * A helper class to hold a set of corner bitmaps. + * + * @author $Author: maroy $ + * @version $Revision: 1.1 $ + */ +class CornerBitmaps +{ + public: + /** + * The top left image. + */ + Glib::RefPtr topLeftBitmap; + + /** + * The top right image. + */ + Glib::RefPtr topRightBitmap; + + /** + * The bottom left image. + */ + Glib::RefPtr bottomLeftBitmap; + + /** + * The bottom right image. + */ + Glib::RefPtr bottomRightBitmap; + + /** + * The default constructor. + */ + CornerBitmaps(void) throw () + { + } + + /** + * Constructor with image references. + * If any of the images is not available, the result is undefined. + * + * @param topLeftBitmap the top left bitmap of the border + * @param topRightBitmap the top right bitmap of the border + * @param bottomLeftBitmap the bottom left bitmap of the border + * @param bottomRightBitmap the bottom right bitmap of the border + */ + CornerBitmaps(Glib::RefPtr topLeftBitmap, + Glib::RefPtr topRightBitmap, + Glib::RefPtr bottomLeftBitmap, + Glib::RefPtr bottomRightBitmap) + throw () + { + this->topLeftBitmap = topLeftBitmap; + this->topRightBitmap = topRightBitmap; + this->bottomLeftBitmap = bottomLeftBitmap; + this->bottomRightBitmap = bottomRightBitmap; + } + + /** + * A virtual destructor, as this class has virtual functions. + */ + virtual + ~CornerBitmaps(void) throw () + { + } + + +}; + + +/* ================================================= external data structures */ + + +/* ====================================================== function prototypes */ + + +} // namespace Widgets +} // namespace LiveSupport + +#endif // LiveSupport_Widgets_CornerBitmaps_h + diff --git a/livesupport/modules/widgets/include/LiveSupport/Widgets/ImageButton.h b/livesupport/modules/widgets/include/LiveSupport/Widgets/ImageButton.h index d0cc63984..1511aeeb7 100644 --- a/livesupport/modules/widgets/include/LiveSupport/Widgets/ImageButton.h +++ b/livesupport/modules/widgets/include/LiveSupport/Widgets/ImageButton.h @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.1 $ + Version : $Revision: 1.2 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/include/LiveSupport/Widgets/ImageButton.h,v $ ------------------------------------------------------------------------------*/ @@ -60,7 +60,7 @@ namespace Widgets { * to represent it. * * @author $Author: maroy $ - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ */ class ImageButton : public Gtk::Button { @@ -95,6 +95,16 @@ class ImageButton : public Gtk::Button */ Glib::RefPtr rollImage; + /** + * The transparency mask for the button, in passive state. + */ + Glib::RefPtr passiveMask; + + /** + * The transparency mask for the button, in rollover state. + */ + Glib::RefPtr rollMask; + /** * Default constructor. */ diff --git a/livesupport/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h b/livesupport/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h index 53dd028e4..0732973f8 100644 --- a/livesupport/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h +++ b/livesupport/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.11 $ + Author : $Author: maroy $ + Version : $Revision: 1.12 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/include/LiveSupport/Widgets/WidgetFactory.h,v $ ------------------------------------------------------------------------------*/ @@ -86,8 +86,8 @@ using namespace LiveSupport::Core; * * * - * @author $Author: fgerlits $ - * @version $Revision: 1.11 $ + * @author $Author: maroy $ + * @version $Revision: 1.12 $ */ class WidgetFactory : virtual public Configurable @@ -102,7 +102,8 @@ class WidgetFactory : * The types of available image buttons. */ typedef enum { deleteButton, - smallPlayButton, smallPauseButton, smallStopButton } + smallPlayButton, smallPauseButton, smallStopButton, + hugePlayButton } ImageButtonType; /** diff --git a/livesupport/modules/widgets/src/BlueBin.cxx b/livesupport/modules/widgets/src/BlueBin.cxx index deab95860..638fc2a36 100644 --- a/livesupport/modules/widgets/src/BlueBin.cxx +++ b/livesupport/modules/widgets/src/BlueBin.cxx @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.8 $ + Author : $Author: maroy $ + Version : $Revision: 1.9 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/src/BlueBin.cxx,v $ ------------------------------------------------------------------------------*/ @@ -55,16 +55,31 @@ using namespace LiveSupport::Widgets; * Constructor. *----------------------------------------------------------------------------*/ BlueBin :: BlueBin(Colors::ColorName backgroundColor, - Ptr::Ref cornerImages) + Ptr::Ref cornerImages, + bool transparentBorder) throw () { set_flags(Gtk::NO_WINDOW); - this->cornerImages = cornerImages; + this->cornerImages = cornerImages; + this->transparentBorder = transparentBorder; child = 0; bgColor = Colors::getColor(backgroundColor); + + // generate the transparency mask bitmaps for the corners. + cornerBitmaps.reset(new CornerBitmaps()); + Glib::RefPtr pixmap; + + cornerImages->topLeftImage->render_pixmap_and_mask(pixmap, + cornerBitmaps->topLeftBitmap, 100); + cornerImages->topRightImage->render_pixmap_and_mask(pixmap, + cornerBitmaps->topRightBitmap, 100); + cornerImages->bottomLeftImage->render_pixmap_and_mask(pixmap, + cornerBitmaps->bottomLeftBitmap, 100); + cornerImages->bottomRightImage->render_pixmap_and_mask(pixmap, + cornerBitmaps->bottomRightBitmap, 100); } @@ -225,12 +240,11 @@ BlueBin :: on_realize() throw () if (!gdkWindow) { // create the Gdk::Window, if it didn't exist before + Gtk::Allocation allocation = get_allocation(); GdkWindowAttr attributes; memset(&attributes, 0, sizeof(attributes)); - Gtk::Allocation allocation = get_allocation(); - // set initial position and size of the Gdk::Window attributes.x = allocation.get_x(); attributes.y = allocation.get_y(); @@ -282,11 +296,43 @@ BlueBin :: on_expose_event(GdkEventExpose* event) throw () return false; } + int width = get_width(); + int height = get_height(); + + if (transparentBorder) { + unsigned int bitmapSize = 1 + (width * height); + + char * bitmapData = new char[bitmapSize]; + memset(bitmapData, 0xff, bitmapSize); + + Glib::RefPtr mask = Gdk::Bitmap::create(bitmapData, + width, + height); + delete[] bitmapData; + + Glib::RefPtr gc = Gdk::GC::create(mask); + Glib::RefPtr borderMask; + + mask->draw_drawable(gc, cornerBitmaps->topLeftBitmap, 0, 0, 0, 0); + + mask->draw_drawable(gc, cornerBitmaps->topRightBitmap, 0, 0, + width - cornerImages->topRightImage->get_width(), + 0); + + mask->draw_drawable(gc, cornerBitmaps->bottomLeftBitmap, 0, 0, + 0, + height - cornerImages->bottomLeftImage->get_height()); + + mask->draw_drawable(gc, cornerBitmaps->bottomRightBitmap, 0, 0, + width - cornerImages->bottomRightImage->get_width(), + height - cornerImages->bottomRightImage->get_height()); + + get_parent_window()->shape_combine_mask(mask, 0, 0); + } + if (gdkWindow) { gdkWindow->clear(); - int width = get_width(); - int height = get_height(); int x; int maxX; int y; diff --git a/livesupport/modules/widgets/src/ImageButton.cxx b/livesupport/modules/widgets/src/ImageButton.cxx index fa33becdb..68bf01de4 100644 --- a/livesupport/modules/widgets/src/ImageButton.cxx +++ b/livesupport/modules/widgets/src/ImageButton.cxx @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.5 $ + Author : $Author: maroy $ + Version : $Revision: 1.6 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/src/ImageButton.cxx,v $ ------------------------------------------------------------------------------*/ @@ -61,6 +61,10 @@ ImageButton :: ImageButton(Glib::RefPtr image) state = passiveState; this->passiveImage = image; this->rollImage.clear(); + + // read the mask from a transparent PNG, and set it to this widget + Glib::RefPtr pixmap; + passiveImage->render_pixmap_and_mask(pixmap, passiveMask, 100); } @@ -76,6 +80,11 @@ ImageButton :: ImageButton(Glib::RefPtr passiveImage, state = passiveState; this->passiveImage = passiveImage; this->rollImage = rollImage; + + // read the mask from a transparent PNG, and set it to this widget + Glib::RefPtr pixmap; + passiveImage->render_pixmap_and_mask(pixmap, passiveMask, 100); + rollImage->render_pixmap_and_mask(pixmap, rollMask, 100); } @@ -260,17 +269,23 @@ ImageButton :: on_expose_event(GdkEventExpose* event) throw () gdkWindow->clear(); Glib::RefPtr image; + Glib::RefPtr mask; switch (state) { case passiveState: default: image = passiveImage; + mask = passiveMask; break; case rollState: image = rollImage ? rollImage : passiveImage; + mask = rollMask ? rollMask : passiveMask; break; } + + // set the transparency mask + get_window()->shape_combine_mask(mask, 0, 0); // just draw the button image at the centre of the available space int x = (get_width() - image->get_width()) / 2; diff --git a/livesupport/modules/widgets/src/TestWindow.cxx b/livesupport/modules/widgets/src/TestWindow.cxx index b660ad16b..a4856af40 100644 --- a/livesupport/modules/widgets/src/TestWindow.cxx +++ b/livesupport/modules/widgets/src/TestWindow.cxx @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.13 $ + Author : $Author: maroy $ + Version : $Revision: 1.14 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/src/TestWindow.cxx,v $ ------------------------------------------------------------------------------*/ @@ -66,7 +66,7 @@ TestWindow :: TestWindow (void) // init the imageButton imageButton = Gtk::manage( - widgetFactory->createButton(WidgetFactory::deleteButton)); + widgetFactory->createButton(WidgetFactory::hugePlayButton)); // create a button button = Gtk::manage(widgetFactory->createButton("Hello, World!")); diff --git a/livesupport/modules/widgets/src/WhiteWindow.cxx b/livesupport/modules/widgets/src/WhiteWindow.cxx index 167c48f03..361ab05af 100644 --- a/livesupport/modules/widgets/src/WhiteWindow.cxx +++ b/livesupport/modules/widgets/src/WhiteWindow.cxx @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.11 $ + Author : $Author: maroy $ + Version : $Revision: 1.12 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/src/WhiteWindow.cxx,v $ ------------------------------------------------------------------------------*/ @@ -146,7 +146,7 @@ WhiteWindow :: constructWindow(Colors::ColorName backgroundColor, } // add the corners - blueBin = Gtk::manage(new BlueBin(backgroundColor, cornerImages)); + blueBin = Gtk::manage(new BlueBin(backgroundColor, cornerImages, true)); blueBin->add(*layout); Gtk::Window::add(*blueBin); diff --git a/livesupport/modules/widgets/src/WidgetFactory.cxx b/livesupport/modules/widgets/src/WidgetFactory.cxx index c580a70e7..7c6824a8c 100644 --- a/livesupport/modules/widgets/src/WidgetFactory.cxx +++ b/livesupport/modules/widgets/src/WidgetFactory.cxx @@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Author : $Author: fgerlits $ - Version : $Revision: 1.13 $ + Author : $Author: maroy $ + Version : $Revision: 1.14 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/modules/widgets/src/WidgetFactory.cxx,v $ ------------------------------------------------------------------------------*/ @@ -138,6 +138,18 @@ static const std::string smallStopButtonPassiveName static const std::string smallStopButtonRollName = "imageButton/smallStopRoll.png"; +/** + * The name of the passive image for the huge play button. + */ +static const std::string hugePlayButtonPassiveName + = "imageButton/hugePlay.png"; + +/** + * The name of the rollover image for the huge play button. + */ +static const std::string hugePlayButtonRollName + = "imageButton/hugePlayRoll.png"; + /** * The name of the combo box left image. */ @@ -333,6 +345,11 @@ WidgetFactory :: createButton(ImageButtonType type) throw () rollImage = loadImage(smallStopButtonRollName); break; + case hugePlayButton: + passiveImage = loadImage(hugePlayButtonPassiveName); + rollImage = loadImage(hugePlayButtonRollName); + break; + default: return 0; } diff --git a/livesupport/modules/widgets/var/imageButton/hugePlay.png b/livesupport/modules/widgets/var/imageButton/hugePlay.png new file mode 100644 index 0000000000000000000000000000000000000000..f1628edfe0f500a43bdf00651f803e30d0cb2db6 GIT binary patch literal 3658 zcmV-Q4z=-#P)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde00d`2O+f$vv5tKEQIh}w03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(` z>RI+y?e7jKeZ#YO-C17}G@K~#9!?3_Pn(?Jx+zxU&3wRS4fPJ%er4#Cw$kPdPf zXDf&X0Ju9rZwTxgIAdXYEx>Znz+{^ux*Tpk!!+} z>t`y3Cnip1(K^n2fHs6?ZqUpP6a-&oY9@&)+d*Z9VceDHgol?;R{$xcY9Ennkc~w^ z%rL|-M9_wyH9-MLBA(7}DN){{l0_2QmUX@SjY-+%lJ(>?pCwB;|~ z@Mz&#h)V0Pd%k@8E+}x`q#R*^^C%F60?xbSHUx00-+>@ZaDrrlSH1gNK7*U&U;ZYy zzJl|9<PDTc5z$f?dKW*!=+)*dnA4;FJV-3-A4hk68WvC(dbmwXvh4 zn7ermlM}~c?b!{mlP8YH=ou2QAd*|(fCUjf{R8ItjTIk(dF`IQ0`s=^^c$Fm(bIQe zE%%JT0(H-DfEDi9=T(l7fECvFlp{1?3WBts$?e7S=MbXBJ-35Y5ya>@NJ^8q6S6m@ zMfV(#g5778A#RD^1(EB*+q^tUZhfU?+ZSE;oqH6qU3j}T$;yx_j9EY=AQl+IAZC#3 z!b^7=Y+Ln)2wb5s78ql@iSyh*Yl7AcCf;6Y0^7gMED*?0P%GpivUx&6qoL7g*rtDN zsMYVO=I)kf6i~W#U)xS8i0A znqUlp$jxm-;HE`hR!mJqjHTy~Gxv6FePq141zKUF`Px6HT1m%JqT2+emoW!1_5iE} ctFXTV03Y69#iKY0%K!iX07*qoM6N<$f=N*J@&Et; literal 0 HcmV?d00001 diff --git a/livesupport/modules/widgets/var/imageButton/hugePlayRoll.png b/livesupport/modules/widgets/var/imageButton/hugePlayRoll.png new file mode 100644 index 0000000000000000000000000000000000000000..55ea1ab2ab914505e4751daf25cc5e05cf5b020f GIT binary patch literal 3683 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 B2iX7s literal 0 HcmV?d00001