xref: /haiku/src/apps/icon-o-matic/import_export/svg/SVGImporter.cpp (revision c9afad22682e9f15753db4e9ca8684e2d4a643a9)
1 /*
2  * Copyright 2006-2009, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 
9 #include "SVGImporter.h"
10 
11 #include <strings.h>
12 
13 #include <Alert.h>
14 #include <Catalog.h>
15 #include <Entry.h>
16 #include <File.h>
17 #include <Locale.h>
18 #include <MimeType.h>
19 #include <Path.h>
20 
21 #include "DocumentBuilder.h"
22 #include "nanosvg.h"
23 
24 
25 #undef B_TRANSLATION_CONTEXT
26 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-SVGImport"
27 
28 
29 // constructor
30 SVGImporter::SVGImporter()
31 {
32 }
33 
34 // destructor
35 SVGImporter::~SVGImporter()
36 {
37 }
38 
39 // Import
40 status_t
41 SVGImporter::Import(Icon* icon, const entry_ref* ref)
42 {
43 	status_t ret = Init(icon);
44 	if (ret < B_OK) {
45 		printf("SVGImporter::Import() - "
46 			   "Init() error: %s\n", strerror(ret));
47 		return ret;
48 	}
49 
50 	BPath path(ref);
51 	ret = path.InitCheck();
52 	if (ret < B_OK)
53 		return ret;
54 
55 	// Check that it indeed looks like an SVG file
56 	BMimeType type;
57 	ret = BMimeType::GuessMimeType(ref, &type);
58 	if (ret != B_OK || strcmp(type.Type(), "image/svg+xml") != 0) {
59 		printf("not an svg file %s %s\n", strerror(ret), type.Type());
60 		return B_ERROR;
61 	}
62 
63 	NSVGimage* svg = nsvgParseFromFile(path.Path(), "px", 96);
64 	if (svg == NULL) {
65 		char error[1024];
66 		sprintf(error, B_TRANSLATE("Failed to open the file '%s' as "
67 			"an SVG document.\n\n"), ref->name);
68 		BAlert* alert = new BAlert(B_TRANSLATE("Load error"),
69 			error, B_TRANSLATE("OK"), NULL, NULL,
70 			B_WIDTH_AS_USUAL, B_WARNING_ALERT);
71 		alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
72 		alert->Go(NULL);
73 		return B_ERROR;
74 	}
75 
76 	DocumentBuilder builder(svg);
77 	ret = builder.GetIcon(icon, ref->name);
78 	nsvgDelete(svg);
79 
80 	return ret;
81 }
82