libsswf: Bug List

# Bug List

Member sswf::Action::ACTION_WITH
  Note that can also create bugs since you may be accessing the member of an object when you wanted to access a global variable instead.

Member sswf::Action::ACTION_CALL_FRAME
  This tag takes a size of 0 since it does not need any data and yet it has a value over 127.

Member sswf::Action::f_offset
  This offset is not defined until the sswf::Action::Save() function reaches this specific action in its list of actions. This is why there is a sswf::Action::Save2ndPass() so the ActionBranch action can properly calculate forward references.

Member sswf::Action::Save2ndPass (const Vectors &list, Data &data)
  The Data buffer should not be grown by the Save2ndPass(). Instead it should be tweaked (i.e. some bytes overwritten as required.)

Member sswf::ActionBranch::SetLabel (const char *label)
  At this time, we do not verify that the label is unique.

Member sswf::ActionGoto::SetFrameName (const char *frame_name)
  In case of an ACTION_GOTO_LABEL, whether the label exists in the movie is not being tested by the library.

Class sswf::ActionWaitForFrame
  It could be that the ACTION_WAIT_FOR_FRAME and ACTION_WAIT_FOR_FRAME2 should each have its own class since the dynamic version should not be given a frame name (it is taken dynamically!). On the other hand it could be that I could change the code and if you define a frame name then I force the ACTION_WAIT_FOR_FRAME and by default I would use ACTION_WAIT_FOR_FRAME2. In this latter case, I would need a PreSave() to determine the action before to save the result.

Member sswf::Data::GetDoubleFloat (double &f) const
  Note that the double float values saved in a PushData action are NOT loaded with this function. Those doubles are saved swapped instead and thus the PushData class takes care of loading the double floats as required.

Member sswf::Data::PutDoubleFloat (double f)
  Note that the double float values saved in a PushData action are NOT saved with this function. Those doubles are saved swapped instead and thus the PushData class takes care of saving the double floats as required.

Member sswf::Data::PutShortFloat (float f)
  This function assumes that the input floating point is a valid number, not a NaN. Your SWF will work better that way anyway.

Member sswf::Data::Read (const void *&ptr, size_t &size) const
  Warning: this function returns direct access to the internal buffer pointer and size. If any other function is used, it invalidates these pointers. So use them, and forget about them right away!

Member sswf::Data::Read (void *&ptr, size_t &size)
  Warning: this function returns direct access to the internal buffer pointer and size. If any other function is used, it invalidates these pointers. So use them, and forget about them right away!

Member sswf::Envelope::Envelope (unsigned long p, unsigned short l, unsigned short r)
  The Envelope does not know whether the sound it will affect is stereo or mono. This may not be a problem with newer versions of the Macromedia players.

Member sswf::Event::StringToEvents (const char *s)
  At this time, this function asserts() in debug mode when the input string is invalid. There is otherwise no error reported to the caller.

Class sswf::SoundInfo
  This object does not accept 0 as a sound object identifier. No object should have its identifier set to zero anyway.

Member sswf::SoundInfo::SetLoop (unsigned short loop)
  The loop parameter cannot be set to zero.

Member sswf::State::SetFlags (unsigned char flags)
  Flags are defined on the lower 4 bits of the char. Trying to define another bit will generate an assert() in DEBUG mode.

Member sswf::Style::operator== (const Style &style) const
  Try to compare a style of type Style::STYLE_TYPE_UNKNOWN generates an error and returns false.

Member sswf::Style::SetLineJoin (join_t join, float miter_limit_factor=0.0f)
  The miter join limit factor is always saved. The default is 0.0f which will have no effects.

Member sswf::TagBase::TagBase (const char *name, TagBase *parent)
  When creating a child (i.e. the parent pointer is not null) the new child is linked at the end of the existing list of children. At this time, there is no way to change the order of children other than creating a new parent and add all the children in the new order...

Member sswf::TagBase::Double2Signed (double value)
  If the number cannot fit a long, then overflows will happen.

Member sswf::TagBase::Double2Signed16 (double value)
  If the number cannot fit a long, then overflows will happen.

Member sswf::TagBase::FindLabel (const TagBase *p, const char *label) const
  This function is slow.

Member sswf::TagBase::Label (void) const
  The pointer returned is the copy kept by the object. DO NOT MODIFY IT!

Member sswf::TagBase::Name (void) const
  The name is not copied. DO NOT MODIFY IT!

