Skin change in the RH 5

Presently, i am using the Robohelp 5 version. The chm feel and look of this version is very outdated and doesn't give a modern appearance. I have visited other forums, but the commonly used methodology is to create a webhelp with the new skin settings and then convert to chm. But, this facility is not available in this version. Can you suggest any other solutions for this issue.

Yes, from this version , there is no facility to upgrade to any latest
version. Also, this documentation has to be delivered along with the
application build, so irrespective of having access to the web the users
must be able to read this file.
Is there any other way to solve this issue?
From: Willam van Weelden
Sent: Thursday, July 17, 2014 2:48 PM
To: Chatura Machavolu
Subject:  Skin change in the RH 5
Skin change in the RH 5
created by Willam van Weelden
<https://forums.adobe.com/people/WillamvanWeelden> in HTML Help (CHMs)
- View the full discussion
<https://forums.adobe.com/message/6557901#6557901>

Similar Messages

  • Skins that effect the host component behaviour.

    There was an interesting question that was raised in the pre-release forums about what is the appropriate way to handle animations between the skin and its host. Basically the issue was if there is an animation in the host and another in the skin what would be the best way to code it so that both animations ran in parallel, My thoughts are why not do it all in the skin. this example animates a container by resizing it and centering it in the application.
    I figured it would be an interesting topic for those that are trying adding extra component functionality into the skin.
    @PD - Maybe you could apply a little of your magic to something like this and add it your blog.
    David
    The App
    =============================================================
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
      xmlns:s="library://ns.adobe.com/flex/spark"
      xmlns:mx="library://ns.adobe.com/flex/halo"
      creationComplete="application1_creationCompleteHandler(event)" width="100%" height="100%">
    <s:layout>
    <s:BasicLayout/>
    </s:layout>
    <fx:Script>
    <![CDATA[
    import mx.collections.ArrayCollection;
    import mx.events.FlexEvent;
    protected function application1_creationCompleteHandler(event:FlexEvent):void
    menu1.verticalCenter=height/2*-1 + 35; 
    menu1.horizontalCenter=width/2*-1 + 110;
    ]]>
    </fx:Script>
    <s:SkinnableContainer id="menu1" left="10" top="10" width="200" height="50"
    skinClass="SkinnableContainerSkin2" backgroundColor="#A16969">
    </s:SkinnableContainer>
    </s:Application>
    =============================================================
    The Skin
    =============================================================
    <?xml version="1.0" encoding="utf-8"?>
    <s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
        xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5" creationComplete="skin1_creationCompleteHandler(event)">
    <fx:Declarations>
    <s:Parallel id="sizer">
    <s:Animate target="{hostComponent}" duration="2000" repeatCount="1">
    <s:SimpleMotionPath id="setheight" property="height" valueTo="500"/>
    </s:Animate>
    <s:Animate target="{hostComponent}" duration="2000" repeatCount="1">
    <s:SimpleMotionPath id="setvertical" property="verticalCenter" valueTo="0"/>
    </s:Animate>
    <s:Animate target="{hostComponent}" duration="2000" repeatCount="1">
    <s:SimpleMotionPath id="sethorizontal" property="horizontalCenter" valueTo="0"/>
    </s:Animate>
    </s:Parallel>
    </fx:Declarations>
    <fx:Metadata>
        <![CDATA[
            [HostComponent("spark.components.SkinnableContainer")]
        ]]>
        </fx:Metadata>
        <fx:Script fb:purpose="styling">
            <![CDATA[       
    import mx.events.FlexEvent;
    import mx.core.FlexGlobals;
    private var Vert:int;
    private var Horz:int;
                override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number) : void
                    bgFill.color = getStyle("backgroundColor");
                    bgFill.alpha = getStyle("backgroundAlpha");
                    super.updateDisplayList(unscaledWidth, unscaledHeight);
    protected function resizeMe(e:MouseEvent): void
    Vert = int(FlexGlobals.topLevelApplication.contentGroup.height/2*-1)+35;
    Horz = int(FlexGlobals.topLevelApplication.contentGroup.width/2*-1)+110;
    if (hostComponent.height < 51)
    setheight.valueTo=500;
    setvertical.valueTo=0;
    sethorizontal.valueTo=0;
    else
    setheight.valueTo=50;
    setvertical.valueTo=Vert;
    sethorizontal.valueTo=Horz;
    sizer.play();
    protected function skin1_creationCompleteHandler(event:FlexEvent):void
    Vert = int(FlexGlobals.topLevelApplication.contentGroup.height/2*-1);
    Horz = int(FlexGlobals.topLevelApplication.contentGroup.width/2*-1);
            ]]>       
        </fx:Script>
        <s:states>
            <s:State name="normal" />
            <s:State name="disabled" />
        </s:states>
        <s:Rect left="0" right="0" top="0" bottom="0">
            <s:fill>
                <s:SolidColor id="bgFill" color="0x00DDDD"/>
            </s:fill>
        </s:Rect>
        <s:Group id="contentGroup" left="0" right="0" top="0" bottom="0" minWidth="0" minHeight="0" click="resizeMe(event)">
            <s:layout>
                <s:BasicLayout/>
            </s:layout>
        </s:Group>
    </s:Skin>

    This is a good question.
    There's no hard and fast rule to apply which says "this belongs in the skin" vs. "this belongs in the component".  Similarly, there are also no hard and fast rules around when to use a the new skinning architecture vs. just creating a custom component.  Just do whatever you feel comfortable with and makes your job easier.  At the end of the day, it's about productivity and not living up to ideals.  That said, there are probably some easier and more logical ways to do some things.
    On the skinning architecture vs. custom component debate, with a SkinnableComponent we have a clear separation of the component properties and behavior on one side and the look and feel of the component on the Skin side.  Also, there's a clear contract we use to talk back and forth to one another.  The reason for the separation between the Skin and the SkinnableComponent is so that we can have one Button SkinnableComponent and multiple Skins for that Button which all tweak the visual appearance of it.
    It doesn't make sense for every component to be skinnable.  If you know what your component is going to be and look like and don't need the extra flexibility skinning provides, then you can get rid of the extra overhead that skinning requires (like having 2 classes).  An example custom component is:
    <s:Group>
    <s:Rect>
    </s:Rect>
    <mx:Image src="..." />
    <s:Panel skinClass="myCustomSkinClass">
    </s:Panel>
    </s:Group>
    If you want more flexibility and want the ability to easily change the look and feel of the component (i.e. skin it), then you'd extend SkinnableComponent, fill out the skinning lifecycle methods, and create a default Skin for its appearance.
    Now, when you're building a SkinnableComponent, there's always a question of what to put in the component vs. what to put in the skin.  In general, we try to put the core properties and behaviors in the component and anything visual in the skin.  However, another guideline to consider is whether all skins would want this behavior.  If so, then it makes sense (and makes your life easier) to put it in the SkinnableComponent rather than the Skin.  We do this in the framework for components like VSlider, where the logic for positioning the y-axis of the thumb is in the component and not the skin, even though it's a "visual" thing.  We also have discussed how we would build up a ColorPicker component, and I think the way we would go about it is by putting a lot of the "visual" logic in the component because otherwise we'd have to duplicate it across all skins.
    Now, the other question you guys are asking here are "when do I bake effects (or any behavior) in to the component (either in the skin or in the SkinnableComponent AS class) vs. when do I declare effects alongside the component".  Again, I think the answer to that is whether you want all your components to have this behavior.  If that was the case, then I'd lose no sleep baking it in to the component.  However, if it's not the case, then I'd make the end-developer delcare it when they use your component, like:
    <s:MyCustomComponent id="myComponent" />
    <s:Resize id="resizer" widthTo="100" heightTo="50" target="{myComponent}"/>
    I would think most of the time, you probably wouldn't want to bake an effect like that in to the component, especially because it has some sizing information on it.  However, we have some effects baked in to some of the framework components, like when the thumb of a Slider moves around due to someone clicking on the track.  I think it's fine that it's baked in to the component, but I do think it should probably be stylable so that a user can customize it (that's on our list of lower-priority things to do btw).
    The framework has definitely evolved.  I think we started out with a more purist attitude and wanted a clear separation between the skin and the component.  However, as we built out components, we realized it's not always practical to do that.  Similarly, we wanted our skins to be pure MXML; however, for usability reasons, we decided that our skins should be styleable, and that requires a little bit of ActionScript code.  Border is a great example where it doesn't really follow a lot of these guidelines, but it's just a styleable component; however, this component makes other people's jobs easier.  At the end of the day, it's about productivity and usability, and hopefully the Spark architecture is a step in the right direction.
    Anyways, I hope that helps some.  These are just some guidelines.  As people play around with the architecture more, I'm sure some other people will have some good advice to share as well.
    -Ryan

  • [svn] 4005: Change in the way item renderers lay them selves out.

    Revision: 4005
    Author: [email protected]
    Date: 2008-11-03 17:07:38 -0800 (Mon, 03 Nov 2008)
    Log Message:
    Change in the way item renderers lay them selves out. Before we were using 100% width and 100% height. Now, we're using horizontalAlign and verticalAlign to accomplish this, which are properties added to VerticalLayout and HorizontalLayout, respectively. horizontalAlign takes values "left", "center", "right", "justify", and "contentJustify". "justify" sizes all elements to the width of the component. "contentJustify" sizes all elements to the size of the largest child (with a minimum of the width of the parent component). Similar, verticalAlign takes "top", "middle", "bottom", "justify", and "contentJustify".
    The default List skin sets the VerticalLayout's horizontalAlign to "contentJustify." Most lists should use "contentJustify" or "justify" if you don't want scrollbars. If you want to change your list to a horizontal list, you change the layout to a horizontal layout. However, you must set the verticalAlign property on the horizontal layout correctly--otherwise it'll default to "top" and probably won't do what you want.
    Ran checkintests and the following mustella tests: layout, list, Group, DataGroup, FxDataContainer, and FxContainer. Some DataGroup tests were failing but should be because of an unrelated, local change. All other tests are passing.
    QE Notes: Failing tests are excluded. Please update them (I think all just need to add verticalAlign="contentJustify" in the horizontal layout case) and re-include them. Also, please write tests for this new functionality.
    Doc Notes: None
    Bugs: SDK-17198
    Reviewer: Evtim
    Ticket Links:
    http://bugs.adobe.com/jira/browse/SDK-17198
    Modified Paths:
    flex/sdk/trunk/development/eclipse/flex/flex4test/src/flex4test.mxml
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/components/ItemRenderer.as
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/layout/HorizontalLayout.as
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/layout/LayoutBase.as
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/layout/VerticalLayout.as
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/skins/spark/FxDataContainerSkin.mxml
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/skins/spark/FxListSkin.mxml
    Added Paths:
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/layout/HorizontalAlign.as
    flex/sdk/trunk/frameworks/projects/flex4/src/mx/layout/VerticalAlign.as

    Hi! The only way I know of is changing the screen resolution. Tom

  • Ical skin change

    I have tried a couple of methods to change the iCal and Contacts skins in the Macbookpro Retina and neither of them have worked. Lion Tweaks, god bless his little Norwegien cotton socks, doesn't mention it doesn't work with the Ret, and Simple Change is the same. I'm not savvy enough to mess around with Terminal but if anyone hear's anything let me know. Ta.

    Hi there,
    I hade the same problem on my MacBook Pro with Retina display, MAC OSX 10.7.4. Whant you need to do is run iCal and Addressbook in "low resolution" mode in order to apply the changes.
    Here's how to do that  (http://support.apple.com/kb/HT5266):
    Quit the application if it is currently open.
    In the Finder, choose Applications from the Go menu.
    In the Applications folder that opens, click the application's icon (e.g. iCal) so it is highlighted.
    Choose Get Info from the File menu.
    Place a checkmark next to "Open in Low Resolution" to enable Low Resolution mode.
       6. Close the window and double click the iCal icon in Applications to reopen iCal.
    Hope this helps.

  • RoboHelp Skin Change

    I am new to RoboHelp. I have lost the lefthand-side corner column from where skin changes can be done. Please help if you know.

    I am presently using Robohelp Version 8.
    My  entire setup has been messed. Any of the items such as Project Manager,  Single Source Layout, Project Set up, The Main Page where to write, are  not appearing. They seem to have been closed down by some mistaken  step. Thus, when I am opening a Robohelp document, the page appears  blank.
    How do I get the original page setup, where there  will be Project Manager at the left hand side, Topic Names in the Middle  and Design and HTML Page (Where I can write) in the right side? There is  nobody in my office who knows Robohelp. So I need help badly.
    I  have installed Robohelp Version 8 and it is not a free version.The  previous documents are also appearing blank. I am really helpless....

  • How Can I Sync Multiple Changes at the same time?

    Is there a way to configure iTunes so that I can make changes in multiple sections, and only sync or apply them when I've made all of them?
    For example: I want to changes setting in Music, Apps, and Books. Today, it seems like I have to go to change settings,hit apply, and wait for the iTunes to sync for each one. What I want to do it make changes in all of them, then hit apply/sync and wait for the iTunes to sync all my changes in one swoop.
    The seems very intuitive and saves the user a lot of time. Can iTunes be configured to due this?

    The OP's question asked - in iTunes for Windows, if it was possible to "configure iTunes" (not the iPod) and then "Sync those changes to the iPod in one step"
    Is there a way to configure iTunes so that I can make changes in multiple sections, and only sync or apply them when I've made all of them?
    For the media, one can;
    untick songs in the Library in order for them to be removed at the next Sync (and obviously the reverse to put them back on),
    the same procedure for books,
    create and modify Playlists,
    remove or add photos to the chosen Photos folder (in Windows of course, not in iTunes) which then get removed or added at the next Sync,
    and then connect the iPod. One can prevent an iPod from Syncing at initial connection time, so that further changes to things such as which Apps to Sync (which does need to iPod to be connected), choices of Selected Playlists only, etc. (ditto) can be made by choosing the appropriate pane. As yet, whenever I've done this, I have never had to Sync one change before switching to a different pane. The first change causes the Apply and Revert buttons to appear. I ignore them and continue to make further changes on the other panes. Then I select Apply. The Apply/Revert buttons are removed and replaced by a Sync button. So, although there is the Apply, then Sync to be done, it can hardly be described as a burden.
    Are you saying Chris, that you have to apply one change at a time, followed by a sync before making any other change?

  • In Numbers, how can i change only the year in a date formatted column of data?

    I'm using Numbers 3.5.2 on an iMac running Yosemite 10.10.2.
    This column is a listing of dates tied to info that needs to happen on a particular date each year. Rather than re-key all the dates so the year advances to 2015, it would be great if I could change just the year for the entire column, leaving the day and month intact.
    Thanks in advance for your help.

    If you already have a column of dates, and just want change the year in the entire column, rather than reenter the dates,  then you could use a formula something like this:
    The formula in B2, copied down the column:
        =DATE(YEAR(A2)+1,MONTH(A2),DAY(A2))
    Then select the new column, command-c to copy, and Edit > Paste Formula Results. The original column can then be deleted.
    SG

  • When I share a pages document as a PDF (via e-mail) all the pictures change from the original document, most are missing with just a few of them repeated in the spots where others had been.  How do I do this without the document changing?

    When I share a pages document as a PDF (via e-mail) all the pictures change from the original document, most are missing with just a few of them repeated in the spots where others had been.  How do I do this without the document changing?
    I need to be able to send it to a PC in order to print it.

    Hard to say what is happening without examining the file.
    If you like click on my blue name and email me both the .pages file and the the .pdf you have made from it.
    Peter
    ps It would help to say what version of Pages you are using and on what you are running it. iOS or Mac and what version.

  • How to find out the list of DCs changed in the MSS 600 Support PackageXX

    Hi
    We are trying to instal patches from "MSS 600 support package 07" to "MSS 600 support package 17"  at the same time we have 4 custom DCs in place.
    Our custom DCs have dependencies in MSS standard DCs.
    Question is how do we know the list ot DC changed/modified in suport package XX ?
    Is there a description of DCs changed in the support package? Or is there a description on SC level so we could trace it
    GRANT POINTS!!!
    Thanks
    Denis

    Papaden- Please use metadata comparision tool to find the changes in webdynpro DCs.
    http://help.sap.com/saphelp_nw70/helpdata/en/6e/0e184188b4f16fe10000000a1550b0/frameset.htm
    Thanks,
    Raj

  • Can not see the option Execution with Data Change in the infoprovider?

    Hi team,
    i am using query designer 3.x, when i go into my bex brodcaster settings and schedule my report
    i can not see the option "Execution with Data Change in the infoprovider",
    i can only see 2 options
    Direct scheduling in background process
    create new scheduling
    periodic,
    is there any setting which i would be able to see the option "Execution with Data Change in the infoprovider"?
    kindly assist

    Hi Blusky ,
    check the below given link.
    http://help.sap.com/saphelp_nw04/Helpdata/EN/ec/0d0e405c538f5ce10000000a155106/frameset.htm
    Regards,
    Rohit Garg

  • In version 3.6 I can not open a website link from original page, I keep getting a new window that is blank and asking me to put in a web address. What has changed with the new version?

    When on a page if I click on a web link I get a new window that is blank and asks me enter a web address. This started happening with the new 3.6 version. It seems to have something to do with what I choose for the location in my privacy settings as the window changes with each setting but I still cannot get to the new site. Any ideas? I have no problem with this in IE and I have to keep opening IE when I encounter the problem on Firefox which is annoying.

    Start Firefox in [[Safe Mode]] to check if one of the add-ons is causing the problem (switch to the DEFAULT theme: Tools > Add-ons > Themes).
    * Don't make any changes on the Safe mode start window.
    See:
    * [[Troubleshooting extensions and themes]]
    If it does work in Safe-mode then disable all extensions and then try to find which is causing it by enabling one at a time until the problem reappears.
    * Use "Disable all add-ons" on the [[Safe mode]] start window to disable all extensions.
    * Close and restart Firefox after each change via "File > Exit" (Mac: "Firefox > Quit"; Linux: "File > Quit")

  • I am receiving the data through the rs232 in labview and i have to store the data in to the word file only if there is a change in the data and we have to scan the data continuasly how can i do that.

    i am receiving the data through the rs232 in labview and i have to store the data in to the word or text file only if there is a change in the data. I have to scan the data continuasly. how can i do that. I was able to store the data into the text or word file but could not be able to do it.  I am gettting the data from rs232 interms of 0 or 1.  and i have to print it only if thereis a change in data from 0 to 1. if i use if-loop , each as much time there is 0 or 1 is there that much time the data gets printed. i dont know how to do this program please help me if anybody knows the answer

    I have attatched the vi.  Here in this it receives the data from rs232 as string and converted into binery. and indicated in led also normally if the data 1 comes then the led's will be off.  suppose if 0 comes the corresponding data status is wrtten into the text file.  But here the problem is the same data will be printed many number of times.  so i have to make it like if there is a transition from 1 to o then only print it once.  how to do it.  I am doing this from few weeks please reply if you know the answer immediatly
    thanking you 
    Attachments:
    MOTORTESTJIG.vi ‏729 KB

  • 'Voice Memo' changed for the worst after 8.1...

    Apple has changed how the 'Voice Memo' app works. It no longer switches automatically to speaker volume when played. You must now enable it manually by clicking the little speaker icon (will turn blue) towards the upper right corner.
    Pre iOS 8.1 (or earlier versions) installation:
    1. Voice Memo would sound through speakerphone once play is engaged
    2. When a headphone is plugged in; sound comes through headphone, when removed; sound comes back to speakerphone.
    Post iOS 8.1 installation:
    1. When played with no headphones, sound now comes through the earpiece enabling you to listen like while listening to a call.
    2. No sound through speakers - will not come on unless you press the little speaker icon (turned blue) towards the upper right corner. Will override earpiece volume.
    3. When headphone is plugged in, it will override both speaker/earpiece depending on what mode it was on
    4. Unplugging headphone will not bring sound back to speakers but only to earpiece.
    Too much work.

    I did a hard reset by holding the two buttons down. Mine worked the same way as you described. How about unplugging the headphone? It will not default back to the last state, ie; speakerphone>headphone>unplug headphone>earpiece. As stated in this logical order, it will not go back to speakerphone but to earpiece.
    My guess is that they've added the 'earpiece' feature therefore an icon is needed. But instead of for controlling the speakerphone, the icon should be for the earpiece, or AT LEAST automatically defaults back to speakerphone when the jack is free.
    Honestly, I'd rather prefer it like before instead of having more steps to tinker with.

  • How do I use Actionmanager code to change just the contents of a line of text?

    The quick question - can anyone provide me with Action Manager code that will simply change the contents of a text field in Photoshop CS6?
    The long version, if anyone wants to know:
    I'm a reasonably experienced Applescripter with hundreds of Illustrator and Photoshop applescripts, but I don't know javascript at all.
    I have a script I'm doing currently that just deletes, changes the visibility, and/or changes the text contents of a whole bunch of layers.
    It's running just fine in Applescript, except it runs slower than molasses. I went to so much work to automate this stuff - the script's 750 lines with all the logic - and users are telling me that they can do this by hand in the time the script runs. It really does take as long as a minute, which just feels painful. It deletes about 25 layers, changes the text contents of up to 5 layers, and changes the visibility of maybe 2 to 24 layers.
    I tested the logic parts and they're near instantaneous. Replacing all of that and just plugging in static dummy values for the variables, and the Photoshop updates yield the same speed. For some reason, just telling Photoshop to do these things - feeding it a list of layers to delete and text to change, just takes it forever. Just a bunch of lines like: delete layer [whatever] of layer [whatever] of layer [whatever] or:
    set the contents of text object of art layer "Name" of layer set "Editable Text" of layer set "Header Elements" to "Some Text:" & someVariableText
    So I've been taking out the Photoshop calls in Applescript, and replacing them with calls to subroutines that replay Action Manager code I got from Scripting Listener and then plugging in the relevant variables.
    So far so good on the deleting layers, that part runs 20x faster now.
    On the text layer part - scripting listener records 1,011 lines of code when I change just the contents of a text field.
    What's recorded has everything about the appearance baked in. With Applescript, I could set the contents of a text field only, leaving the existing formatting, which was really handy. But if I use a call to my scripting listener code here, I'm going to have to save a different 1,000 line subroutine function for every text style of a text field I want to change, and then the script will be horribly non-future-proof.
    Not knowing Javascript, trying to deconstruct the 1,011 line monstrosity Scripting Listener spits out to get to something that just changes the character contents of the text field is not happening. I tried a bit, but it's way over my head.
    Thanks in advance for any help. Scripting listener output pasted below, in case it's helpful. The only line that's relevant to what I'm trying to accomplish - meaning the only line I'll be replacing with my own variable, is line 13:
            desc6.putString( idTxt, """This is the text I entered.\rFor the this text field.""" );
    var idsetd = charIDToTypeID( "setd" );
        var desc5 = new ActionDescriptor();
        var idnull = charIDToTypeID( "null" );
            var ref5 = new ActionReference();
            var idTxLr = charIDToTypeID( "TxLr" );
            var idOrdn = charIDToTypeID( "Ordn" );
            var idTrgt = charIDToTypeID( "Trgt" );
            ref5.putEnumerated( idTxLr, idOrdn, idTrgt );
        desc5.putReference( idnull, ref5 );
        var idT = charIDToTypeID( "T   " );
            var desc6 = new ActionDescriptor();
            var idTxt = charIDToTypeID( "Txt " );
            desc6.putString( idTxt, """This is the text I entered.\rFor the front inks.""" );
            var idwarp = stringIDToTypeID( "warp" );
                var desc7 = new ActionDescriptor();
                var idwarpStyle = stringIDToTypeID( "warpStyle" );
                var idwarpStyle = stringIDToTypeID( "warpStyle" );
                var idwarpNone = stringIDToTypeID( "warpNone" );
                desc7.putEnumerated( idwarpStyle, idwarpStyle, idwarpNone );
                var idwarpValue = stringIDToTypeID( "warpValue" );
                desc7.putDouble( idwarpValue, 0.000000 );
                var idwarpPerspective = stringIDToTypeID( "warpPerspective" );
                desc7.putDouble( idwarpPerspective, 0.000000 );
                var idwarpPerspectiveOther = stringIDToTypeID( "warpPerspectiveOther" );
                desc7.putDouble( idwarpPerspectiveOther, 0.000000 );
                var idwarpRotate = stringIDToTypeID( "warpRotate" );
                var idOrnt = charIDToTypeID( "Ornt" );
                var idHrzn = charIDToTypeID( "Hrzn" );
                desc7.putEnumerated( idwarpRotate, idOrnt, idHrzn );
            var idwarp = stringIDToTypeID( "warp" );
            desc6.putObject( idwarp, idwarp, desc7 );
            var idtextGridding = stringIDToTypeID( "textGridding" );
            var idtextGridding = stringIDToTypeID( "textGridding" );
            var idNone = charIDToTypeID( "None" );
            desc6.putEnumerated( idtextGridding, idtextGridding, idNone );
            var idOrnt = charIDToTypeID( "Ornt" );
            var idOrnt = charIDToTypeID( "Ornt" );
            var idHrzn = charIDToTypeID( "Hrzn" );
            desc6.putEnumerated( idOrnt, idOrnt, idHrzn );
            var idAntA = charIDToTypeID( "AntA" );
            var idAnnt = charIDToTypeID( "Annt" );
            var idAnCr = charIDToTypeID( "AnCr" );
            desc6.putEnumerated( idAntA, idAnnt, idAnCr );
            var idbounds = stringIDToTypeID( "bounds" );
                var desc8 = new ActionDescriptor();
                var idLeft = charIDToTypeID( "Left" );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc8.putUnitDouble( idLeft, idPnt, 0.000000 );
                var idTop = charIDToTypeID( "Top " );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc8.putUnitDouble( idTop, idPnt, -95.852051 );
                var idRght = charIDToTypeID( "Rght" );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc8.putUnitDouble( idRght, idPnt, 1318.981323 );
                var idBtom = charIDToTypeID( "Btom" );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc8.putUnitDouble( idBtom, idPnt, 141.910156 );
            var idbounds = stringIDToTypeID( "bounds" );
            desc6.putObject( idbounds, idbounds, desc8 );
            var idboundingBox = stringIDToTypeID( "boundingBox" );
                var desc9 = new ActionDescriptor();
                var idLeft = charIDToTypeID( "Left" );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc9.putUnitDouble( idLeft, idPnt, 4.000000 );
                var idTop = charIDToTypeID( "Top " );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc9.putUnitDouble( idTop, idPnt, -80.000000 );
                var idRght = charIDToTypeID( "Rght" );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc9.putUnitDouble( idRght, idPnt, 1307.720215 );
                var idBtom = charIDToTypeID( "Btom" );
                var idPnt = charIDToTypeID( "#Pnt" );
                desc9.putUnitDouble( idBtom, idPnt, 119.000000 );
            var idboundingBox = stringIDToTypeID( "boundingBox" );
            desc6.putObject( idboundingBox, idboundingBox, desc9 );
            var idtextShape = stringIDToTypeID( "textShape" );
                var list1 = new ActionList();
                    var desc10 = new ActionDescriptor();
                    var idTEXT = charIDToTypeID( "TEXT" );
                    var idTEXT = charIDToTypeID( "TEXT" );
                    var idPnt = charIDToTypeID( "Pnt " );
                    desc10.putEnumerated( idTEXT, idTEXT, idPnt );
                    var idOrnt = charIDToTypeID( "Ornt" );
                    var idOrnt = charIDToTypeID( "Ornt" );
                    var idHrzn = charIDToTypeID( "Hrzn" );
                    desc10.putEnumerated( idOrnt, idOrnt, idHrzn );
                    var idTrnf = charIDToTypeID( "Trnf" );
                        var desc11 = new ActionDescriptor();
                        var idxx = stringIDToTypeID( "xx" );
                        desc11.putDouble( idxx, 1.000000 );
                        var idxy = stringIDToTypeID( "xy" );
                        desc11.putDouble( idxy, 0.000000 );
                        var idyx = stringIDToTypeID( "yx" );
                        desc11.putDouble( idyx, 0.000000 );
                        var idyy = stringIDToTypeID( "yy" );
                        desc11.putDouble( idyy, 1.000000 );
                        var idtx = stringIDToTypeID( "tx" );
                        desc11.putDouble( idtx, 0.000000 );
                        var idty = stringIDToTypeID( "ty" );
                        desc11.putDouble( idty, 0.000000 );
                    var idTrnf = charIDToTypeID( "Trnf" );
                    desc10.putObject( idTrnf, idTrnf, desc11 );
                    var idrowCount = stringIDToTypeID( "rowCount" );
                    desc10.putInteger( idrowCount, 1 );
                    var idcolumnCount = stringIDToTypeID( "columnCount" );
                    desc10.putInteger( idcolumnCount, 1 );
                    var idrowMajorOrder = stringIDToTypeID( "rowMajorOrder" );
                    desc10.putBoolean( idrowMajorOrder, true );
                    var idrowGutter = stringIDToTypeID( "rowGutter" );
                    var idPnt = charIDToTypeID( "#Pnt" );
                    desc10.putUnitDouble( idrowGutter, idPnt, 0.000000 );
                    var idcolumnGutter = stringIDToTypeID( "columnGutter" );
                    var idPnt = charIDToTypeID( "#Pnt" );
                    desc10.putUnitDouble( idcolumnGutter, idPnt, 0.000000 );
                    var idSpcn = charIDToTypeID( "Spcn" );
                    var idPnt = charIDToTypeID( "#Pnt" );
                    desc10.putUnitDouble( idSpcn, idPnt, 0.000000 );
                    var idframeBaselineAlignment = stringIDToTypeID( "frameBaselineAlignment" );
                    var idframeBaselineAlignment = stringIDToTypeID( "frameBaselineAlignment" );
                    var idalignByAscent = stringIDToTypeID( "alignByAscent" );
                    desc10.putEnumerated( idframeBaselineAlignment, idframeBaselineAlignment, idalignByAscent );
                    var idfirstBaselineMinimum = stringIDToTypeID( "firstBaselineMinimum" );
                    var idPnt = charIDToTypeID( "#Pnt" );
                    desc10.putUnitDouble( idfirstBaselineMinimum, idPnt, 0.000000 );
                    var idbase = stringIDToTypeID( "base" );
                        var desc12 = new ActionDescriptor();
                        var idHrzn = charIDToTypeID( "Hrzn" );
                        desc12.putDouble( idHrzn, 0.000000 );
                        var idVrtc = charIDToTypeID( "Vrtc" );
                        desc12.putDouble( idVrtc, 0.000000 );
                    var idPnt = charIDToTypeID( "Pnt " );
                    desc10.putObject( idbase, idPnt, desc12 );
                var idtextShape = stringIDToTypeID( "textShape" );
                list1.putObject( idtextShape, desc10 );
            desc6.putList( idtextShape, list1 );
            var idTxtt = charIDToTypeID( "Txtt" );
                var list2 = new ActionList();
                    var desc13 = new ActionDescriptor();
                    var idFrom = charIDToTypeID( "From" );
                    desc13.putInteger( idFrom, 0 );
                    var idT = charIDToTypeID( "T   " );
                    desc13.putInteger( idT, 48 );
                    var idTxtS = charIDToTypeID( "TxtS" );
                        var desc14 = new ActionDescriptor();
                        var idstyleSheetHasParent = stringIDToTypeID( "styleSheetHasParent" );
                        desc14.putBoolean( idstyleSheetHasParent, true );
                        var idfontPostScriptName = stringIDToTypeID( "fontPostScriptName" );
                        desc14.putString( idfontPostScriptName, """ProximaNova-Bold""" );
                        var idFntN = charIDToTypeID( "FntN" );
                        desc14.putString( idFntN, """Proxima Nova""" );
                        var idFntS = charIDToTypeID( "FntS" );
                        desc14.putString( idFntS, """Bold""" );
                        var idScrp = charIDToTypeID( "Scrp" );
                        desc14.putInteger( idScrp, 0 );
                        var idFntT = charIDToTypeID( "FntT" );
                        desc14.putInteger( idFntT, 1 );
                        var idSz = charIDToTypeID( "Sz  " );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( idSz, idPnt, 115.000000 );
                        var idHrzS = charIDToTypeID( "HrzS" );
                        desc14.putDouble( idHrzS, 100.000000 );
                        var idVrtS = charIDToTypeID( "VrtS" );
                        desc14.putDouble( idVrtS, 100.000000 );
                        var idsyntheticBold = stringIDToTypeID( "syntheticBold" );
                        desc14.putBoolean( idsyntheticBold, false );
                        var idsyntheticItalic = stringIDToTypeID( "syntheticItalic" );
                        desc14.putBoolean( idsyntheticItalic, false );
                        var idautoLeading = stringIDToTypeID( "autoLeading" );
                        desc14.putBoolean( idautoLeading, false );
                        var idLdng = charIDToTypeID( "Ldng" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( idLdng, idPnt, 119.000000 );
                        var idTrck = charIDToTypeID( "Trck" );
                        desc14.putInteger( idTrck, 15 );
                        var idBsln = charIDToTypeID( "Bsln" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( idBsln, idPnt, 0.000000 );
                        var idcharacterRotation = stringIDToTypeID( "characterRotation" );
                        desc14.putDouble( idcharacterRotation, 0.000000 );
                        var idAtKr = charIDToTypeID( "AtKr" );
                        var idAtKr = charIDToTypeID( "AtKr" );
                        var idopticalKern = stringIDToTypeID( "opticalKern" );
                        desc14.putEnumerated( idAtKr, idAtKr, idopticalKern );
                        var idfontCaps = stringIDToTypeID( "fontCaps" );
                        var idfontCaps = stringIDToTypeID( "fontCaps" );
                        var idNrml = charIDToTypeID( "Nrml" );
                        desc14.putEnumerated( idfontCaps, idfontCaps, idNrml );
                        var iddigitSet = stringIDToTypeID( "digitSet" );
                        var iddigitSet = stringIDToTypeID( "digitSet" );
                        var iddefaultDigits = stringIDToTypeID( "defaultDigits" );
                        desc14.putEnumerated( iddigitSet, iddigitSet, iddefaultDigits );
                        var iddirOverride = stringIDToTypeID( "dirOverride" );
                        var iddirOverride = stringIDToTypeID( "dirOverride" );
                        var iddirOverrideDefault = stringIDToTypeID( "dirOverrideDefault" );
                        desc14.putEnumerated( iddirOverride, iddirOverride, iddirOverrideDefault );
                        var idkashidas = stringIDToTypeID( "kashidas" );
                        var idkashidas = stringIDToTypeID( "kashidas" );
                        var idkashidaDefault = stringIDToTypeID( "kashidaDefault" );
                        desc14.putEnumerated( idkashidas, idkashidas, idkashidaDefault );
                        var iddiacVPos = stringIDToTypeID( "diacVPos" );
                        var iddiacVPos = stringIDToTypeID( "diacVPos" );
                        var iddiacVPosOpenType = stringIDToTypeID( "diacVPosOpenType" );
                        desc14.putEnumerated( iddiacVPos, iddiacVPos, iddiacVPosOpenType );
                        var iddiacXOffset = stringIDToTypeID( "diacXOffset" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( iddiacXOffset, idPnt, 0.000000 );
                        var iddiacYOffset = stringIDToTypeID( "diacYOffset" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( iddiacYOffset, idPnt, 0.000000 );
                        var idbaseline = stringIDToTypeID( "baseline" );
                        var idbaseline = stringIDToTypeID( "baseline" );
                        var idNrml = charIDToTypeID( "Nrml" );
                        desc14.putEnumerated( idbaseline, idbaseline, idNrml );
                        var idotbaseline = stringIDToTypeID( "otbaseline" );
                        var idotbaseline = stringIDToTypeID( "otbaseline" );
                        var idNrml = charIDToTypeID( "Nrml" );
                        desc14.putEnumerated( idotbaseline, idotbaseline, idNrml );
                        var idstrikethrough = stringIDToTypeID( "strikethrough" );
                        var idstrikethrough = stringIDToTypeID( "strikethrough" );
                        var idstrikethroughOff = stringIDToTypeID( "strikethroughOff" );
                        desc14.putEnumerated( idstrikethrough, idstrikethrough, idstrikethroughOff );
                        var idUndl = charIDToTypeID( "Undl" );
                        var idUndl = charIDToTypeID( "Undl" );
                        var idunderlineOff = stringIDToTypeID( "underlineOff" );
                        desc14.putEnumerated( idUndl, idUndl, idunderlineOff );
                        var idunderlineOffset = stringIDToTypeID( "underlineOffset" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( idunderlineOffset, idPnt, 0.000000 );
                        var idligature = stringIDToTypeID( "ligature" );
                        desc14.putBoolean( idligature, true );
                        var idaltligature = stringIDToTypeID( "altligature" );
                        desc14.putBoolean( idaltligature, false );
                        var idcontextualLigatures = stringIDToTypeID( "contextualLigatures" );
                        desc14.putBoolean( idcontextualLigatures, true );
                        var idalternateLigatures = stringIDToTypeID( "alternateLigatures" );
                        desc14.putBoolean( idalternateLigatures, false );
                        var idoldStyle = stringIDToTypeID( "oldStyle" );
                        desc14.putBoolean( idoldStyle, false );
                        var idfractions = stringIDToTypeID( "fractions" );
                        desc14.putBoolean( idfractions, false );
                        var idordinals = stringIDToTypeID( "ordinals" );
                        desc14.putBoolean( idordinals, false );
                        var idswash = stringIDToTypeID( "swash" );
                        desc14.putBoolean( idswash, false );
                        var idtitling = stringIDToTypeID( "titling" );
                        desc14.putBoolean( idtitling, false );
                        var idconnectionForms = stringIDToTypeID( "connectionForms" );
                        desc14.putBoolean( idconnectionForms, true );
                        var idstylisticAlternates = stringIDToTypeID( "stylisticAlternates" );
                        desc14.putBoolean( idstylisticAlternates, false );
                        var idornaments = stringIDToTypeID( "ornaments" );
                        desc14.putBoolean( idornaments, false );
                        var idjustificationAlternates = stringIDToTypeID( "justificationAlternates" );
                        desc14.putBoolean( idjustificationAlternates, false );
                        var idfigureStyle = stringIDToTypeID( "figureStyle" );
                        var idfigureStyle = stringIDToTypeID( "figureStyle" );
                        var idNrml = charIDToTypeID( "Nrml" );
                        desc14.putEnumerated( idfigureStyle, idfigureStyle, idNrml );
                        var idproportionalMetrics = stringIDToTypeID( "proportionalMetrics" );
                        desc14.putBoolean( idproportionalMetrics, false );
                        var idkana = stringIDToTypeID( "kana" );
                        desc14.putBoolean( idkana, false );
                        var iditalics = stringIDToTypeID( "italics" );
                        desc14.putBoolean( iditalics, false );
                        var idruby = stringIDToTypeID( "ruby" );
                        desc14.putBoolean( idruby, false );
                        var idbaselineDirection = stringIDToTypeID( "baselineDirection" );
                        var idbaselineDirection = stringIDToTypeID( "baselineDirection" );
                        var idwithStream = stringIDToTypeID( "withStream" );
                        desc14.putEnumerated( idbaselineDirection, idbaselineDirection, idwithStream );
                        var idtextLanguage = stringIDToTypeID( "textLanguage" );
                        var idtextLanguage = stringIDToTypeID( "textLanguage" );
                        var idenglishLanguage = stringIDToTypeID( "englishLanguage" );
                        desc14.putEnumerated( idtextLanguage, idtextLanguage, idenglishLanguage );
                        var idjapaneseAlternate = stringIDToTypeID( "japaneseAlternate" );
                        var idjapaneseAlternate = stringIDToTypeID( "japaneseAlternate" );
                        var iddefaultForm = stringIDToTypeID( "defaultForm" );
                        desc14.putEnumerated( idjapaneseAlternate, idjapaneseAlternate, iddefaultForm );
                        var idmojiZume = stringIDToTypeID( "mojiZume" );
                        desc14.putDouble( idmojiZume, 0.000000 );
                        var idgridAlignment = stringIDToTypeID( "gridAlignment" );
                        var idgridAlignment = stringIDToTypeID( "gridAlignment" );
                        var idroman = stringIDToTypeID( "roman" );
                        desc14.putEnumerated( idgridAlignment, idgridAlignment, idroman );
                        var idenableWariChu = stringIDToTypeID( "enableWariChu" );
                        desc14.putBoolean( idenableWariChu, false );
                        var idwariChuCount = stringIDToTypeID( "wariChuCount" );
                        desc14.putInteger( idwariChuCount, 2 );
                        var idwariChuLineGap = stringIDToTypeID( "wariChuLineGap" );
                        desc14.putInteger( idwariChuLineGap, 0 );
                        var idwariChuScale = stringIDToTypeID( "wariChuScale" );
                        desc14.putDouble( idwariChuScale, 0.500000 );
                        var idwariChuWidow = stringIDToTypeID( "wariChuWidow" );
                        desc14.putInteger( idwariChuWidow, 2 );
                        var idwariChuOrphan = stringIDToTypeID( "wariChuOrphan" );
                        desc14.putInteger( idwariChuOrphan, 2 );
                        var idwariChuJustification = stringIDToTypeID( "wariChuJustification" );
                        var idwariChuJustification = stringIDToTypeID( "wariChuJustification" );
                        var idwariChuAutoJustify = stringIDToTypeID( "wariChuAutoJustify" );
                        desc14.putEnumerated( idwariChuJustification, idwariChuJustification, idwariChuAutoJustify );
                        var idtcyUpDown = stringIDToTypeID( "tcyUpDown" );
                        desc14.putInteger( idtcyUpDown, 0 );
                        var idtcyLeftRight = stringIDToTypeID( "tcyLeftRight" );
                        desc14.putInteger( idtcyLeftRight, 0 );
                        var idleftAki = stringIDToTypeID( "leftAki" );
                        desc14.putDouble( idleftAki, -1.000000 );
                        var idrightAki = stringIDToTypeID( "rightAki" );
                        desc14.putDouble( idrightAki, -1.000000 );
                        var idjiDori = stringIDToTypeID( "jiDori" );
                        desc14.putInteger( idjiDori, 0 );
                        var idnoBreak = stringIDToTypeID( "noBreak" );
                        desc14.putBoolean( idnoBreak, false );
                        var idClr = charIDToTypeID( "Clr " );
                            var desc15 = new ActionDescriptor();
                            var idRd = charIDToTypeID( "Rd  " );
                            desc15.putDouble( idRd, 30.217500 );
                            var idGrn = charIDToTypeID( "Grn " );
                            desc15.putDouble( idGrn, 76.104756 );
                            var idBl = charIDToTypeID( "Bl  " );
                            desc15.putDouble( idBl, 114.999902 );
                        var idRGBC = charIDToTypeID( "RGBC" );
                        desc14.putObject( idClr, idRGBC, desc15 );
                        var idstrokeColor = stringIDToTypeID( "strokeColor" );
                            var desc16 = new ActionDescriptor();
                            var idRd = charIDToTypeID( "Rd  " );
                            desc16.putDouble( idRd, 30.217500 );
                            var idGrn = charIDToTypeID( "Grn " );
                            desc16.putDouble( idGrn, 76.104756 );
                            var idBl = charIDToTypeID( "Bl  " );
                            desc16.putDouble( idBl, 114.999902 );
                        var idRGBC = charIDToTypeID( "RGBC" );
                        desc14.putObject( idstrokeColor, idRGBC, desc16 );
                        var idFl = charIDToTypeID( "Fl  " );
                        desc14.putBoolean( idFl, true );
                        var idStrk = charIDToTypeID( "Strk" );
                        desc14.putBoolean( idStrk, false );
                        var idfillFirst = stringIDToTypeID( "fillFirst" );
                        desc14.putBoolean( idfillFirst, false );
                        var idfillOverPrint = stringIDToTypeID( "fillOverPrint" );
                        desc14.putBoolean( idfillOverPrint, false );
                        var idstrokeOverPrint = stringIDToTypeID( "strokeOverPrint" );
                        desc14.putBoolean( idstrokeOverPrint, false );
                        var idlineCap = stringIDToTypeID( "lineCap" );
                        var idlineCap = stringIDToTypeID( "lineCap" );
                        var idbuttCap = stringIDToTypeID( "buttCap" );
                        desc14.putEnumerated( idlineCap, idlineCap, idbuttCap );
                        var idlineJoin = stringIDToTypeID( "lineJoin" );
                        var idlineJoin = stringIDToTypeID( "lineJoin" );
                        var idmiterJoin = stringIDToTypeID( "miterJoin" );
                        desc14.putEnumerated( idlineJoin, idlineJoin, idmiterJoin );
                        var idlineWidth = stringIDToTypeID( "lineWidth" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( idlineWidth, idPnt, 1.050280 );
                        var idmiterLimit = stringIDToTypeID( "miterLimit" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc14.putUnitDouble( idmiterLimit, idPnt, 1.050280 );
                        var idlineDashoffset = stringIDToTypeID( "lineDashoffset" );
                        desc14.putDouble( idlineDashoffset, 0.000000 );
                    var idTxtS = charIDToTypeID( "TxtS" );
                    desc13.putObject( idTxtS, idTxtS, desc14 );
                var idTxtt = charIDToTypeID( "Txtt" );
                list2.putObject( idTxtt, desc13 );
            desc6.putList( idTxtt, list2 );
            var idparagraphStyleRange = stringIDToTypeID( "paragraphStyleRange" );
                var list3 = new ActionList();
                    var desc17 = new ActionDescriptor();
                    var idFrom = charIDToTypeID( "From" );
                    desc17.putInteger( idFrom, 0 );
                    var idT = charIDToTypeID( "T   " );
                    desc17.putInteger( idT, 28 );
                    var idparagraphStyle = stringIDToTypeID( "paragraphStyle" );
                        var desc18 = new ActionDescriptor();
                        var idstyleSheetHasParent = stringIDToTypeID( "styleSheetHasParent" );
                        desc18.putBoolean( idstyleSheetHasParent, true );
                        var idAlgn = charIDToTypeID( "Algn" );
                        var idAlg = charIDToTypeID( "Alg " );
                        var idLeft = charIDToTypeID( "Left" );
                        desc18.putEnumerated( idAlgn, idAlg, idLeft );
                        var idfirstLineIndent = stringIDToTypeID( "firstLineIndent" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc18.putUnitDouble( idfirstLineIndent, idPnt, 0.000000 );
                        var idstartIndent = stringIDToTypeID( "startIndent" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc18.putUnitDouble( idstartIndent, idPnt, 0.000000 );
                        var idendIndent = stringIDToTypeID( "endIndent" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc18.putUnitDouble( idendIndent, idPnt, 0.000000 );
                        var idspaceBefore = stringIDToTypeID( "spaceBefore" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc18.putUnitDouble( idspaceBefore, idPnt, 0.000000 );
                        var idspaceAfter = stringIDToTypeID( "spaceAfter" );
                        var idPnt = charIDToTypeID( "#Pnt" );
                        desc18.putUnitDouble( idspaceAfter, idPnt, 0.000000 );
                        var iddropCapMultiplier = stringIDToTypeID( "dropCapMultiplier" );
                        desc18.putInteger( iddropCapMultiplier, 1 );
                        var idautoLeadingPercentage = stringIDToTypeID( "autoLeadingPercentage" );
                        desc18.putDouble( idautoLeadingPercentage, 1.200000 );
                        var idleadingType = stringIDToTypeID( "leadingType" );
                        var idleadingType = stringIDToTypeID( "leadingType" );
                        var idleadingBelow = stringIDToTypeID( "leadingBelow" );
                        desc18.putEnumerated( idleadingType, idleadingType, idleadingBelow );
                        var iddirectionType = stringIDToTypeID( "directionType" );
                        var iddirectionType = stringIDToTypeID( "directionType" );
                        var iddirLeftToRight = stringIDToTypeID( "dirLeftToRight" );
                        desc18.putEnumerated( iddirectionType, iddirectionType, iddirLeftToRight );
                        var idjustificationMethodType = stringIDToTypeID( "justificationMethodType" );
                        var idjustificationMethodType = stringIDToTypeID( "justificationMethodType" );
                        var idjustifMethodDefault = stringIDToTypeID( "justifMethodDefault" );
                        desc18.putEnumerated( idjustificationMethodType, idjustificationMethodType, idjustifMethodDefault );
                        var idhyphenate = stringIDToTypeID( "hyphenate" );
                        desc18.putBoolean( idhyphenate, false );
                        var idhyphenateWordSize = stringIDToTypeID( "hyphenateWordSize" );
                        desc18.putInteger( idhyphenateWordSize, 6 );
                        var idhyphenatePreLength = stringIDToTypeID( "hyphenatePreLength" );
                        desc18.putInteger( idhyphenatePreLength, 2 );
                        var idhyphenatePostLength = stringIDToTypeID( "hyphenatePostLength" );
                        desc18.putInteger( idhyphenatePostLength, 2 );
                        var idhyphenateLimit = stringIDToTypeID( "hyphenateLimit" );
                        desc18.putInteger( idhyphenateLimit, 0 );
                        var idhyphenationZone = stringIDToTypeID( "hyphenationZone" );
                        desc18.putDouble( idhyphenationZone, 36.000000 );
                        var idhyphenateCapitalized = stringIDToTypeID( "hyphenateCapitalized" );
                        desc18.putBoolean( idhyphenateCapitalized, true );
                        var idhyphenationPreference = stringIDToTypeID( "hyphenationPreference" );
                        desc18.putDouble( idhyphenationPreference, 0.500000 );
                        var idjustificationWordMinimum = stringIDToTypeID( "justificationWordMinimum" );
                        desc18.putDouble( idjustificationWordMinimum, 0.800000 );
                        var idjustificationWordDesired = stringIDToTypeID( "justificationWordDesired" );
                        desc18.putDouble( idjustificationWordDesired, 1.000000 );
                        var idjustificationWordMaximum = stringIDToTypeID( "justificationWordMaximum" );
                        desc18.putDouble( idjustificationWordMaximum, 1.330000 );
                        var idjustificationLetterMinimum = stringIDToTypeID( "justificationLetterMinimum" );
                        desc18.putDouble( idjustificationLetterMinimum, 0.000000 );
                        var idjustificationLetterDesired = stringIDToTypeID( "justificationLetterDesired" );
                        desc18.putDouble( idjustificationLetterDesired, 0.000000 );
                        var idjustificationLetterMaximum = stringIDToTypeID( "justificationLetterMaximum" );
                        desc18.putDouble( idjustificationLetterMaximum, 0.000000 );
                        var idjustificationGlyphMinimum = stringIDToTypeID( "justificationGlyphMinimum" );
                        desc18.putDouble( idjustificationGlyphMinimum, 1.000000 );
                        var idjustificationGlyphDesired = stringIDToTypeID( "justificationGlyphDesired" );
                        desc18.putDouble( idjustificationGlyphDesired, 1.000000 );
                        var idjustificationGlyphMaximum = stringIDToTypeID( "justificationGlyphMaximum" );
                        desc18.putDouble( idjustificationGlyphMaximum, 1.000000 );
                        var idsingleWordJustification = stringIDToTypeID( "singleWordJustification" );
                        var idAlg = charIDToTypeID( "Alg " );
                        var idJstA = charIDToTypeID( "JstA" );
                        desc18.putEnumerated( idsingleWordJustification, idAlg, idJstA );
                        var idhangingRoman = stringIDToTypeID( "hangingRoman" );
                        desc18.putBoolean( idhangingRoman, false );
                        var idautoTCY = stringIDToTypeID( "autoTCY" );
                        desc18.putInteger( idautoTCY, 1 );
                        var idkeepTogether = stringIDToTypeID( "keepTogether" );
                        desc18.putBoolean( idkeepTogether, true );
                        var idburasagari = stringIDToTypeID( "burasagari" );
                        var idburasagari = stringIDToTypeID( "burasagari" );
                        var idburasagariNone = stringIDToTypeID( "burasagariNone" );
                        desc18.putEnumerated( idburasagari, idburasagari, idburasagariNone );
                        var idpreferredKinsokuOrder = stringIDToTypeID( "preferredKinsokuOrder" );
                        var idpreferredKinsokuOrder = stringIDToTypeID( "preferredKinsokuOrder" );
                        var idpushIn = stringIDToTypeID( "pushIn" );
                        desc18.putEnumerated( idpreferredKinsokuOrder, idpreferredKinsokuOrder, idpushIn );
                        var idkurikaeshiMojiShori = stringIDToTypeID( "kurikaeshiMojiShori" );
                        desc18.putBoolean( idkurikaeshiMojiShori, false );
                        var idtextEveryLineComposer = stringIDToTypeID( "textEveryLineComposer" );
                        desc18.putBoolean( idtextEveryLineComposer, false );
                        var idtextComposerEngine = stringIDToTypeID( "textComposerEngine" );
                        var idtextComposerEngine = stringIDToTypeID( "textComposerEngine" );
                        var idtextLatinCJKComposer = stringIDToTypeID( "textLatinCJKComposer" );
                        desc18.putEnumerated( idtextComposerEngine, idtextComposerEngine, idtextLatinCJKComposer );
                        var iddefaultTabWidth = stringIDToTypeID( "defaultTabWidth" );
                        desc18.putDouble( iddefaultTabWidth, 36.000000 );
                        var iddefaultStyle = stringIDToTypeID( "defaultStyle" );
                            var desc19 = new ActionDescriptor();
                            var idfontPostScriptName = stringIDToTypeID( "fontPostScriptName" );
                            desc19.putString( idfontPostScriptName, """MyriadPro-Regular""" );
                            var idFntN = charIDToTypeID( "FntN" );
                            desc19.putString( idFntN, """Myriad Pro""" );
                            var idFntS = charIDToTypeID( "FntS" );
                            desc19.putString( idFntS, """Regular""" );
                            var idScrp = charIDToTypeID( "Scrp" );
                            desc19.putInteger( idScrp, 0 );
                            var idFntT = charIDToTypeID( "FntT" );
                            desc19.putInteger( idFntT, 0 );
                            var idSz = charIDToTypeID( "Sz  " );
                            var idPnt = charIDToTypeID( "#Pnt" );
                            desc19.putUnitDouble( idSz, idPnt, 48.000000 );
                            var idHrzS = charIDToTypeID( "HrzS" );
                            desc19.putDouble( idHrzS, 100.000000 );
                            var idVrtS = charIDToTypeID( "VrtS" );
                            desc19.putDouble( idVrtS, 100.000000 );
                            var idsyntheticBold = stringIDToTypeID( "syntheticBold" );
                            desc19.putBoolean( idsyntheticBold, false );
                            var idsyntheticItalic = stringIDToTypeID( "syntheticItalic" );
                            desc19.putBoolean( idsyntheticItalic, false );
                            var idautoLeading = stringIDToTypeID( "autoLeading" );
                            desc19.putBoolean( idautoLeading, true );
                            var idTrck = charIDToTypeID( "Trck" );
                            desc19.putInteger( idTrck, 0 );
                            var idBsln = charIDToTypeID( "Bsln" );
                            var idPnt = charIDToTypeID( "#Pnt" );
                            desc19.putUnitDouble( idBsln, idPnt, 0.000000 );
                            var idcharacterRotation = stringIDToTypeID( "characterRotation" );
                            desc19.putDouble( idcharacterRotation, 0.000000 );
                            var idAtKr = charIDToTypeID( "AtKr" );
                            var idAtKr = charIDToTypeID( "AtKr" );
                            var idmetricsKern = stringIDToTypeID( "metricsKern" );
                            desc19.putEnumerated( idAtKr, idAtKr, idmetricsKern );
                            var idfontCaps = stringIDToTypeID( "fontCaps" );
                            var idfontCaps = stringIDToTypeID( "fontCaps" );
                            var idNrml = charIDToTypeID( "Nrml" );
                            desc19.putEnumerated( idfontCaps, idfontCaps, idNrml );
                            var iddigitSet = stringIDToTypeID( "digitSet" );
                            var iddigitSet = stringIDToTypeID( "digitSet" );
                            var iddefaultDigits = stringIDToTypeID( "defaultDigits" );
                            desc19.putEnumerated( iddigitSet, iddigitSet, iddefaultDigits );
                            var iddirOverride = stringIDToTypeID( "dirOverride" );
                            var iddirOverride = stringIDToTypeID( "dirOverride" );
                            var iddirOverrideDefault = stringIDToTypeID( "dirOverrideDefault" );
                            desc19.putEnumerated( iddirOverride, iddirOverride, iddirOverrideDefault );
                            var idkashidas = stringIDToTypeID( "kashidas" );
                            var idkashidas = stringIDToTypeID( "kashidas" );
                            var idkashidaDefault = stringIDToTypeID( "kashidaDefault" );
                            desc19.putEnumerated( idkashidas, idkashidas, idkashidaDefault );
                            var iddiacVPos = stringIDToTypeID( "diacVPos" );
                            var iddiacVPos = stringIDToTypeID( "diacVPos" );
                            var iddiacVPosOpenType = stringIDToTypeID( "diacVPosOpenType" );
                            desc19.putEnumerated( iddiacVPos, iddiacVPos, iddiacVPosOpenType );
                            var iddiacXOffset = stringIDToTypeID( "diacXOffset" );
                            var idPnt = charIDToTypeID( "#Pnt" );
                            desc19.putUnitDouble( iddiacXOffset, idPnt, 0.000000 );
                            var iddiacYOffset = stringIDToTypeID( "diacYOffset" );
                            var idPnt = charIDToTypeID( "#Pnt" );
                            desc19.putUnitDouble( iddiacYOffset, idPnt, 0.000000 );
                            var idbaseline = stringIDToTypeID( "baseline" );
                            var idbaseline = stringIDToTypeID( "baseline" );
                            var idNrml = charIDToTypeID( "Nrml" );
                            desc19.putEnumerated( idbaseline, idbaseline, idNrml );
                            var idotbaseline = stringIDToTypeID( "otbaseline" );
                            var idotbaseline = stringIDToTypeID( "otbaseline" );
                            var idNrml = charIDToTypeID( "Nrml" );
                            desc19.putEnumerated( idotbaseline, idotbaseline, idNrml );
                            var idstrikethrough = stringIDToTypeID( "strikethrough" );
                            var idstrikethrough = stringIDToTypeID( "strikethrough" );
                            var idstrikethroughOff = stringIDToTypeID( "strikethroughOff" );
                            desc19.putEnumerated( idstrikethrough, idstrikethrough, idstrikethroughOff );
                            var idUndl = charIDToTypeID( "Undl" );
                            var idUndl = charIDToTypeID( "Undl" );
                            var idunderlineOff = stringIDToTypeID( "underlineOff" );
                            desc19.putEnumerated( idUndl, idUndl, idunderlineOff );
                            var idunderlineOffset = stringIDToTypeID( "underlineOffset" );
                            var idPnt = charIDToTypeID( "#Pnt" );
                            desc19.putUnitDouble( idunderlineOffset, idPnt, 0.000000 );
                            var idligature = stringIDToTypeID( "ligature" );
                            desc19.putBoolean( idligature, true );
                            var idaltligature = stringIDToTypeID( "altligature" );
                            desc19.putBoolean( idaltligature, false );
                            var idcontextualLigatures = stringIDToTypeID( "contextualLigatures" );
                            desc19.putBoolean( idcontextualLigatures, false );
                            var idalternateLigatures = stringIDToTypeID( "alternateLigatures" );
                            desc19.putBoolean( idalternateLigatures, false );
                            var idoldStyle = stringIDToTypeID( "oldStyle" );
                            desc19.putBoolean( idoldStyle, false );
                            var idfractions = stringIDToTypeID( "fractions" );
                            desc19.putBoolean( idfractions, false );
                            var idordinals = stringIDToTypeID( "ordinals" );
                            desc19.putBoolean( idordinals, false );
                            var idswash = stringIDToTypeID( "swash" );
                            desc19.putBoolean( idswash, false );
                            var idtitling = stringIDToTypeID( "titling" );
                            desc19.putBoolean( idtitling, false );
                            var idconnectionForms = stringIDToTypeID( "connectionForms" );
                            desc19.putBoolean( idconnectionForms, false );
                            var idstylisticAlternates = stringIDToTypeID( "stylisticAlternates" );
                            desc19.putBoolean( idstylisticAlternates, false );
                            var idornaments = stringIDToTypeID( "ornaments" );
                            desc19.putBoolean( idornaments, false );
                            var idjustificationAlternates = stringIDToTypeID( "justificationAlternates" );
                            desc19.putBoolean( idjustificationAlternates, false );
                            var idfigureStyle = stringIDToTypeID( "figureStyle" );
                            var idfigureStyle = stringIDToTypeID( "figureStyle" );
                            var idNrml = charIDToTypeID( "Nrml" );
                            desc19.putEnumerated( idfigureStyle, idfigureStyle, idNrml );
                            var idproportionalMetrics = stringIDToTypeID( "proportionalMetrics" );
                            desc19.putBoolean( idproportionalMetrics, false );
                            var idkana = stringIDToTypeID( "kana" );
                            desc19.putBoolean( idkana, false );
                            var iditalics = stringIDToTypeID( "italics" );
                            desc19.putBoolean( iditalics, false );
                            var idruby = stringIDToTypeID( "ruby" );
                            desc19.putBoolean( idruby, false );
                            var idbaselineDirection = stringIDToTypeID( "baselineDirection" );
                            var idbaselineDirection = stringIDToTypeID( "baselineDirection" );
                            var idrotated = stringIDToTypeID( "rotated" );
                            desc19.putEnumerated( idbaselineDirection, idbaselineDirection, idrotated );
                            var idtextLanguage = stringIDToTypeID( "textLanguage" );
                            var idtextLanguage = stringIDToTypeID( "textLanguage" );
                            var idenglishLanguage = stringIDToTypeID( "englishLanguage" );
                            desc19.putEnumerated( idtextLanguage, idtextLanguage, idenglishLanguage );
                            var idmojiZume = stringIDToTypeID( "mojiZume" );
                            desc19.putDouble( idmojiZume, 0.000000 );
                            var idgridAlignment = stringIDToTypeID( "gridAlignment" );
                            var idgridAlignment = stringIDToTypeID( "gridAlignment" );
                            var idroman = stringIDToTypeID( "roman" );
                            desc19.putEnumerated( idgridAlignment, idgridAlignment, idroman );
                            var idenableWariChu = stringIDToTypeID( "enableWariChu" );
                            desc19.putBoolean( idenableWariChu, false );
                            var idwariChuCount = stringIDToTypeID( "wariChuCount" );
                            desc19.putInteger( idwariChuCount, 2 );
                            var idwariChuLineGap = stringIDToTypeID( "wariChuLineGap" );
                            desc19.putInteger( idwariChuLineGap, 0 );
                            var idwariChuScale = stringIDToTypeID( "wariChuScale" );
                            desc19.putDouble( idwariChuScale, 0.500000 );
                            var idwariChuWidow = stringIDToTypeID( "wariChuWidow" );
                            desc19.putInteger( idwariChuWidow, 2 );
                            var idwariChuOrphan = stringIDToTypeID( "wariChuOrphan" );
                            desc19.putInteger( idwariChuOrphan, 2 );
                            var idwariChuJustification = stringIDToTypeID( "wariChuJustification" );
                            var idwariChuJustification = stringIDToTypeID( "wariChuJustification" );
                            var idwariChuAutoJustify = stringIDToTypeID( "wariChuAutoJustify" );
                            desc19.putEnumerated( idwariChuJustification, idwariChuJustification, idwariChuAutoJustify );
                            var idtcyUpDown = stringIDToTypeID( "tcyUpDown" );
                            desc19.putInteger( idtcyUpDown, 0 );
                            var idtcyLeftRight = stringIDToTypeID( "tcyLeftRight" );
                            desc19.putInteger( idtcyLeftRight, 0 );
                            var idleftAki = stringIDToTypeID( "leftAki" );
                            desc19.putDouble( idleftAki, -1.000000 );
                            var idrightAki = stringIDToTypeID( "rightAki" );
                            desc19.putDouble( idrightAki, -1.000000 );
                            var idjiDori = stringIDToTypeID( "jiDori" );
                            desc19.putInteger( idjiDori, 0 );
                            var idnoBreak = stringIDToTypeID( "noBreak" );
                            desc19.putBoolean( idnoBreak, false );
                            var idClr = charIDToTypeID( "Clr " );
                                var desc20 = new ActionDescriptor();
                                var idRd = charIDToTypeID( "Rd  " );
                                desc20.putDouble( idRd, 0.000000 );
                                var idGrn = charIDToTypeID( "Grn " );
                                desc20.putDouble( idGrn, 0.000000 );
                                var idBl = charIDToTypeID( "Bl  " );
                                desc20.putDouble( idBl, 0.000000 );
                            var idRGBC = charIDToTypeID( "RGBC" );
                            desc19.putObject( idClr, idRGBC, desc20 );
                            var idstrokeColor = stringIDToTypeID( "strokeColor" );
                                var desc21 = new ActionDescriptor();
                              

    That is awesome, works perfectly.
    I'll get it worked into my main script. Is this Action Manager code, and not just regular Javascript from the Scripting Dictionary? I can't tell the difference. I'll see whether or not it's actually faster than Applescript.
    Thanks. I know Scripting Listener records a bunch of stuff, but it's pretty amazing to me that playing back this line does the same thing that playing back the 1,011 lines Scripting Listener puts out.
    Thanks.

  • How to update a large (over 4 million item) List(Of Byte) quickly by altering indexes contained in a Dictionary(Of Integer, Byte) where the Dictionaries keys are the indexes in the List(Of Byte) that need to be changed to the values for those indexes?

       I'm having some difficulty with transferring images from a UDP Client to a UDP Server. The issue is receiving the bytes necessary to update an original image sent from the Client to the Server and updating the Servers List(Of Byte) with the
    new bytes replacing bytes in that list. This is a simplex connection where the Sever receives and the Client sends to utilize the least amount of bandwidth for a "Remote Desktop" style application where the Server side needs image updates of whatever
    occurs on the Client desktop.
       So far I can tranfer images with no issue. The images can be be any image type (.Bmp, .Gif, .JPeg, .Png, etc). I was working with sending .JPeg's as they appear to be the smallest size image when a Bitmap is saved to a memory stream as type
    .JPeg. And then I am using GZip to compress that byte array again so it is much smaller. However on a loopback on my NIC the speed for sending a full size screen capture is not very fast as the Server updates fairly slowly unless the Clients screen capture
    Bitmap is reduced in size to about 1/3'd of the original size. Then about 12000 bytes or less are sent for each update.
       Due to .JPeg compression I suppose there is no way to get the difference in bytes between two .JPegs and only send those when something occurs on the desktop that alters the desktop screen capture image. Therefore I went to using .Bmp's as each
    .Bmp contains the same number of bytes in its array regardless of the image alterations on the desktop. So I suppose the difference in bytes from a second screen capture and an inital screen capture are what is different in the second image from the initial
    image.
       What I have done so far is save an initial Bitmap of a screen capture using a memory stream and saving as type .Bmp which takes less than 93 milliseconds for 4196406 bytes. Compressing that takes less than 118 milliseconds to 197325 bytes for
    the current windows on the desktop. When that is done PictureBox1 is updated from nothing to the captured image as the PictureBox's background image with image layout zoom and the PictureBox sized at 1/2 my screens width and 1/2 my screens height.
       Then I save a new Bitmap the same way which now contains different image information as the PictureBox is now displaying an image so its back color is no longer displayed (solid color Aqua) and the cursor has moved to a different location. The
    second Bitmap is also 4196406 in bytes and compressed it was 315473 bytes in size.
       I also just found code from this link Converting a Bitmap to a Byte Array (and Byte Array to Bitmap) which gets a byte array
    directly from a Bitmap and the size of that is 3148800 for whatever is full screen captured on my laptop. So I should be able to work with smaller byte arrays at some point.
       The issue I'm having is that once the Client sends an image of the desktop to the Server I only want to update the server with any differences occuring on the Clients desktop. So what I have done is compare the first screen captures bytes (stored
    in a List(Of Byte)) to the second screen captures bytes (stored in a List(Of Byte)) by using a For/Next for 0 to 4196405 where if a byte in the first screen captures List is not equal to a byte in the second screen captures List I add the index and byte of
    the second screen captures list to a Dictionary(Of Integer, Byte). The Dictionary then only contains the indexes and bytes that are different between the first screen capture and second screen capture. This takes about 125 milliseconds which I think is pretty
    fast for 4196406 byte comparison using a For/Next and adding all the different bytes and indexes for each byte to a Dictionary.
        The difference in Bytes between the inital screen capture and the second screen capture is 242587 as an example which changes of course. For that amount of bytes the Dictionary contains 242587 integers as indexes and 242587 bytes as different
    bytes totaling 485174 bytes for both arrays (keys, values).  Compressed the indexes go from 242587 to 43489 bytes and the values go from 242587 to 34982 bytes. Which means I will have to send 78, 481 bytes from the Client to the Server to update the display
    on the server. Quite smaller than the original 4196406 bytes of the second Bitmap saved to type .Bmp or the compressed size of that array which was 315473 bytes. Plus a few bytes I add as overhead so the server knows when an image array ends and how many packets
    were sent for the array so it can discard complete arrays if necessary since UDP is lossfull although probably not so much in current networks like it may originally have been when the internet started.
        In reality the data from the Client to the Server will mostly be the cursor as it moves and updating the Server image with only a few hundred bytes I would imagine at a time. Or when the cursor selects a Button for example and the Buttons
    color changes causing those differences in the original screen capture.
       But the problem is if I send the Dictionaries Indexes and Bytes to the Server then I need to update the original Bitmap List(Of Byte) on the server by removing the Bytes in the received informations Index locations array from the Servers Bitmap
    List(Of Byte) and replacing those Bytes with the Bytes in the received informations Byte array. This takes so long using a For/Next for however many indexes are in the received informations Index array to update the Bitmap List(Of Byte) on the server using
    "Bmp1Bytes.RemoveAt(Index As Integer)" followed by "Bmp1Bytes.Insert(Index As Integer, Item As Byte)" in the For/Next.
        I've tried various For/Next statements including using a new List(Of Byte) with If statements so If the the integer for the For/Next ='s the Key in a Dictionary(Of Integer, Byte) using a Counter to provide the Dictionaries Key value then
    the Dictionaries byte value will be added to the List(Of Byte) and the counter will increas by one Else the List(Of Byte) adds the original "Bmp1Bytes" byte at that index to the new List(Of Byte). This takes forever also.
       I also tried the same For/Next adding to a new Dictionary(Of Integer, Byte) but that takes forever too.
       I think I could use RemoveRange and AddRange to speed things up. But I don't know how to retrieve a contiguous range of indexes in the received indexes that need to be updated in the servers "Bmp1Bytes" List(Of Byte) from the received
    array of indexes and bytes which are in a Dictionary(Of Integer, Byte).  But I believe this would even be slower than some realistic method for replacing all Bytes in a List(Of Byte) when I have the indexes that need to be replaced and the bytes to replace
    them with.
       Even if I just used AddRange on a new List(Of Byte) to add ranges of bytes from the original "Bmp1Bytes" and the changes from the Dictionary(Of Integer, Byte) I think this would be rather slow. Although I don't know how to do that
    by getting contiguous ranges of indexes from the Dictionaries keys.
       So I was wondering if there is some method perhaps using Linq or IEnumerable which I've been unable to figure anything out which could do this.
       I do have some copy and pasted code which I don't understand how it works that I am using which I would guess could be altered for doing something like this but I can't find information that provides how the code works.  Or even if I did
    maybe I can't understand it. Like the code below which is extremely fast.
       Dim strArray() As String = Array.ConvertAll(Of Integer, String)(BmpComparisonDict.Keys.ToArray, Function(x) x.ToString())
    La vida loca

    Monkeyboy,
    That was quite a bit to read, but still a bit unclear. Could you put a specific list of goals/questions, asked in the smallest possible form?
    It seems like either you're making a program that monitors activity on your computer, or you're writing some kind of remote pc app.
    When you do get your bytes from using lockbits, keep in mind all the files header info would be lost. I think retaining the header info is worth the extra bytes.
    The other, thing: I'm not sure if you're taking 32bpp screen shots, but also keep in mind that the "whole desktop" is the final destination for blended graphics, if that makes sense. What I mean is that there is no need to capture an "alpha"
    channel for a desktop screenshot, as alpha would always be 255, this could save you 1 byte per pixel captured... Theres nothing "behind" the desktop, therefore no alpha, and every window shown above the desktop is already blended. I suggest using
    24Bpp for a full screen capture.
    Your X,Y information for the mouse could be stored as UINT16, this would save you a measly 2 bytes per location update/save.
    When you update your byte arrays, maybe you can turn the array into a stream and write to whatever index, however many bytes, that should prevent a "Shift" of bytes, and instead overwrite any bytes that "get in the way".
    ex
    Dim example As String = "This is an example."
    Dim insertString As String = "was"
    Dim insertBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(insertString)
    Dim bytes As Byte() = System.Text.Encoding.ASCII.GetBytes(example)
    Dim modifiedBytes As Byte() = {}
    Using ms As New System.IO.MemoryStream(bytes)
    ms.Position = 5
    ms.Write(insertBytes, 0, 3)
    modifiedBytes = ms.ToArray
    End Using
    Dim newString As String = System.Text.Encoding.ASCII.GetString(modifiedBytes)
    'Notice how below there isn't the word "is" anymore, and that there isn't a
    'space.
    'This demonstrates that you overwrite existing data, versus shifting everything to
    'the right.
    'Returns: This wasan example.
    MsgBox(newString)
    “If you want something you've never had, you need to do something you've never done.”
    Don't forget to mark
    helpful posts and answers
    ! Answer an interesting question? Write a
    new article
    about it! My Articles
    *This post does not reflect the opinion of Microsoft, or its employees.
    Well it's too much to read. I was really tired when I wrote it. Even the below is too much to read but perhaps gets the point across of what I would like to do which I think
    Joel Engineer may have answered but I'm not sure. As I'm still too tired to understand that yet and research what he said in order to figure it out yet.
    But maybe the code below can provide the concept of the operation with the comments in it. But seeing as how I'm still tired it may be confused.
    Option Strict On
    Imports System.Windows.Forms
    Imports System.IO
    Imports System.IO.Compression
    Imports System.Drawing.Imaging
    Imports System.Runtime.InteropServices
    Public Class Form1
    Dim Bmp1Bytes As New List(Of Byte)
    Dim Bmp1BytesCompressed As New List(Of Byte)
    Dim Bmp2Bytes As New List(Of Byte)
    Dim BmpComparisonDict As New Dictionary(Of Integer, Byte)
    Dim BmpDifferenceIndexesCompressed As New List(Of Byte)
    Dim BmpDifferenceBytesCompressed As New List(Of Byte)
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SomeSub()
    End Sub
    Private Sub SomeSub()
    ' Pretend this code is in UDP Client app. A screen capture is performed of the desktop. Takes about 90 milliseconds.
    Bmp1Bytes.Clear()
    Using BMP1 As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
    Using g1 As Graphics = Graphics.FromImage(BMP1)
    g1.CopyFromScreen(0, 0, 0, 0, BMP1.Size)
    Cursor.Draw(g1, New Rectangle(Cursor.Position.X, Cursor.Position.Y, Cursor.Size.Width, Cursor.Size.Height))
    Using MS As New MemoryStream
    BMP1.Save(MS, System.Drawing.Imaging.ImageFormat.Bmp)
    Bmp1Bytes.AddRange(MS.ToArray)
    End Using
    End Using
    End Using
    Bmp1BytesCompressed.AddRange(Compress(Bmp1Bytes.ToArray))
    ' UDP Client app sends Bmp1BytesCompressed.ToArray to UDP Server which is the entire image of the desktop that the UDP
    ' Client is on. This image takes awhile to send since compressed it is about 177000 bytes from over 4000000 bytes.
    ' I will be using different code just to get the bytes from the actual Bitmap in the future. That is not important for now.
    ' Pretend the UDP Server has received the bytes, decompressed the array received into a List(Of Byte) and is displaying
    ' the image of the UDP Clients desktop in a PictureBox.
    ' Now the image on the UDP Clients desktop changes due to the mouse cursor moving as an example. Therefore a new Bitmap
    ' is created from a screen capture. This takes about 90 milliseconds.
    Bmp2Bytes.Clear()
    Using BMP2 As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
    Using g1 As Graphics = Graphics.FromImage(BMP2)
    g1.CopyFromScreen(0, 0, 0, 0, BMP2.Size)
    Cursor.Draw(g1, New Rectangle(Cursor.Position.X, Cursor.Position.Y, Cursor.Size.Width, Cursor.Size.Height))
    Using MS As New MemoryStream
    BMP2.Save(MS, System.Drawing.Imaging.ImageFormat.Bmp)
    Bmp2Bytes.AddRange(MS.ToArray)
    End Using
    End Using
    End Using
    ' Now I have the original images bytes in Bmp1Bytes and the new images bytes in Bmp2Bytes on the UDP Client. But I don't
    ' want to send all of the bytes in Bmp2Bytes to the UDP Server. Just the indexes of and the bytes that are different in
    ' Bmp2Bytes from Bmp1Bytes.
    ' This takes less than 100 milliseconds for what I've tested so far where over 500000 bytes in Bmp2Bytes are different
    ' than the bytes in Bmp1Bytes. Usually that amount would be much less. But during testing I was displaying the image
    ' from Bmp1 bytes in a PictureBox so a large amount of data would change between the first screen shot, the PictureBox
    ' then displaying an image on the same PC and then the second screen shot.
    BmpComparisonDict.Clear()
    For i = 0 To Bmp1Bytes.Count - 1
    If Bmp1Bytes(i) <> Bmp2Bytes(i) Then
    BmpComparisonDict.Add(i, Bmp2Bytes(i))
    End If
    Next
    ' So now I have all the difference bytes and their indexes from Bmp2Bytes in the BmpComparisonDict. So I compress
    ' the indexes into on List and the Bytes into another List.
    BmpDifferenceIndexesCompressed.Clear()
    BmpDifferenceBytesCompressed.Clear()
    BmpDifferenceIndexesCompressed.AddRange(Compress(BmpComparisonDict.Keys.SelectMany(Function(d) BitConverter.GetBytes(d)).ToArray()))
    BmpDifferenceBytesCompressed.AddRange(Compress(BmpComparisonDict.Values.ToArray))
    ' Now pretend the UDP Client has sent both those arrays to the UDP Server which has added both decompressed arrays
    ' to a Dictionary(Of Integer, Byte). And the server has the original image decompressed bytes received in a List
    ' called Bmp1Bytes also.
    ' This is where I am stuck. The UDP Server has the Dictionary. That part was fast. However there is no
    ' fast method I have found for creating a new List(Of Byte) where bytes in the originally received List(Of Byte) that
    ' do not have to be altered are placed into a new List(Of Byte) except for the indexes listed in the
    ' Dictionary(Of Integer, Byte) that need to be placed into the appropriate index locations of the new List(Of Byte).
    ' The below example for doing so is exceptionally slow. Pretend UpdateDictionary has all of the decompressed indexes
    ' and bytes received by the UDP Server for the update contained within it.
    Dim UpdateDictionary As New Dictionary(Of Integer, Byte)
    Dim UpdatedBytes As New List(Of Byte)
    Dim Counter As Integer = 0
    For i = 0 To Bmp1Bytes.Count - 1
    If i = UpdateDictionary.Keys(Counter) Then ' Provides the index contained in the Keys for the Dictionary
    UpdatedBytes.Add(UpdateDictionary.Values(Counter))
    Counter += 1
    If Counter > UpdateDictionary.Count - 1 Then Counter = 0
    Else
    UpdatedBytes.Add(Bmp1Bytes(i))
    End If
    Next
    ' So what I'm trying to do is find an extremely fast method for performing something similar to what the
    ' above operation performs.
    End Sub
    Private Function Compress(BytesToCompress() As Byte) As List(Of Byte)
    Dim BytesCompressed As New List(Of Byte)
    Using compressedStream = New MemoryStream()
    Using zipStream = New GZipStream(compressedStream, CompressionMode.Compress)
    zipStream.Write(BytesToCompress, 0, BytesToCompress.Count)
    zipStream.Close()
    BytesCompressed.AddRange(compressedStream.ToArray)
    End Using
    End Using
    Return BytesCompressed
    End Function
    Private Function Decompress(BytesToDecompress() As Byte) As List(Of Byte)
    Dim BytesDecompressed As New List(Of Byte)
    Using DecompressedStream = New MemoryStream()
    Using zipStream = New GZipStream(DecompressedStream, CompressionMode.Decompress)
    zipStream.Write(BytesToDecompress, 0, BytesToDecompress.Count)
    zipStream.Close()
    BytesDecompressed.AddRange(DecompressedStream.ToArray)
    End Using
    End Using
    Return BytesDecompressed
    End Function
    End Class
    La vida loca

Maybe you are looking for