[h=1]گذری بر قالب فایل SWF - قسمت اول[/h] فرمت فایل SWF (که به صورت سویف یا swif تلفظ میشود) در حال حاضر یکی از تکنولوژیهای قدرتمند شرکت Adobe است که برای نمایش محتوای برداری، متن، ویدئو و صوت مورد استفاده قرار میگیرد. پیدایش این تکنولوژی در دهه 1990 و در شرکت FutureWave به وقوع پیوست که در سال 1996 توسط شرکت Macromedia خریداری شد، اکنون نیز مدت زیادی از تصاحب Macromedia توسط Adobe میگذرد. البته اگر از حق نگذریم، شرکت Adobe با استفاده از تجربیات بسیار زیادی که در صنعت نرمافزارهای گرافیکی داشت، تکنولوژی SWF را متحول کرد. اگر مطلع باشید، فناوری مورد استفاده در فایلهای SWF، در سال 2008 توسط شرکت Adobe در قالب پروژه OpenScreen منتشر و License آن نیز از تملک ادوبی خارج شد، که این مسئله در آن زمان سر و صدای زیادی در مورد ایندکس شدن محتوای فلش توسط موتورهای جستجویی مانند Google به پا کرد (که البته موفقیت چندانی نداشت). از آن زمان امکان ساخت نرمافزارهای پخش کننده فایلهای SWF مانند برنامههای Gnash و Swfdec برای لینوکس و ابزارهایی مثل Ming، SWFTools و SwiSh که امکان تولید فایلهای SWF را نیز داشتند فراهم شد. البته واضح است که مهمترین شرط شرکت ادوبی برای اجازه دادن به تولید فایلهای SWF این بود که فایلهای تولید شده باید بدون کوچکترین خطا یا مشکلی بر روی Adobe Flash Player نیز قابل اجرا باشند. از جمله مهمترین اهدافی که در طراحی فرمت swf مورد نظر بودهاند میتوان به موارد زیر اشاره نمود: - نمایش ساده و سریع با پشتیبانی از anti-alias و render سریع به قالبهای رنگی مختلف Bitmap - امکان توسعه فرمت فایل و اضافه کردن قابلیتهای جدید بدون از دست دادن پشتیبانی رو به عقب - کاربرد گسترده در مدیای تحت وب با حداقل مصرف پهنای باند (فشردهسازی bit-packing) - سادگی پخش و نمایش آن توسط Flash player با حداقل نیازهای سختافزاری - استقلال در محتوا و عدم وابستگی به فایلهای مختلف در زمان اجرا (مانند فونتها) - امکان script نویسی و اجرا تحت ماشین مجازی به نقل از وبلاگ شخصی محمد شمس
پاسخ : گذری بر قالب فایل SWF [h=1]گذری بر قالب فایل SWF - قسمت دوم[/h] همانطور که گفتم پس از Header، آرایهای از تگهای swf درج میشوند که محتوای فایل در آنها قرار داشته و همگی از قالب یکسانی (طبیعتا با محتوای غیر یکسان) برخوردارند. از آنجا که دادههای هر بلاک به صورت مستقل هستند، امکان ارجاع به دادهای واقع در یک Tag دیگر وجود ندارد. در نتیجه به راحتی میتوان تگها را حذف یا اضافه نمود. قالب کلی هر تگ، شامل دو مولفه TagType و TagLength است. مورد اول نوع تگ را مشخص کرده و دومی نیز معرف حجم آن است. حجم هر تگ نیز به یکی از دو صورت کوتاه (برای تگهای با سایز کمتر از 62 بایت) و بلند (تگهای با سایز حداکثر 4 گیگابایت) درج میشود. به طور کلی قالب فایل SWF شامل دو بخش اصلی Header و آرایه Tag ها است. در بایتهای بخش header به ترتیب مقادیر زیر قرار میگیرند: 1. امضا یا Signature فایل فلش (3 بایت) که یکی از دو حالت "FWS" یا "CWS" است. برای فایلهای فلش غیر فشرده از کلمه FWS و در حالت فشرده بودن فایل نیز CWS درج میگردد. شیوه فشرده سازی فایل نیز که از فلش پلیر نسخه 6 اضافه شد، از الگوریتم ZLIB پیروی میکند. 2. بایت مشخص کننده نسخه فایل فلش به صورت هگزادسیمال. 3. مشخصه حجم فایل که به صورت یک متغیر 4 بایتی و با احتساب حجم Header درج میگردد. اگر فایل غیر فشرده باشد، مقدار این متغیر، دقیقا با سایز فایل برابر است، در غیر این صورت مقدار حجم فایل قبل از فشرده سازی را نشان میدهد. با داشتن حجم فایل در حالت غیر فشرده، عمل Decompression آن در پلیر با سرعت بیشتری انجام میشود. 4. ابعاد Stage فایل فلش که به صورت یک متغیر RECT درج شده است. 5. متغیر 2 بایتی شامل نرخ فریم (FrameRate) فایل فلش. 6. متغیر 2 بایتی شامل عدد مجموع تعداد فریمهای فایل SWF همانطور که گفتم پس از Header، آرایهای از تگهای swf درج میشوند که محتوای فایل در آنها قرار داشته و همگی از قالب یکسانی (طبیعتا با محتوای غیر یکسان) برخوردارند. از آنجا که دادههای هر بلاک به صورت مستقل هستند، امکان ارجاع به دادهای واقع در یک Tag دیگر وجود ندارد. در نتیجه به راحتی میتوان تگها را حذف یا اضافه نمود. قالب کلی هر تگ، شامل دو مولفه TagType و TagLength است. مورد اول نوع تگ را مشخص کرده و دومی نیز معرف حجم آن است. حجم هر تگ نیز به یکی از دو صورت کوتاه (برای تگهای با سایز کمتر از 62 بایت) و بلند (تگهای با سایز حداکثر 4 گیگابایت) درج میشود. نوع تگ (TagType) به طور کلی تگهای فلش به دو دسته "Definition tags" و "Control tags" تقسیم میشوند. 1. تگهای Definition یا تعریفی، شامل تعریف محتوای فایل فلش از قبیل shape ها، bitmsp ها، متنها، اصوات و غیره هستند. هر تگ شامل یک مشخصه منحصر به فر به نام character ID است که در زمان اجرای فایل فلش در یک دیکشنری پویا ذخیره شده و به نوعی جدول اشاره گر به موجودیتهای انیمیشن را تشکیل میدهد. بدیهیست که تگهای Definition حکم data را داشته و موجودیتی غیر فعال و دادهای دارند. 2. تگهای Control که همانطور که از نام آنها پیداست، روند اجرای انیمیشن را تعریف مینمایند. تمام موجودیتهای اجرایی در یک فایل swf (مانند کدهای ActionScript) در این تگها قرار میگیرند. به طور کلی در رابطه با قوانین حاکم بر ترتیب تگهای SWF، به 2 مورد مهم به شرح زیر باید اشاره نمود: - آرایه تگها با تگی به نام FileAttributes آغاز و با تگ نهایی خاتمه مییابد. - هر تگ Definition لزوما باید قبل از تگ کنترلی که از آن استفاده میکند قرار گرفته باشد. در نتیجه هیچ تگی نمیتواند از دادهای موجود در تگ دیگری که پس از آن درج شده است، استفاده نماید. به نقل از وبلاگ شخصی محمد شمس
پاسخ : گذری بر قالب فایل SWF [h=1]گذری بر قالب فایل SWF - قسمت سوم[/h] در قسمت قبل به این مسئله اشاره نمودم که قبل از اجرای فایل SWF، مخزنی به نام Dictionary ساخته میشود که شامل CharacterId تمام تگهای دادهای میباشد. تگهای کنترلی و دادهای با استفاده از مقدار CharacterId میتوانند به محتوای تگهای دیگر ارجاع داشته و یا از اشیاء آنها استفاده کنند. به عنوان مثال در یک شئ Displaylist ممکن است ارجاع به موجودیتها به صورت زیر باشد: اگر روند دسترسی تگهای کنترلی را هم در نظر بگیریم، شکل زیر این ارتباط را به صورت روشنتری نمایش میدهد: ر رابطه با شکل بالا بهتر است به توضیح چند نکته بپردازیم. تگ PlaceObject، موجب اضافه شدن شی مربوط به CharacterId دریافت شده، به DisplayList مقصد میشود. پس از کلیه تگها یکی یکی و به ترتیب مورد پردازش قرار گرفته تا زمانی که نوبت اجرا به تگ ShowFrame برسد. در زمان پردازش این تگ، FlashPlayer کلیه محتوای مورد ارجاع را به صفحه نمایش اضافه نموده و آن را رندر میکند. شیوه رندر شدن محتوا هم به این صورت است که کلیه اشیاء موجود تا تگ ShowFrame قبلی، بر روی محتوای قبلی موجود در صفحه نمایش اضافه شده و عملیات رندر صورت میگیرد. به نقل از وبلاگ شخصی محمد شمس