SVGを埋め込めた
mxmlcでコンパイルしたSWFをDashcodeプロジェクトに取り込んで、wmodeをtransparentにすると表示がおかしくなる。
本来はアルファチャンネルも含めてクリアしなければならないピクセルに、何も考えずに上書きルーチンを呼び出してブレンドしてしまうようだ。Flashから書き出したSWFならそんな事は無いのだけど。
AIRアプリケーションとして実行すれば問題ないので、おそらくWebKitの問題だろう。
念の為にWebViewを貼付けただけのCocoa Applicationで背景に透明色を指定してHTMLとSWFを読み込ませてみたら、ちゃんと実行された*1。SVGの件もあるし、どうもDashboard/DashcodeにリンクされているWebKitは若干古いんじゃなかろうか。
ならば、新しいWebKitをロードすればいい。
と言ってもDashboardをハックする腕は無いので、プラグインという形をとる事にした。
適当なMIMEタイプに対応するインターネットプラグインのViewにWebViewを貼付けてビルド。
Dashcodeでプラグインを取り込んで、「メインに指定されているHTML」に上述のMIMEタイプで「SWFを埋め込んだHTML」を埋め込む。
これで問題なく透過背景なFlashが動くWidgetが作れた。以前頓挫したSVGの埋め込みもこれで解決。
以下コード。
コード
プラグインのメインになるViewには直接WebViewを継承しておく。
- (id)_initWithArguments:(NSDictionary *)newArguments { if (!(self = [super initWithFrame:NSZeroRect])) return nil; [[[self mainFrame] frameView] setAllowsScrolling:NO]; [self setBackgroundColor:[NSColor clearColor]]; NSURL* baseURL = [newArguments valueForKey:WebPlugInBaseURLKey]; DOMHTMLElement* containingElement = [newArguments valueForKey:WebPlugInContainingElementKey]; NSString* string = nil; if ( [containingElement.tagName isEqualToString:@"OBJECT"] ) { string = ((DOMHTMLObjectElement*)containingElement).data; } else if ( [containingElement.tagName isEqualToString:@"EMBED"] ) { string = ((DOMHTMLEmbedElement*)containingElement).src; } [[self mainFrame] loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:string relativeToURL:baseURL ]]]; return self; }
*1:陰がおかしかったりはしたけど