npapi-vlc | branch: master | Felix Paul Kühne <[email protected]> | Tue Jan 1 21:27:18 2013 +0100| [42d88288ffa90a38830b3e6e9d6b8436a2ae5ab1] | committer: Felix Paul Kühne
Windowed Mac Plugin: added a basic draft for a controller toolbar > http://git.videolan.org/gitweb.cgi/npapi-vlc.git/?a=commit;h=42d88288ffa90a38830b3e6e9d6b8436a2ae5ab1 --- npapi/Makefile.am | 1 + npapi/vlcplugin_mac.mm | 163 +++++++++++++++++++++++++--- share/pixmaps/macosx/Knob.png | Bin 0 -> 1192 bytes share/pixmaps/macosx/Pause.png | Bin 0 -> 2002 bytes share/pixmaps/macosx/Play.png | Bin 0 -> 1975 bytes share/pixmaps/macosx/SliderTrackCenter.png | Bin 0 -> 410 bytes share/pixmaps/macosx/SliderTrackLeft.png | Bin 0 -> 493 bytes share/pixmaps/macosx/SliderTrackRight.png | Bin 0 -> 490 bytes 8 files changed, 146 insertions(+), 18 deletions(-) diff --git a/npapi/Makefile.am b/npapi/Makefile.am index c891746..abd6597 100644 --- a/npapi/Makefile.am +++ b/npapi/Makefile.am @@ -175,6 +175,7 @@ VLC\ Plugin.plugin: $(lib_LTLIBRARIES) rm -Rf "$@" $(INSTALL) -d "VLC-Plugin.plugin/Contents/MacOS/lib" $(INSTALL) -d "VLC-Plugin.plugin/Contents/Resources" + $(INSTALL) $(top_srcdir)/share/pixmaps/macosx/*.png "VLC-Plugin.plugin/Contents/Resources" ACTION="release-makefile" PRODUCT="VLC-Plugin.plugin" libvlc_dir=$(LIBVLC_PREFIX) src_dir=$(srcdir) build_dir=$(top_builddir) sh "$(top_srcdir)/extras/macosx/build-package.sh" $(INSTALL) "$(top_builddir)/extras/macosx/Info.plist" "VLC-Plugin.plugin/Contents/Info.plist" mv "VLC-Plugin.plugin" "VLC Plugin.plugin" diff --git a/npapi/vlcplugin_mac.mm b/npapi/vlcplugin_mac.mm index 2d28821..390aa62 100644 --- a/npapi/vlcplugin_mac.mm +++ b/npapi/vlcplugin_mac.mm @@ -31,14 +31,26 @@ #include <QuartzCore/QuartzCore.h> +@interface VLCNoMediaLayer : CALayer { +} + +@end + @interface VLCControllerLayer : CALayer { - BOOL b_nomedia; + CGImageRef _playImage; + CGImageRef _pauseImage; + + CGImageRef _sliderTrackLeft; + CGImageRef _sliderTrackRight; + CGImageRef _sliderTrackCenter; + + CGImageRef _knob; } -@property (readwrite) BOOL noMedia; @end static CALayer * rootLayer; +static VLCNoMediaLayer * noMediaLayer; static VLCControllerLayer * controllerLayer; VlcPluginMac::VlcPluginMac(NPP instance, NPuint16_t mode) : @@ -100,11 +112,12 @@ bool VlcPluginMac::destroy_windows() NPError VlcPluginMac::get_root_layer(void *value) { + noMediaLayer = [[VLCNoMediaLayer alloc] init]; + noMediaLayer.opaque = 1.; + [rootLayer addSublayer: noMediaLayer]; + controllerLayer = [[VLCControllerLayer alloc] init]; controllerLayer.opaque = 1.; - controllerLayer.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; - [controllerLayer setNoMedia:YES]; - [rootLayer addSublayer: controllerLayer]; *(CALayer **)value = rootLayer; @@ -175,21 +188,19 @@ bool VlcPluginMac::handle_event(void *event) return VlcPluginBase::handle_event(event); } -@implementation VLCControllerLayer -@synthesize noMedia=b_nomedia; +@implementation VLCNoMediaLayer - (id)init { if (self = [super init]) { self.needsDisplayOnBoundsChange = YES; - self.frame = CGRectMake(0, 0, 0, 25); - self.autoresizingMask = kCALayerWidthSizable; + self.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable; } return self; } -- (void)drawNoMedia:(CGContextRef)cgContext +- (void)drawInContext:(CGContextRef)cgContext { float windowWidth = self.visibleRect.size.width; float windowHeight = self.visibleRect.size.height; @@ -254,16 +265,132 @@ bool VlcPluginMac::handle_event(void *event) CGContextRestoreGState(cgContext); } -- (void)drawInContext:(CGContextRef)cgContext +@end + +@implementation VLCControllerLayer + +static CGImageRef createImageNamed(NSString *name) { - if (self.noMedia) - [self drawNoMedia:cgContext]; - else { - CGContextSaveGState(cgContext); - CGContextSetFillColorWithColor(cgContext, CGColorGetConstantColor(kCGColorBlack)); - CGContextFillRect(cgContext, self.bounds); - CGContextRestoreGState(cgContext); + CFURLRef url = CFBundleCopyResourceURL(CFBundleGetBundleWithIdentifier(CFSTR("com.netscape.vlc")), (CFStringRef)name, CFSTR("png"), NULL); + + if (!url) + return NULL; + + CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL); + if (!imageSource) + return NULL; + + CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); + CFRelease(imageSource); + + return image; +} + +- (id)init +{ + if (self = [super init]) { + self.needsDisplayOnBoundsChange = YES; + self.frame = CGRectMake(0, 0, 0, 25); + self.autoresizingMask = kCALayerWidthSizable; + + _playImage = createImageNamed(@"Play"); + _pauseImage = createImageNamed(@"Pause"); + _sliderTrackLeft = createImageNamed(@"SliderTrackLeft"); + _sliderTrackRight = createImageNamed(@"SliderTrackRight"); + _sliderTrackCenter = createImageNamed(@"SliderTrackCenter"); + + _knob = createImageNamed(@"Knob"); } + + return self; +} + +- (void)dealloc +{ + CGImageRelease(_playImage); + CGImageRelease(_pauseImage); + + CGImageRelease(_sliderTrackLeft); + CGImageRelease(_sliderTrackRight); + CGImageRelease(_sliderTrackCenter); + + CGImageRelease(_knob); + + [super dealloc]; +} + +- (CGRect)_playPauseButtonRect +{ + return CGRectMake(0, 0, 25, 25); +} + +- (CGRect)_sliderRect +{ + CGFloat sliderYPosition = (self.bounds.size.height - CGImageGetHeight(_sliderTrackLeft)) / 2.0; + CGFloat playPauseButtonWidth = [self _playPauseButtonRect].size.width; + + return CGRectMake(playPauseButtonWidth, sliderYPosition, + self.bounds.size.width - playPauseButtonWidth - 7, CGImageGetHeight(_sliderTrackLeft)); +} + +- (CGRect)_sliderThumbRect +{ + CGRect sliderRect = [self _sliderRect]; + + CGFloat fraction = 0.0; +/* if (_movie) + fraction = [self _currentTime] / [self _duration];*/ + + CGFloat x = fraction * (CGRectGetWidth(sliderRect) - CGImageGetWidth(_knob)); + + return CGRectMake(CGRectGetMinX(sliderRect) + x, CGRectGetMinY(sliderRect) - 1, + CGImageGetWidth(_knob), CGImageGetHeight(_knob)); +} + +- (CGRect)_innerSliderRect +{ + return CGRectInset([self _sliderRect], CGRectGetWidth([self _sliderThumbRect]) / 2, 0); +} + +- (void)_drawPlayPauseButtonInContext:(CGContextRef)context +{ + CGContextDrawImage(context, [self _playPauseButtonRect], _playImage); //playlist_isplaying() ? _pauseImage; +} + +- (void)_drawSliderInContext:(CGContextRef)context +{ + // Draw the thumb + CGRect sliderThumbRect = [self _sliderThumbRect]; + CGContextDrawImage(context, sliderThumbRect, _knob); + + CGRect sliderRect = [self _sliderRect]; + + // Draw left part + CGRect sliderLeftTrackRect = CGRectMake(CGRectGetMinX(sliderRect), CGRectGetMinY(sliderRect), + CGImageGetWidth(_sliderTrackLeft), CGImageGetHeight(_sliderTrackLeft)); + CGContextDrawImage(context, sliderLeftTrackRect, _sliderTrackLeft); + + // Draw center part + CGRect sliderCenterTrackRect = CGRectInset(sliderRect, CGImageGetWidth(_sliderTrackLeft), 0); + CGContextDrawImage(context, sliderCenterTrackRect, _sliderTrackCenter); + + // Draw right part + CGRect sliderRightTrackRect = CGRectMake(CGRectGetMaxX(sliderCenterTrackRect), CGRectGetMinY(sliderRect), + CGImageGetWidth(_sliderTrackRight), CGImageGetHeight(_sliderTrackRight)); + CGContextDrawImage(context, sliderRightTrackRect, _sliderTrackRight); + +} + +- (void)drawInContext:(CGContextRef)cgContext +{ + CGContextSaveGState(cgContext); + CGContextSetFillColorWithColor(cgContext, CGColorGetConstantColor(kCGColorBlack)); + CGContextFillRect(cgContext, self.bounds); + CGContextRestoreGState(cgContext); + + [self _drawPlayPauseButtonInContext:cgContext]; + [self _drawSliderInContext:cgContext]; } @end + diff --git a/share/pixmaps/macosx/Knob.png b/share/pixmaps/macosx/Knob.png new file mode 100644 index 0000000..0ec2ab6 Binary files /dev/null and b/share/pixmaps/macosx/Knob.png differ diff --git a/share/pixmaps/macosx/Pause.png b/share/pixmaps/macosx/Pause.png new file mode 100644 index 0000000..ad06f06 Binary files /dev/null and b/share/pixmaps/macosx/Pause.png differ diff --git a/share/pixmaps/macosx/Play.png b/share/pixmaps/macosx/Play.png new file mode 100644 index 0000000..0b28903 Binary files /dev/null and b/share/pixmaps/macosx/Play.png differ diff --git a/share/pixmaps/macosx/SliderTrackCenter.png b/share/pixmaps/macosx/SliderTrackCenter.png new file mode 100644 index 0000000..02b9711 Binary files /dev/null and b/share/pixmaps/macosx/SliderTrackCenter.png differ diff --git a/share/pixmaps/macosx/SliderTrackLeft.png b/share/pixmaps/macosx/SliderTrackLeft.png new file mode 100644 index 0000000..2c3669c Binary files /dev/null and b/share/pixmaps/macosx/SliderTrackLeft.png differ diff --git a/share/pixmaps/macosx/SliderTrackRight.png b/share/pixmaps/macosx/SliderTrackRight.png new file mode 100644 index 0000000..acd6f70 Binary files /dev/null and b/share/pixmaps/macosx/SliderTrackRight.png differ _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