Member sswf::TagBase::SaveTag (Data &data, swf_tag_t tag, size_t size)
  This function has no concept of the tag being saved and thus it does not check the validity of the tag nor of the size for that tag.

Member sswf::TagBase::SetLabel (const char *label)
  The system does not search the existing tree to know whether the specified label is already in use (for speed reasons). It is expected that the developer using the SSWF library knows how to avoid reusing the same name.

Member sswf::TagBinaryData::GetData (const char *&data, size_t &size) const
  Do NOT free the memory buffer returned to you. The TagBinaryData is responsible for that task. If you want to free the buffer, call the SetData() function with a size of zero and any data pointer.

Member sswf::TagBinaryData::GetData (const char *&data, size_t &size) const
  Also, do NOT use the pointer and size returned by this function after calling the SetData() function since the buffer is likely to move.

Member sswf::TagButton::AddEvent (Event *event)
  If you add actions using SetAction() or Actions(), then they will be prepended to the first event that has the Event::CONDITION_POINTER_RELEASE_INSIDE flag turned on. If no event has that flag set, then these actions are appended at the end of the list with that condition.

Member sswf::TagButton::SetState (const State &state)
  If you create a state and omit to set a valid set of flags (i.e. not zero and only the 4 allowed flags) then this function fails.

Member sswf::TagEditText::SetBorder (bool status=true)
  If your text is white, it will not show up.

Member sswf::TagEditText::SetFont (const TagFont *font, long height)
  Note that if the font is a system font then the height has to be in system font metrics (such as 14 for a 14 points font.) When the font is an embedded font, then the height is taken in Twips.

Member sswf::TagEditText::SetUsedGlyphs (const char *lists)
  This glyphs marked in used must be marked as such after the PreSave() function of the corresponding TagFont is called. For this reason, we must saved this information here.

Member sswf::TagHeader::GetFactory (TagBase::swf_tag_t tag) const
  Do not forget that the libsswf is not thread safe. In other words, if you register a new factory while the Load() function is running will cause crashes.

Member sswf::TagImage::Save (Data &data)
  At this time, the function does not support LOSSLESS8.

Member sswf::TagPlace::SetClip (int depth)
  The depth and clipping depth are hard coded and thus this feature is not that practical to use.

Member sswf::TagPlace::SetName (const char *name)
  By default, setting a name will have the effect of hiding the sprite being named. You need to call the TagPlace::Replace() function to get the correct behavior. This is yet another trick in the Flash players...

Member sswf::TagShape::ParseAlignZone (const Data &data)
  At this time I assume that the rectangle has to be defined in TWIPS. This means each coordinate is divided by 20 before being saved. That seems to correspond to what the documentation says, but the exact type of coordinate is not really defined.

Member sswf::TagShape::SaveAlignZone (Data &data) const
  At this time I assume that the rectangle has to be defined in TWIPS. This means each coordinate is divided by 20 before being saved. That seems to correspond to what the documentation says, but the exact type of coordinate is not really defined.

Member sswf::TagShape::SetBounds (int index, const SRectangle &rect, bool show=false)
  The show bounds feature does not work for a shape used as the hit test of a button or in a glyph.

Member sswf::TagShape::SetNonScalingStrokes (bool has_non_scaling_strokes)
  This needs to be done dynamically whenever we save the shapes.

Member sswf::TagShape::SetScalingStrokes (bool has_scaling_strokes)
  This needs to be done dynamically whenever we save the shapes.

Member sswf::TagShape::ShowBounds (bool show=true)
  The show bounds feature does not work for a shape used as the hit test of a button or in a glyph.

Member sswf::TagShape::ShowOrigin (bool show=true)
  The show origin feature does not work for a shape used as the hit test of a button or in a glyph.

Member sswf::Vectors::~Vectors ()
  This function does not clean up what is pointed to by this vector. It only clears the vector itself.

Member sswf::wcname (sswf_ucs4_t wc, char *result)
  This function takes a string where the result is saved without any safeguards (i.e. it uses sprintf() on that buffer).

Member g_list_of_factories
  The map is never released, but it is only allocated once.

Member RegisterFactory
  The function does not record all the factories. It cannot know when a factory has a priority equal to another factory. If that happens the first factory that was registered is kept. In other words, if two factories have priority 1, no errors are generated.

Member UnregisterFactory
  The idea is to avoid bugs whenever a factory object is deleted (in case someone creates dynamic factories.) The problem is that since only that one factory will have been registered, the previous level (lower priority) is not available and thus that tag cannot be loaded anymore until a new factory is created for it.