wxMaxima
Loading...
Searching...
No Matches
AnimationCell.h
Go to the documentation of this file.
1// -*- mode: c++; c-file-style: "linux"; c-basic-offset: 2; indent-tabs-mode: nil -*-
2//
3// Copyright (C) 2007-2015 Andrej Vodopivec <andrej.vodopivec@gmail.com>
4// (C) 2014-2016 Gunter Königsmann <wxMaxima@physikbuch.de>
5//
6// This program is free software; you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation; either version 2 of the License, or
9// (at your option) any later version.
10//
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15//
16//
17// You should have received a copy of the GNU General Public License
18// along with this program; if not, write to the Free Software
19// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20//
21// SPDX-License-Identifier: GPL-2.0+
22
29#ifndef ANIMATIONCELL_H
30#define ANIMATIONCELL_H
31
32#include "Cell.h"
33#include "Image.h"
34#include "ImgCellBase.h"
35#include <memory>
36#include <wx/image.h>
37#include <wx/timer.h>
38
39#include <wx/fs_arc.h>
40#include <wx/mstream.h>
41#include <wx/wfstream.h>
42
43#include <vector>
44
45class AnimationCell final : public ImgCellBase
46{
47public:
60 const wxString &wxmxFile, double framerate = -1);
61 AnimationCell(GroupCell *group, Configuration *config, double framerate = -1);
64 AnimationCell(GroupCell *group, Configuration *config, const wxMemoryBuffer &image, const wxString &type);
65 AnimationCell(GroupCell *group, Configuration *config, const wxString &image, bool remove);
66 std::unique_ptr<Cell> Copy(GroupCell *group) const override;
67 void operator=(const AnimationCell&) = delete;
68 AnimationCell(const AnimationCell&) = delete;
69
70 void SetConfiguration(Configuration *config) override;
71 int GetPPI() const override {if(IsOk()) return m_images.at(m_displayed)->GetPPI(); else return 0;}
72 size_t GetOriginalWidth() const override {
73 if(IsOk())return m_images.at(m_displayed)->GetOriginalWidth(); else return 0;}
74 size_t GetOriginalHeight() const override {
75 if(IsOk())return m_images.at(m_displayed)->GetOriginalHeight(); else return 0;}
78 void TallyImageLoadFailures(int &dataUnavailable, int &decodeFailed) const override {
79 for (const auto &image : m_images) {
80 if (!image) continue;
81 switch (image->GetLoadFailureKind()) {
82 case Image::LoadFailureKind::DataUnavailable: dataUnavailable++; break;
83 case Image::LoadFailureKind::DecodeFailed: decodeFailed++; break;
84 default: break;
85 }
86 }
87 }
88 wxString GetExtension() const override
89 { if (IsOk())return m_images.at(m_displayed)->GetExtension(); else return wxEmptyString; }
90
91 const CellTypeInfo &GetInfo() override;
92 virtual ~AnimationCell();
93 int Length() const {return m_images.size();}
94 void LoadImages(wxMemoryBuffer imageData);
95 void LoadImages(wxString imageFile);
97 void SetPPI(int ppi) override;
99 static wxDataFormat m_gifFormat;
100
102 bool CanExportSVG() const override {return (m_images.at(m_displayed) != nullptr) && m_images.at(m_displayed)->CanExportSVG();}
103
105 class GifDataObject : public wxCustomDataObject
106 {
107 public:
108 explicit GifDataObject(const wxMemoryOutputStream &str);
109
111
112 private:
113 wxCharBuffer m_databuf;
114 };
115
116 bool IsOk() const;
117
118 const wxString GetToolTip(wxPoint point) const override;
119
125 void ClearCache() override;
126
127 void LoadImages(wxArrayString images, bool deleteRead);
128
129 int GetDisplayedIndex() const { return m_displayed; }
130
131 wxImage GetBitmap(int n) const
132 { return m_images.at(n)->GetUnscaledBitmap().ConvertToImage(); }
133
134 void SetDisplayedIndex(int ind);
135
137 wxSize ToImageFile(wxString file) override;
138
140 wxSize ToGif(wxString file);
141
142 bool CopyToClipboard() const override;
143
146
152 double GetFrameRate() const;
153
158 void ReloadTimer();
159
164 void StopTimer();
165
171 double SetFrameRate(double Freq);
172
173 bool AnimationRunning() const { return m_animationRunning; }
174 void AnimationRunning(bool run);
175 void ToggleAnimationRunning(){AnimationRunning(!AnimationRunning());}
176 bool CanPopOut() const override
177 { return m_images.at(m_displayed) && (m_images.at(m_displayed)->HasGnuplotSource()); }
178
179 void GnuplotSource(int image, wxString gnuplotFilename, wxString dataFilename,
180 const wxString &wxmxFile)
181 { m_images.at(image)->GnuplotSource(std::move(gnuplotFilename),
182 std::move(dataFilename), wxmxFile); }
183 void CompressedGnuplotSource(int image, wxString gnuplotFilename, wxString dataFilename,
184 const wxString &wxmxFile)
185 { m_images.at(image)->CompressedGnuplotSource(std::move(gnuplotFilename),
186 std::move(dataFilename),
187 wxmxFile); }
188
189 wxString GnuplotSource() const override
190 {
191 if (!m_images.at(m_displayed))
192 return wxEmptyString;
193 else
194 return m_images.at(m_displayed)->GnuplotSource();
195 }
196
197private:
198 ViewCellPointers *const m_viewCellPointers = GetViewCellPointers(); // must come before m_timer (!)
199 std::unique_ptr<wxTimer> m_timer;
200 std::vector<std::shared_ptr<Image>> m_images;
201
208 double m_framerate = -1;
209 int m_displayed = 0;
210 int m_imageBorderWidth = 0;
211
212//** Bitfield objects (1 bytes)
213//**
214 bool m_animationRunning : 1 = true;
215 bool m_drawBoundingBox : 1 = false;
216 wxString m_wxmxFile;
217
218 int GetImageBorderWidth() const override { return m_imageBorderWidth; }
219
220 void Recalculate(const AFontSize fontsize) const override;
221
223 void SetCurrentPoint(wxPoint point) const override;
224 void Draw(wxDC *dc, wxDC *antialiassingDC) override;
225
226 wxString ToMatlab() const override;
227 wxString ToMathML() const override;
228 wxString ToRTF() const override;
229 wxString ToString() const override;
230 wxString ToTeX() const override;
231 wxString ToXML() const override;
232
233 wxCoord GetMaxWidth() const override;
234 wxCoord GetHeightList() const override { return m_height; }
235 void SetMaxWidth(wxCoord width) override;
236 void SetMaxHeight(wxCoord height) override;
237
238 void DrawBoundingBox(wxDC &WXUNUSED(dc), bool WXUNUSED(all) = false) override
239 { m_drawBoundingBox = true; }
240};
241
242#endif // ANIMATIONCELL_H
The definition of the base class of all cells the worksheet consists of.
This file declares the class Image.
int group
Neighbouring sections of the same group aren't separated.
Definition: ToolBarSections.cpp:45
A Type-Safe Fixed-Point Font Size.
Definition: FontAttribs.h:99
A Gif object for the clipboard.
Definition: AnimationCell.h:106
Definition: AnimationCell.h:46
wxString GetExtension() const override
Returns the file name extension that matches the image type.
Definition: AnimationCell.h:88
bool CopyToClipboard() const override
Copies the cell to the system's clipboard.
Definition: AnimationCell.cpp:543
void ClearCache() override
Remove all cached scaled images from memory.
Definition: AnimationCell.cpp:531
AnimationCell(GroupCell *group, Configuration *config, const wxMemoryBuffer &image, const wxString &type)
A constructor that loads the compressed file from a wxMemoryBuffer.
bool CanPopOut() const override
Can this cell be popped out interactively in gnuplot?
Definition: AnimationCell.h:176
double SetFrameRate(double Freq)
Set the frame rate of this AnimationCell [in Hz].
Definition: AnimationCell.cpp:156
wxSize ToGif(wxString file)
Exports the whole animation as animated gif.
Definition: AnimationCell.cpp:493
void SetPPI(int ppi) override
Set the animation's resolution.
Definition: AnimationCell.cpp:409
wxSize ToImageFile(wxString file) override
Exports the image the animation currently displays.
Definition: AnimationCell.cpp:415
wxString GnuplotSource() const override
The name of the file with gnuplot commands that created this file.
Definition: AnimationCell.h:189
void StopTimer()
Stops the timer.
Definition: AnimationCell.cpp:141
std::unique_ptr< Cell > Copy(GroupCell *group) const override
Create a copy of this cell.
void ReloadTimer()
Reload the animation timer starting and instantiating and registering it if necessary.
Definition: AnimationCell.cpp:130
bool CopyAnimationToClipboard()
Put the animation on the clipboard.
Definition: AnimationCell.cpp:569
double GetFrameRate() const
Get the frame rate of this AnimationCell [in Hz].
Definition: AnimationCell.cpp:112
const CellTypeInfo & GetInfo() override
Returns the information about this cell's type.
void SetConfiguration(Configuration *config) override
Tell this cell to use the configuration object config.
Definition: AnimationCell.cpp:98
void TallyImageLoadFailures(int &dataUnavailable, int &decodeFailed) const override
Unlike GetOriginalWidth()/Height(), this tallies EVERY frame, not just the one currently displayed.
Definition: AnimationCell.h:78
const wxString GetToolTip(wxPoint point) const override
Returns the ToolTip this cell provides at a given point.
Definition: AnimationCell.cpp:482
static wxDataFormat m_gifFormat
A class that publishes wxm data to the clipboard.
Definition: AnimationCell.h:99
bool CanExportSVG() const override
Can the current image be exported in SVG format?
Definition: AnimationCell.h:102
A class that carries information about the type of a cell.
Definition: Cell.h:93
CachedInteger< wxCoord > m_height
The height of this cell.
Definition: Cell.h:1212
virtual void SetCurrentPoint(wxPoint point) const
Pass 2: Arrangement.
Definition: Cell.cpp:526
ViewCellPointers * GetViewCellPointers() const
The transient view-state half of the cell-pointer registry this cell uses.
Definition: Cell.cpp:73
The configuration storage for the current worksheet.
Definition: Configuration.h:100
A cell grouping input (and, if there is one, also the output) cell to a foldable item.
Definition: GroupCell.h:88
@ DecodeFailed
Data was read fine and a decoder exists for the format (or it's an SVG, parsed by our own vendored co...
@ DataUnavailable
Raw data could never be obtained at all (file not found, empty wxmx entry, ...). Always a real failur...
Definition: ImgCellBase.h:42
The view/interaction half of the cell-pointer registry.
Definition: CellPointers.h:258