[vlc-commits] windowed Mac plugin: implement no media appearance as a show case for the CALayer

Felix Paul Kühne git at videolan.org
Tue Jan 1 19:52:47 CET 2013


npapi-vlc | branch: master | Felix Paul Kühne <fkuehne at videolan.org> | Tue Jan  1 19:52:36 2013 +0100| [100858a06938938b6bfadee4cdb71aff232c1545] | committer: Felix Paul Kühne

windowed Mac plugin: implement no media appearance as a show case for the CALayer

> http://git.videolan.org/gitweb.cgi/npapi-vlc.git/?a=commit;h=100858a06938938b6bfadee4cdb71aff232c1545
---

 npapi/vlcplugin_mac.h  |    1 +
 npapi/vlcplugin_mac.mm |  145 ++++++++++++++++++++++++++++++++++++++++--------
 npapi/vlcshell.cpp     |    2 +-
 3 files changed, 123 insertions(+), 25 deletions(-)

diff --git a/npapi/vlcplugin_mac.h b/npapi/vlcplugin_mac.h
index cafebf3..2bd592f 100644
--- a/npapi/vlcplugin_mac.h
+++ b/npapi/vlcplugin_mac.h
@@ -32,6 +32,7 @@ class VlcPluginMac : public VlcPluginBase
 {
 public:
     VlcPluginMac(NPP, NPuint16_t);
+    virtual ~VlcPluginMac();
 
     int                 setSize(unsigned width, unsigned height);
 
diff --git a/npapi/vlcplugin_mac.mm b/npapi/vlcplugin_mac.mm
index edfccaf..2d28821 100644
--- a/npapi/vlcplugin_mac.mm
+++ b/npapi/vlcplugin_mac.mm
@@ -29,9 +29,28 @@
 
 #include <npapi.h>
 
+#include <QuartzCore/QuartzCore.h>
+
+ at interface VLCControllerLayer : CALayer {
+    BOOL b_nomedia;
+}
+ at property (readwrite) BOOL noMedia;
+
+ at end
+
+static CALayer * rootLayer;
+static VLCControllerLayer * controllerLayer;
+
 VlcPluginMac::VlcPluginMac(NPP instance, NPuint16_t mode) :
     VlcPluginBase(instance, mode)
 {
+    rootLayer = [[CALayer alloc] init];
+}
+
+VlcPluginMac::~VlcPluginMac()
+{
+    [controllerLayer release];
+    [rootLayer release];
 }
 
 void VlcPluginMac::set_player_window()
@@ -70,29 +89,6 @@ bool VlcPluginMac::create_windows()
 
 bool VlcPluginMac::resize_windows()
 {
-    /* as MacOS X video output is windowless, set viewport */
-    libvlc_rectangle_t view, clip;
-
-    /* browser sets port origin to top-left location of plugin
-     * relative to GrafPort window origin is set relative to document,
-     * which of little use for drawing
-     */
-    view.top	= 0; // ((NP_Port*) (npwindow.window))->porty;
-    view.left	= 0; // ((NP_Port*) (npwindow.window))->portx;
-    view.bottom  = npwindow.height+view.top;
-    view.right   = npwindow.width+view.left;
-
-    /* clipRect coordinates are also relative to GrafPort */
-    clip.top     = npwindow.clipRect.top;
-    clip.left    = npwindow.clipRect.left;
-    clip.bottom  = npwindow.clipRect.bottom;
-    clip.right   = npwindow.clipRect.right;
-
-#ifdef NOT_WORKING
-    libvlc_video_set_viewport(p_vlc, p_plugin->getMD(), &view, &clip);
-#else
-#warning disabled code
-#endif
     return true;
 }
 
@@ -104,7 +100,15 @@ bool VlcPluginMac::destroy_windows()
 
 NPError VlcPluginMac::get_root_layer(void *value)
 {
-    return NPERR_GENERIC_ERROR;
+    controllerLayer = [[VLCControllerLayer alloc] init];
+    controllerLayer.opaque = 1.;
+    controllerLayer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;
+    [controllerLayer setNoMedia:YES];
+
+    [rootLayer addSublayer: controllerLayer];
+
+    *(CALayer **)value = rootLayer;
+    return NPERR_NO_ERROR;
 }
 
 bool VlcPluginMac::handle_event(void *event)
@@ -170,3 +174,96 @@ bool VlcPluginMac::handle_event(void *event)
 
     return VlcPluginBase::handle_event(event);
 }
