Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActionScript Drawing Code From Vector Graphic?

is there a common way to convert a drawn vector graphic in Flash Professional to code for the Drawing API?

the code of these drawn or imported vector graphic assets are available in the source files (.xfl) as XML data. for example, the following drawn vector graphic is the trailing XML data.

enter image description here

<DOMSymbolItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://ns.adobe.com/xfl/2008/" name="MSprite" itemID="4e03ae4f-00002c0f" linkageExportForAS="true" linkageBaseClass="flash.display.Sprite" linkageClassName="MSprite" sourceLibraryItemHRef="Symbol 1" lastModified="1308864079" isSpriteSubclass="true">
  <timeline>
    <DOMTimeline name="MSprite">
      <layers>
        <DOMLayer name="Layer 1" color="#4FFF4F" current="true" isSelected="true">
          <frames>
            <DOMFrame index="0" keyMode="9728">
              <elements>
                <DOMShape>
                  <fills>
                    <FillStyle index="1">
                      <SolidColor color="#00CCFF"/>
                    </FillStyle>
                  </fills>
                  <strokes>
                    <StrokeStyle index="1">
                      <SolidStroke scaleMode="normal">
                        <fill>
                          <SolidColor/>
                        </fill>
                      </SolidStroke>
                    </StrokeStyle>
                  </strokes>
                  <edges>
                    <Edge fillStyle0="1" strokeStyle="1" edges="!6883 745S5[6369 340 5741 148!5741 148[5534 85 5314 78!5314 78[4037 36 2754 2!2754 2[1956 -18 1222 211!1222 211[693 376 393 745!393 745[139 1056 48 1512!48 1512[-130 2404 354 3085!354 3085[799 3713 1505 3927!1505 3927[1675 3979 1817 3876
