//+----------------------------------------------------------------------------+ //| Description: Magic Set Editor - Program to make Magic (tm) cards | //| Copyright: (C) Twan van Laarhoven and the other MSE developers | //| License: GNU General Public License 2 or later (see file COPYING) | //+----------------------------------------------------------------------------+ // ----------------------------------------------------------------------------- : Includes #include #include #include #include #include #include #include #include #include // ----------------------------------------------------------------------------- : Single card export void export_image(const SetP& set, const CardP& card, const String& filename) { Image img = export_bitmap(set, card).ConvertToImage(); img.SaveFile(filename); // can't use Bitmap::saveFile, it wants to know the file type // but image.saveFile determines it automagicly } class UnzoomedDataViewer : public DataViewer { public: virtual ~UnzoomedDataViewer() {}; Rotation getRotation() const override; private: double angle = 0.0; }; Rotation UnzoomedDataViewer::getRotation() const { if (!stylesheet) stylesheet = set->stylesheet; int export_zoom = settings.stylesheetSettingsFor(set->stylesheetFor(card)).export_zoom(); bool use_viewer_rotation = !settings.stylesheetSettingsFor(set->stylesheetFor(card)).card_normal_export(); if (use_viewer_rotation) { return Rotation(DataViewer::getRotation().getAngle(), stylesheet->getCardRect(), export_zoom, 1.0, ROTATION_ATTACH_TOP_LEFT); } else { return Rotation(angle, stylesheet->getCardRect(), export_zoom, 1.0, ROTATION_ATTACH_TOP_LEFT); } } Bitmap export_bitmap(const SetP& set, const CardP& card) { if (!set) throw Error(_("no set")); // create viewer UnzoomedDataViewer viewer = UnzoomedDataViewer(); viewer.setSet(set); viewer.setCard(card); // size of cards RealSize size = viewer.getRotation().getExternalSize(); // create bitmap & dc Bitmap bitmap((int) size.width, (int) size.height); if (!bitmap.Ok()) throw InternalError(_("Unable to create bitmap")); wxMemoryDC dc; dc.SelectObject(bitmap); // draw viewer.draw(dc); dc.SelectObject(wxNullBitmap); return bitmap; } // ----------------------------------------------------------------------------- : Multiple card export void export_images(const SetP& set, const vector& cards, const String& path, const String& filename_template, FilenameConflicts conflicts) { wxBusyCursor busy; // Script ScriptP filename_script = parse(filename_template, nullptr, true); // Path wxFileName fn(path); // Export std::set used; // for CONFLICT_NUMBER_OVERWRITE FOR_EACH_CONST(card, cards) { // filename for this card Context& ctx = set->getContext(card); String filename = clean_filename(untag(ctx.eval(*filename_script)->toString())); if (!filename) continue; // no filename -> no saving // full path fn.SetFullName(filename); // does the file exist? if (!resolve_filename_conflicts(fn, conflicts, used)) continue; // write image filename = fn.GetFullPath(); used.insert(filename); export_image(set, card, filename); } }