Bug #: 4157
[WebKit-https.git] / WebKitTools / DrawTest / SVGTest.m
1 /*
2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import "SVGTest.h"
27
28 #import <WebCore+SVG/DrawView.h>
29 #import <WebCore+SVG/DrawDocument.h>
30
31 @implementation SVGTest
32
33 + (id)testWithSVGPath:(NSString *)svgPath imagePath:(NSString *)imagePath
34 {
35     SVGTest *test = [[self alloc] initWithSVGPath:svgPath imagePath:imagePath];
36     return [test autorelease];
37 }
38
39 static DrawView *__sharedDrawView = nil;
40 + (DrawView *)sharedDrawView
41 {
42     if (!__sharedDrawView) {
43         __sharedDrawView = [[DrawView alloc] initWithFrame:NSMakeRect(0,0,0,0)];
44     }
45     return __sharedDrawView;
46 }
47
48 - (id)initWithSVGPath:(NSString *)svgPath imagePath:(NSString *)imagePath
49 {
50     if (self = [super init]) {
51         _svgPath = [svgPath copy];
52         _imagePath = [imagePath copy];
53     }
54     return self;
55 }
56
57 - (NSString *)imagePath
58 {
59     return _imagePath;
60 }
61
62 - (NSString *)svgPath
63 {
64     return _svgPath;
65 }
66
67 - (NSImage *)image
68 {
69     if (!_image && _imagePath) {
70         _image = [[NSImage alloc] initByReferencingFile:_imagePath];
71     }
72     return _image;
73 }
74
75 - (DrawDocument *)svgDocument
76 {
77     if (!_svgDocument && _svgPath) {
78         _svgDocument = [[DrawDocument alloc] initWithContentsOfFile:_svgPath];
79     }
80     return _svgDocument;
81 }
82
83 - (NSString *)name
84 {
85     NSMutableString *name = [[[[_svgPath lastPathComponent] stringByDeletingPathExtension] mutableCopy] autorelease];
86     [name replaceOccurrencesOfString:@"_" withString:@" " options:0 range:NSMakeRange(0, [name length])];
87     return [name capitalizedString];
88 }
89
90 - (void)generateCompositeIfNecessary
91 {
92     if (!_compositeImage) {
93         DrawView *view = [SVGTest sharedDrawView];
94         [view setDocument:[self svgDocument]];
95         [view sizeToFitViewBox];
96         NSSize svgSize = [view bounds].size;
97         
98         NSImage *image = [self image];
99         NSSize imageSize = [image size];
100         
101         NSBitmapImageRep *svgImage = [view bitmapImageRepForCachingDisplayInRect:[view bounds]];
102         [view cacheDisplayInRect:[view bounds] toBitmapImageRep:svgImage];
103         
104         NSSize unionSize = NSMakeSize(MAX(svgSize.width, imageSize.width), MAX(svgSize.height, imageSize.height));
105         _compositeImage = [[NSImage alloc] initWithSize:unionSize];
106         
107         [_compositeImage lockFocus];
108         [svgImage drawInRect:NSMakeRect(0,0,svgSize.width,svgSize.height)];
109         [image drawInRect:NSMakeRect(0,0,imageSize.width,imageSize.height)
110                 fromRect:NSMakeRect(0,0,imageSize.width,imageSize.height)
111                  operation:NSCompositeXOR fraction:1.0];
112         [_compositeImage unlockFocus];
113     }
114 }
115
116 - (NSImage *)compositeImage
117 {
118     [self generateCompositeIfNecessary];
119     return _compositeImage;
120 }
121
122
123 @end