Bug #: 3840
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Aug 2005 03:38:02 +0000 (03:38 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 11 Aug 2005 03:38:02 +0000 (03:38 +0000)
Submitted by: Mitz Pettel <opendarwin.org@mitzpettel.com>
Reviewed by: darin
        * DumpRenderTree/DumpRenderTree.m:
        Added support for rendering to a PNG file.
        http://bugzilla.opendarwin.org/show_bug.cgi?id=3840

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@10133 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/DumpRenderTree.m

index 9a0fc01d659b247a34febf539a9626ac667c664f..c674406a3df1393f62c47d85ebea6c3f586ff3fb 100644 (file)
@@ -1,3 +1,12 @@
+2005-08-10  Eric Seidel  <eseidel@apple.com>
+        Fixed made by Mitz Pettel <opendarwin.org@mitzpettel.com>
+
+        Reviewed by darin.
+
+        * DumpRenderTree/DumpRenderTree.m:
+        Added support for rendering to a PNG file.
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=3840
+
 2005-08-07  Eric Seidel  <eseidel@apple.com>
 
         Reviewed by darin.
index c612ef7a83c9559756bc588b79e7dca31c1edee1..49d77b435db732ed1a5196f404fcb734f7dbc8a5 100644 (file)
@@ -40,6 +40,8 @@
 #import <WebKit/WebPreferences.h>
 #import <WebKit/WebView.h>
 
+#import <getopt.h>
+
 @interface WaitUntilDoneDelegate : NSObject
 @end
 
@@ -57,6 +59,9 @@ static BOOL readyToDump;
 static BOOL waitToDump;
 static BOOL dumpAsText;
 static BOOL dumpTitleChanges;
+static int dumpPixels = NO;
+static int dumpTree = YES;
+static BOOL printSeparators;
 
 int main(int argc, const char *argv[])
 {
@@ -73,7 +78,20 @@ int main(int argc, const char *argv[])
     int defaultFontSize = [preferences defaultFontSize];
     int defaultFixedFontSize = [preferences defaultFixedFontSize];
     int minimumFontSize = [preferences minimumFontSize];
+    int width = 800;
+    int height = 600;
     
+    struct option options[] = {
+        {"width", required_argument, NULL, 'w'},
+        {"height", required_argument, NULL, 'h'},
+        {"bitmap", no_argument, &dumpPixels, YES},
+        {"nobitmap", no_argument, &dumpPixels, NO},
+        {"tree", no_argument, &dumpTree, YES},
+        {"notree", no_argument, &dumpTree, NO},
+        {NULL, 0, NULL, 0}
+    };
+    int option;
+
     [preferences setStandardFontFamily:@"Times"];
     [preferences setFixedFontFamily:@"Courier"];
     [preferences setSerifFontFamily:@"Times"];
@@ -84,7 +102,29 @@ int main(int argc, const char *argv[])
     [preferences setDefaultFixedFontSize:13];
     [preferences setMinimumFontSize:9];
 
-    WebView *webView = [[WebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)];
+    while ((option = getopt_long(argc, (char * const *)argv, "", options, NULL)) != -1)
+        switch (option) {
+            case 'w':
+                width = strtol(optarg, NULL, 0);
+                if (width <= 0) {
+                    fprintf(stderr, "%s: invalid width\n", argv[0]);
+                    exit(1);
+                }
+                break;
+            case 'h':
+                height = strtol(optarg, NULL, 0);
+                if (height <= 0) {
+                    fprintf(stderr, "%s: invalid height\n", argv[0]);
+                    exit(1);
+                }
+                break;
+            case '?':   // unknown or ambiguous option
+            case ':':   // missing argument
+                exit(1);
+                break;
+        }
+    
+    WebView *webView = [[WebView alloc] initWithFrame:NSMakeRect(0, 0, width, height)];
     WaitUntilDoneDelegate *delegate = [[WaitUntilDoneDelegate alloc] init];
     EditingDelegate *editingDelegate = [[EditingDelegate alloc] init];
     [webView setFrameLoadDelegate:delegate];
@@ -92,20 +132,21 @@ int main(int argc, const char *argv[])
     [webView setUIDelegate:delegate];
     frame = [webView mainFrame];
     
-    if (argc == 2 && strcmp(argv[1], "-") == 0) {
+    if (argc == optind+1 && strcmp(argv[optind], "-") == 0) {
         char filenameBuffer[2048];
+        printSeparators = YES;
         while (fgets(filenameBuffer, sizeof(filenameBuffer), stdin)) {
             char *newLineCharacter = strchr(filenameBuffer, '\n');
             if (newLineCharacter) {
                 *newLineCharacter = '\0';
             }
             dumpRenderTree(filenameBuffer);
-            puts("#EOF");
             fflush(stdout);
         }
     } else {
         int i;
-        for (i = 1; i != argc; ++i) {
+        printSeparators = (optind < argc-1 || (dumpPixels && dumpTree));
+        for (i = optind; i != argc; ++i) {
             dumpRenderTree(argv[i]);
         }
     }
@@ -127,19 +168,37 @@ int main(int argc, const char *argv[])
 static void dump(void)
 {
     NSString *result = nil;
-    if (dumpAsText) {
-        DOMDocument *document = [frame DOMDocument];
-        if ([document isKindOfClass:[DOMHTMLDocument class]]) {
-            result = [[[(DOMHTMLDocument *)document body] innerText] stringByAppendingString:@"\n"];
+    if (dumpTree) {
+        if (dumpAsText) {
+            DOMDocument *document = [frame DOMDocument];
+            if ([document isKindOfClass:[DOMHTMLDocument class]]) {
+                result = [[[(DOMHTMLDocument *)document body] innerText] stringByAppendingString:@"\n"];
+            }
+        } else {
+            result = [frame renderTreeAsExternalRepresentation];
         }
-    } else {
-        result = [frame renderTreeAsExternalRepresentation];
+        if (!result) {
+            puts("error");
+        } else {
+            fputs([result UTF8String], stdout);
+        }
+        if (printSeparators)
+            puts("#EOF");
     }
-    if (!result) {
-        puts("error");
-    } else {
-        fputs([result UTF8String], stdout);
+    
+    if (dumpPixels) {
+        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+        WebView *view = [frame webView];
+        NSBitmapImageRep *imageRep = [view bitmapImageRepForCachingDisplayInRect:[view frame]];
+        NSData *imageData;
+        [view cacheDisplayInRect:[view frame] toBitmapImageRep:imageRep];
+        imageData = [imageRep representationUsingType:NSPNGFileType properties:nil];
+        if (printSeparators)
+            printf("%d\n", [imageData length]);
+        fwrite([imageData bytes], 1, [imageData length], stdout);
+        [pool release];
     }
+
     done = YES;
 }