diff options
| author | Steven Fuller <relnev@icculus.org> | 2001-07-01 00:55:22 +0000 |
|---|---|---|
| committer | Patryk Obara <dreamer.tan@gmail.com> | 2019-08-20 02:09:04 +0200 |
| commit | 2186d5f3f95cd74a070a490d899291648d58667a (patch) | |
| tree | 55241a1afa3e1a22e0b6593a8dead0b703800f44 /src/win95/txioctrl.cpp | |
| parent | 218ca90543758a20ac326e444ca0643174ca7384 (diff) | |
Initial revision
Diffstat (limited to 'src/win95/txioctrl.cpp')
| -rw-r--r-- | src/win95/txioctrl.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/win95/txioctrl.cpp b/src/win95/txioctrl.cpp new file mode 100644 index 0000000..53aded5 --- /dev/null +++ b/src/win95/txioctrl.cpp @@ -0,0 +1,110 @@ +#include "txioctrl.h" + +#ifdef MaxImageGroups + +#include "list_tem.hpp" + +struct ImageNumber +{ + int group; + int offset; + + ImageNumber(){} + ImageNumber(int g,int o) : group(g), offset(o) {} + + inline int operator == (ImageNumber const & in2) const + { return group==in2.group && offset==in2.offset; } + inline int operator != (ImageNumber const & in2) const + { return ! operator == (in2); } +}; + +static List<ImageNumber> imgs_used_by_group[MaxImageGroups]; + +static List<int> * grps_used_by_image[MaxImageGroups][MaxImages]; + +void MarkImageInUseByGroup(int img_group, int img_num_offset, int group_using) +{ + if (imgs_used_by_group[group_using].contains(ImageNumber(img_group,img_num_offset))) return; + + imgs_used_by_group[group_using].add_entry(ImageNumber(img_group,img_num_offset)); + + List<int> * & grps_used_by_imageR = grps_used_by_image[img_group][img_num_offset]; + + if (!grps_used_by_imageR) + grps_used_by_imageR = new List<int>(img_group); // includes itself + + if (!grps_used_by_imageR->contains(group_using)) + grps_used_by_imageR->add_entry(group_using); +} + +int IsImageInUse(int img_group, int img_num_offset) +{ + if (grps_used_by_image[img_group][img_num_offset]) + return 1; + else + return 0; +} + +int CanDeleteImage(int img_group, int img_num_offset) +{ + if (grps_used_by_image[img_group][img_num_offset]) + { + if (grps_used_by_image[img_group][img_num_offset]->contains(img_group)) + { + grps_used_by_image[img_group][img_num_offset]->delete_entry(img_group); // remove itself + if (!grps_used_by_image[img_group][img_num_offset]->size()) + { + delete grps_used_by_image[img_group][img_num_offset]; + grps_used_by_image[img_group][img_num_offset] = 0; + return 1; + } + else + return 0; + } + else + return 0; + } + else + return 1; +} + +void ImageGroupFreed(int img_group) +{ + while (imgs_used_by_group[img_group].size()) + { + ImageNumber used = imgs_used_by_group[img_group].first_entry(); + + List<int> * & grps_used_by_imageR = grps_used_by_image[used.group][used.offset]; + + grps_used_by_imageR->delete_entry(img_group); + + if (!grps_used_by_imageR->size()) + { + NowDeleteImage(used.group,used.offset); + delete grps_used_by_imageR; + grps_used_by_imageR = 0; + } + + imgs_used_by_group[img_group].delete_first_entry(); + } +} + +void EnumSharedImages(int group_num, int numimages, ImageNumberCallbackFunction callback_fn, void * user) +{ + for (int i=0; i<numimages; ++i) + { + if (grps_used_by_image[group_num][i]) + callback_fn(i,user); + } +} + +void EnumLeftoverImages(int group_num, int numimages, ImageNumberCallbackFunction callback_fn, void * user) +{ + for (int i=numimages; i<MaxImages; ++i) + { + if (grps_used_by_image[group_num][i]) + callback_fn(i,user); + } +} + +#endif // MaxImageGroups |
