前回のウィンドウサイズを大きくする件、横幅は画面をはみ出す場合でも大丈夫だった。
縦の高さだけがメニューバーとドックの制約を受ける。
試しに Info.plist の LSUIPresentationMode を設定し、メニューバーとDockを消して見る。
なお Xcodeではなぜか Normal(0)以外の値を設定できなかった。別のエディタで開き All suppressed(4) を設定した。
実行するが変わらず。メニューバーと DocKは消えたがその分拡大できただけで画面のサイズ以上には高さが広がらない。
方法をがみつからない。
うーむ。
2009年5月2日土曜日
WebKit検証(18) - Flash#8 ウィンドウを大きく
2009年5月1日金曜日
WebKit検証(17) - Flash#7 WebViewウィンドウをリサイズしてキャプチャ
さて実際にウィンドウをWebサイトの大きさにリサイズし、それをキャプチャしてみよう。
ウィンドウリサイズのコードを追加する。
// (2) resize window
NSView* view = [[[_web_view mainFrame] frameView] documentView];
NSRect document_bounds = [view bounds];
NSRect original_window_frame = [_window frame];
NSRect new_window_frame = original_window_frame;
new_window_frame.size = document_bounds.size;
new_window_frame.size.height += 100;
new_window_frame.size.width += 60;
[_window setFrame:new_window_frame
display:YES
animate:YES];
ページを表示させて「Capture」ボタンを押す。

ウィンドウがリサイズされて Webサイトの大きさになった。。と思いきや Dockに引っかかり高さが制限されてしまった。

そういえば SnapWebは起動/終了時に Dockが一時的に消える奇妙な動作をしていた。このあたり何かシステム設定を変えているのだろうか?
2009年4月30日木曜日
WebKit検証(16) - Flash#6 Webサイトページの表示サイズ
WebViewで表示している Webサイトページの表示サイズはどこから取得できるだろうか?デバッグにサイズを表示して確認してみたところ、どうもメインフレーム配下の NSDocumentView から取得できるようだ。
NSView* view = [[[_web_view mainFrame] frameView] documentView];
NSRect rect = [view bounds];
NSLog(@"%@", NSStringFromRect(rect));
実行して試してみると、このサイズでも

このサイズでも

サイズは変わらなかった。大きさもそれっぽい。
[Session started at 00:58:31 +0900.]
00:58:51.595 WebKitSample[923:10b] {{0, 0}, {984, 938}}
00:59:05.908 WebKitSample[923:10b] {{0, 0}, {984, 938}}
これを使わせてもらおう。
2009年4月29日水曜日
WebKit検証(15) - Flash#5 ウィンドウキャプチャ
先日の SnapWeb に刺激され(?)ウィンドウキャプチャ方式のアプローチを試してみる (*)。
(*) 実際に SnapWebがこの方法をとっているかは不明
サンプルに「Capture」ボタンをつけて、AppController#capture: へ接続する。実装はこんな感じ。
{
// (1) setup filename
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDesktopDirectory, NSUserDomainMask, YES);
NSString* path = [NSString stringWithFormat:@"%@/test.png",
[paths objectAtIndex:0], nil];
// (2) capture
CGWindowID *windowIDs = calloc(1, sizeof(CGWindowID));
windowIDs[0] = [_window windowNumber];
CFArrayRef windowIDsArray =
CFArrayCreate(kCFAllocatorDefault, (const void**)windowIDs, 1, NULL);
CGImageRef cgimage =
CGWindowListCreateImageFromArray(
CGRectNull, windowIDsArray, kCGWindowImageBoundsIgnoreFraming);
NSBitmapImageRep *bitmap_rep =
[[[NSBitmapImageRep alloc] initWithCGImage:cgimage] autorelease];
NSData* data = [bitmap_rep representationUsingType:NSPNGFileType
properties:[NSDictionary dictionary]];
[data writeToFile:path atomically:YES];
CGImageRelease(cgimage);
free(windowIDs);
CFRelease(windowIDsArray);
}キャプチャの方法は昨年来紹介しているので必要なら過去のブログを参照してみて欲しい。私の場合、SimpleCapのコードからコピー&ペーストで5分ぐらいでできた(手抜き)。
さあ実行してみよう。Flashを含むページを開き「Capture」ボタンを押す。