+
+ at implementation VLCControllerLayer
+ at synthesize noMedia=b_nomedia;
+
+- (id)init
+{
+    if (self = [super init]) {
+        self.needsDisplayOnBoundsChange = YES;
+        self.frame = CGRectMake(0, 0, 0, 25);
+        self.autoresizingMask = kCALayerWidthSizable;
+    }
+
+    return self;
+}
+
+- (void)drawNoMedia:(CGContextRef)cgContext
+{
+    float windowWidth = self.visibleRect.size.width;
+    float windowHeight = self.visibleRect.size.height;
+
+    CGContextSaveGState(cgContext);
+
+    // draw a gray background
+    CGContextAddRect(cgContext, CGRectMake(0, 0, windowWidth, windowHeight));
+    CGContextSetGrayFillColor(cgContext, .5, 1.);
+    CGContextDrawPath(cgContext, kCGPathFill);
+
+    // draw info text
+    CGContextSetGrayStrokeColor(cgContext, .7, 1.);
+    CGContextSetTextDrawingMode(cgContext, kCGTextFillStroke);
+    CGContextSetGrayFillColor(cgContext, 1., 1.);
+    CFStringRef keys[2];
+    keys[0] = kCTFontAttributeName;
+    keys[1] = kCTForegroundColorFromContextAttributeName;
+    CFTypeRef values[2];
+    values[0] = CTFontCreateWithName(CFSTR("Helvetica"),18,NULL);
+    values[1] = kCFBooleanTrue;
+    CFDictionaryRef stylesDict = CFDictionaryCreate(kCFAllocatorDefault,
+                                                    (const void **)&keys,
+                                                    (const void **)&values,
+                                                    2, NULL, NULL);
+    CFAttributedStringRef attRef = CFAttributedStringCreate(kCFAllocatorDefault, CFSTR("VLC Multimedia Plug-in"), stylesDict);
+    CTLineRef textLine = CTLineCreateWithAttributedString(attRef);
+    CGRect textRect = CTLineGetImageBounds(textLine, cgContext);
+    CGContextSetTextPosition(cgContext, ((windowWidth - textRect.size.width) / 2), ((windowHeight - textRect.size.height) / 2));
+    CTLineDraw(textLine, cgContext);
+    CFRelease(textLine);
+    CFRelease(attRef);
+
+    // print smaller text from here
+    CFRelease(stylesDict);
+    values[0] = CTFontCreateWithName(CFSTR("Helvetica"),14,NULL);
+    stylesDict = CFDictionaryCreate(kCFAllocatorDefault,
+                                    (const void **)&keys,
+                                    (const void **)&values,
+                                    2, NULL, NULL);
+    CGContextSetGrayFillColor(cgContext, .8, 1.);
+
+    // draw version string
+    attRef = CFAttributedStringCreate(kCFAllocatorDefault, CFStringCreateWithCString(kCFAllocatorDefault, libvlc_get_version(), kCFStringEncodingUTF8), stylesDict);
+    textLine = CTLineCreateWithAttributedString(attRef);
+    textRect = CTLineGetImageBounds(textLine, cgContext);
+    CGContextSetTextPosition(cgContext, ((windowWidth - textRect.size.width) / 2), ((windowHeight - textRect.size.height) / 2) - 25.);
+    CTLineDraw(textLine, cgContext);
+    CFRelease(textLine);
+    CFRelease(attRef);
+
+    // expose drawing model
+    attRef = CFAttributedStringCreate(kCFAllocatorDefault, CFSTR("windowed output mode using CoreAnimation"), stylesDict);
+    textLine = CTLineCreateWithAttributedString(attRef);
+    textRect = CTLineGetImageBounds(textLine, cgContext);
+    CGContextSetTextPosition(cgContext, ((windowWidth - textRect.size.width) / 2), ((windowHeight - textRect.size.height) / 2) - 45.);
+    CTLineDraw(textLine, cgContext);
+    CFRelease(textLine);
+    CFRelease(attRef);
+    CFRelease(stylesDict);
+
+    CGContextRestoreGState(cgContext);
+}
+
+- (void)drawInContext:(CGContextRef)cgContext
+{
+    if (self.noMedia)
+        [self drawNoMedia:cgContext];
+    else {
+        CGContextSaveGState(cgContext);
+        CGContextSetFillColorWithColor(cgContext, CGColorGetConstantColor(kCGColorBlack));
+        CGContextFillRect(cgContext, self.bounds);
+        CGContextRestoreGState(cgContext);
+    }
+}
+
+ at end
diff --git a/npapi/vlcshell.cpp b/npapi/vlcshell.cpp
index 401f494..c7926a2 100644
--- a/npapi/vlcshell.cpp
+++ b/npapi/vlcshell.cpp
@@ -176,7 +176,7 @@ NPError NPP_GetValue( NPP instance, NPPVariable variable, void *value )
         case NPPVpluginCoreAnimationLayer:
         {
             if( instance )
-                return p_plugin->get_root_layer(&value);;
+                return p_plugin->get_root_layer(value);
 
             break;
         }



More information about the vlc-commits mailing list