175584Sru/* 275584Sru * Copyright 2006-2009, Haiku, Inc. All rights reserved. 375584Sru * Distributed under the terms of the MIT License. 475584Sru * 575584Sru * Authors: 675584Sru * Stephan A��mus <superstippi@gmx.de> 775584Sru */ 875584Sru 975584Sru#include "SVGImporter.h" 1075584Sru 1175584Sru#include <strings.h> 1275584Sru 1375584Sru#include <Alert.h> 1475584Sru#include <Catalog.h> 1575584Sru#include <Entry.h> 1675584Sru#include <File.h> 1775584Sru#include <Locale.h> 1875584Sru#include <MimeType.h> 1975584Sru#include <Path.h> 2075584Sru 2175584Sru#include "DocumentBuilder.h" 2275584Sru#include "nanosvg.h" 2375584Sru 2475584Sru 2575584Sru#undef B_TRANSLATION_CONTEXT 2675584Sru#define B_TRANSLATION_CONTEXT "Icon-O-Matic-SVGImport" 2775584Sru 2875584Sru 2975584Sru// constructor 3075584SruSVGImporter::SVGImporter() 3175584Sru{ 3275584Sru} 3375584Sru 3475584Sru// destructor 3575584SruSVGImporter::~SVGImporter() 3675584Sru{ 3775584Sru} 3875584Sru 3975584Sru// Import 4075584Srustatus_t 4175584SruSVGImporter::Import(Icon* icon, const entry_ref* ref) 4275584Sru{ 4375584Sru status_t ret = Init(icon); 4475584Sru if (ret < B_OK) { 4575584Sru printf("SVGImporter::Import() - " 4675584Sru "Init() error: %s\n", strerror(ret)); 4775584Sru return ret; 4875584Sru } 4975584Sru 5075584Sru BPath path(ref); 5175584Sru ret = path.InitCheck(); 5275584Sru if (ret < B_OK) 5375584Sru return ret; 5475584Sru 5575584Sru // Check that it indeed looks like an SVG file 5675584Sru BMimeType type; 5775584Sru ret = BMimeType::GuessMimeType(ref, &type); 5875584Sru if (ret != B_OK || strcmp(type.Type(), "image/svg+xml") != 0) { 5975584Sru printf("not an svg file %s %s\n", strerror(ret), type.Type()); 6075584Sru return B_ERROR; 6175584Sru } 6275584Sru 6375584Sru NSVGimage* svg = nsvgParseFromFile(path.Path(), "px", 96); 6475584Sru if (svg == NULL) { 6575584Sru char error[1024]; 6675584Sru sprintf(error, B_TRANSLATE("Failed to open the file '%s' as " 6775584Sru "an SVG document.\n\n"), ref->name); 6875584Sru BAlert* alert = new BAlert(B_TRANSLATE("Load error"), 6975584Sru error, B_TRANSLATE("OK"), NULL, NULL, 7075584Sru B_WIDTH_AS_USUAL, B_WARNING_ALERT); 7175584Sru alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); 7275584Sru alert->Go(NULL); 7375584Sru return B_ERROR; 7475584Sru } 7575584Sru 7675584Sru DocumentBuilder builder(svg); 7775584Sru ret = builder.GetIcon(icon, ref->name); 7875584Sru nsvgDelete(svg); 7975584Sru 8075584Sru return ret; 8175584Sru} 8275584Sru