出た。

ウィンドウを大きくすれば(当たり前だが)より大きな範囲をキャプチャできる。

理論上は、ウィンドウを Webサイトが表示できる十分な大きさまで広げてキャプチャすれば、Webサイト表示全体の画像が作れるわけだ。
サンプル:WebKitSample-2.zip
お膳立てはできた。
(続く)
2009年4月28日火曜日
本 - ObjC/iPhone関連2点
本屋へ行くとまたまたObjc/iPhone関連の新刊が出ていた。
木下さんによる Objective-C本。これはネットの連載に加筆して出版したもの。連載はたまに読んで参考にさせてもらっていた。
こちらは「Cocoaはやっぱり」で有名な鶴薗さんによる iPhone本。立ち読みした感じでは図が多く(おなじみの?シーケンス図も健在)わかりやすそうな印象を受けた。Amazonの評価も1件だけだが高い。
2009年4月27日月曜日
WebKit検証(14) - Flash#4
WebKit の Flashの問題で情報を探しているとこんなソフトを見つけた。
Brain Tickling Software - SnapWeb
"The internet snapshot and archiving utility"

試してみよう。
起動すると簡易ブラウザが立ち上がる。
Flashを含むページを表示する。
Saveボタンを押す。少し間がありファイルが作成された。色や内容がきちんと再現できている。
いろいろオプションもある。
- - - -
なんだかやりたいことがこのソフトで
すべて実現できているような。
なおソフトの動きで気になることが2点あった。
一つは、ブラウザ部分と、その枠の部分が別のウィンドウになっていたこと。
もう一つは、Save時にどうも screencaptureコマンドが動作していること。
この2つから類推するに、もしかしてブラウザ部分のウィンドウをサイトの表示ができる最大サイズまで拡大し、それを screencaptureコマンドで撮影しているのでは?だとしたらかなりユニーク、というか荒技だ。でも再現性という意味では確実かもしれない。ちょっと試してみたいな。
2009年4月26日日曜日
SimpleCap調整(範囲選択サイズ指定のコンテキストメニュー移動)#2
さて用意したメニューのプレースホルダーにプリセットされた範囲選択サイズを設定する。
QuickConfigのメニューは、範囲選択処理を司る SelectionHandler がボタンが押されたら反応し、上位のCaptureController に開いてもらっている。これは Nib内のインスタンスを上位のコントローラで保持しているため。そんなこともあるので(少しややこしいが)CaptureControllerから再び SelectionHandlerをコールバックし、ここでプレースホルダーへプリセットサイズを設定することにする。
QuickConfigボタン押下
↓
SelectionHandler
↓
CaptureContorller#openSelectionConfigMenuWithView:event:
↓
SelectionHandler#setupQuickConfigMenu:(NSMenu*)menu
SelectionHandler#setupQuickConfigMenu: で InterfaceBuilderで用意しておいたメニューが渡されるので、この中からプレースホルダー用の NSMenuItemを見つけて置き換えれば良い。NSMenuItemを特定するには Tag か Titleで判断する。今回はあらかじめ InterfaceBuilderで Tagを1〜5(他は0)に設定しておいたのでこれでプレースホルダーのNSMenuItemを判定する。コードはこんな感じ。
- (void)setupQuickConfigMenu:(NSMenu*)menu
{
// [super setupQuickConfigMenu:menu];
NSMenuItem* item;
NSString* title;
item = [menu itemWithTag:1];
title = [self sizeTitleWithNameKey:UDKEY_SELECTION_NAME1
widthKey:UDKEY_SELECTION_WIDTH1
heightKey:UDKEY_SELECTION_HEIGHT1];
[item setTitle:title];
[item setAction:@selector(selectSize:)];
[item setTarget:self];
:
可変の仕組みではないのでベタな作りだが。。ここは元々コンテキストメニューで使っていたコードをコピーしただけ。
さて動かしてみよう。

出た。