!1817 3876[1970 3765 2071 3564!2071 3564|1474 3205!1474 3205[1230 2199 2029 1548!2029 1548[2144 1454 2274 1365!2274 1365|2834 1365!2834 1365|3194 1585!3194 1585|3254 1705!3254 1705|3434 2245!3434 2245|3514 2305!3514 2305[3652 1520 4512
 1353!4512 1353[5351 1190 5981 1839!5981 1839[6054 1915 6115 1995!6115 1995[6394 2358 6314 2845!6314 2845[6188 3617 6664 4084!6664 4084[6710 4129 6761 4171!6761 4171[6898 4282 7071 4308!7071 4308[7421 4359 7733 4184!7733 4184[7760 4134
 7785 4084!7785 4084[8238 3170 7920 2182!7920 2182[7733 1598 7325 1156!7325 1156[7115 929 6883 745"/>
                    <Edge cubics="!5741 148(;5603,106 5461,83 5314,78q5741 148Q5534 85q5314 78);"/>
                    <Edge cubics="!5981 1839(;6030,1890 6074,1942 6115,1995q5981 1839Q6054 1915q6115 1995);"/>
                    <Edge cubics="!6115 1995(;6301,2237 6367,2520 6314,2845q6115 1995Q6394 2358q6314 2845);"/>
                    <Edge cubics="!6761 4171(;6852,4245 6956,4291 7071,4308q6761 4171Q6898 4282q7071 4308);"/>
                    <Edge cubics="!6314 2845(;6230,3363 6348,3778 6664,4084q6314 2845Q6188 3617q6664 4084);"/>
                    <Edge cubics="!6664 4084(;6699,4118 6729,4145 6761,4171q6664 4084 6761 4171);"/>
                    <Edge cubics="!7733 4184(;7751,4152 7768,4119 7785,4084q7733 4184 7785 4084);"/>
                    <Edge cubics="!7785 4084(;8086,3476 8132,2842 7920,2182q7785 4084Q8238 3170q7920 2182);"/>
                    <Edge cubics="!4512 1353(;5071,1244 5561,1406 5981,1839q4512 1353Q5351 1190q5981 1839);"/>
                    <Edge cubics="!7071 4308(;7304,4342 7525,4301 7733,4184q7071 4308Q7421 4359q7733 4184);"/>
                    <Edge cubics="!7920 2182(;7795,1793 7597,1451 7325,1156q7920 2182Q7733 1598q7325 1156);"/>
                    <Edge cubics="!7325 1156(;7188,1007 7043,872 6883,745q7325 1156Q7115 929q6883 745);"/>
                    <Edge cubics="!6883 745(;6546,478 6163,277 5741,148q6883 745Q6369 340q5741 148);"/>
                    <Edge cubics="!2029 1548(;2106,1485 2187,1424 2274,1365q2029 1548Q2144 1454q2274 1365);"/>
                    <Edge cubics="!2834 1365(;2834,1365 3194,1585 3194,1585q2834 1365 3194 1585);"/>
                    <Edge cubics="!2274 1365(;2274,1365 2834,1365 2834,1365q2274 1365 2834 1365);"/>
                    <Edge cubics="!2754 2(;2222,-11 1711,58 1222,211q2754 2Q1956 -18q1222 211);"/>
                    <Edge cubics="!3254 1705(;3254,1705 3434,2245 3434,2245q3254 1705 3434 2245);"/>
                    <Edge cubics="!3434 2245(;3434,2245 3514,2305 3514,2305q3434 2245 3514 2305);"/>
                    <Edge cubics="!1505 3927(;1618,3962 1722,3945 1817,3876q1505 3927Q1675 3979q1817 3876);"/>
                    <Edge cubics="!1222 211(;870,321 594,498 393,745q1222 211Q693 376q393 745);"/>
                    <Edge cubics="!393 745(;224,951 109,1207 48,1512q393 745Q139 1056q48 1512);"/>
                    <Edge cubics="!1474 3205(;1311,2534 1496,1982 2029,1548q1474 3205Q1230 2199q2029 1548);"/>
                    <Edge cubics="!3194 1585(;3194,1585 3254,1705 3254,1705q3194 1585 3254 1705);"/>
                    <Edge cubics="!48 1512(;-71,2107 31,2631 354,3085q48 1512Q-130 2404q354 3085);"/>
                    <Edge cubics="!354 3085(;651,3504 1034,3784 1505,3927q354 3085Q799 3713q1505 3927);"/>
                    <Edge cubics="!3514 2305(;3606,1782 3939,1464 4512,1353q3514 2305Q3652 1520q4512 1353);"/>
                    <Edge cubics="!5314 78(;4463,50 3609,25 2754,2q5314 78Q4037 36q2754 2);"/>
                    <Edge cubics="!2071 3564(;2071,3564 1474,3205 1474,3205q2071 3564 1474 3205);"/>
                    <Edge cubics="!1817 3876(;1919,3802 2004,3698 2071,3564q1817 3876Q1970 3765q2071 3564);"/>
                  </edges>
                </DOMShape>
              </elements>
            </DOMFrame>
          </frames>
        </DOMLayer>
      </layers>
    </DOMTimeline>
  </timeline>
</DOMSymbolItem>

this proves that it would be certainly possible to create a utility that could port the XML code to AS3. in doing so, AS3 developers wouldn't have to worry about handling vector assets, especially if they migrate away from Flash Professional to Flash Builder.

personally, i'm interested in creating a utility for this eventually if there is not one available already, but i'd like to know if there is one already available?


[EDIT]

since i've posted this question i've learned of the SVG Web Project, which contains a branch for ActionScript 3.0 for reading SVG data and adding it to the display list. the library allows developers to create SVG graphics and embed the source code as an XML literal. while this still doesn't open up the possibility of simply editing graphics using the Drawing API, it's not so difficult to edit the SVG XML and it makes it possible to avoid using .swf assets for graphics in Flash Builder. the library isn't perfect, my brief time spent with it i've leared that it doesn't seem to render radial gradients with more than 2 colors, and it doesn't allow scaling (it appears you can only change the width and height properties, which is both strange and very unfortunate), but at least now i can include the code for the graphics instead of using assets.

source: com.zavoo.labs - New Flex and Flash SVGWeb Components

like image 357
Chunky Chunk Avatar asked Jun 23 '11 21:06

Chunky Chunk


1 Answers

Personally, for now, I prefer the .swc approach because you get a smaller filesize since you end up with a compressed binary file, and only the assets that are needed later in actionscript are available.

It would be great if groups/drawing objects/Graphic symbols would have name/ids, but they don't currently. This means going the xml route you would load a large file and traverse it to fetch the part you need (unless you export separate xml files).

XFL would be the whole document. I would suggest File > Export Image > FXG since you can export individual assets. There is an as3 FXGParser already which I've used before and it's pretty good.

For now, probably FXG, SWC or SWF (using the wonderful AS3SWF library by @Claus Wahlers ) would be decent ways to access designer assets from as3.

As far as I understand using XFL as assets in Flash Builder project will save the extra step of compiling/exporting assets from Flash Professional/Authoring to other formats. The designer XFL (which could be also properly versioned) could be used directly as opposed to having an intermediary workflow step and format, which is interesting. My only concern is dealing with large/messy and hard to manage xfl files (and yes, designers usually are 'messy' with they're assets).

XFL is not exactly FXG unfortunately and there isn't an XFL specification available yet (there is one for FXG though). Check out these answers on XFL specs and XFL Edge definitions. Either somebody needs to get their hands dirty and reverse engineer/document the XFL format or wait for Adobe to do it. The later basically means flooding the feature request form and forums, contacting evangelists, campaigning until they do it. As far as I can see, if a LOT of people find this useful I imagine Adobe would be willing to invest time into this.

In short, having a decent library to parse/search/fetch assets from XFL files might be pretty handy and on the long run being able to import/export XFL's from other tools will be beneficial.

like image 78
George Profenza Avatar answered Nov 15 '22 04:11

George Profenza