public static void CreateLayer(string layer_name)
        {
            PSX.CheckStringContents(layer_name);

            // Desc2
            var Desc2 = PSX.MakeNewDescriptor();

            Desc2.PutString((int)con.phKeyName, layer_name);

            // Ref1
            var Ref1 = PSX.MakeNewReference();

            Ref1.PutClass((int)con.phClassLayer);

            // Desc1
            var Desc1 = PSX.MakeNewDescriptor();

            Desc1.PutReference((int)con.phKeyNull, Ref1);
            Desc1.PutBoolean(PSX.StrToID("below"), PSX.FALSE);
            Desc1.PutObject((int)con.phKeyUsing, (int)con.phClassLayer, Desc2);

            int old_layer_count = LayerAPI.GetLayerCount(-1);

            // Play the event in photoshop
            PSX.PlayEvent((int)con.phEventMake, Desc1, (int)con.phDialogSilent, PSX.PlayBehavior.checkresult);

            LayerAPI.CheckLayerCount(-1, old_layer_count + 1);
        }
        public static PhotoshopTypeLibrary.IActionDescriptor [] CreateOpacityStops(double [] OA)
        {
            const int max_location = 4096;
            const int min_location = 0;

            System.Diagnostics.Debug.Assert(OA.Length > 1);

            var opacity_stops = new PhotoshopTypeLibrary.IActionDescriptor [OA.Length];
            int count         = 0;
            int step          = max_location / (OA.Length - 1);

            foreach (double O in OA)
            {
                System.Diagnostics.Debug.Assert(O <= 100);
                System.Diagnostics.Debug.Assert(O >= 0);

                int location = max_location - (step * count);
                System.Diagnostics.Debug.Assert(location <= max_location);
                System.Diagnostics.Debug.Assert(location >= min_location);

                const int midpoint = 50;
                opacity_stops[count] = LayerAPI.CreateOpacityStop(O, location, midpoint);
                count++;
            }
            return(opacity_stops);
        }
        static public void FlattenImage()
        {
            //PhotoshopTypeLibrary.IActionDescriptor Desc1 = PSX.MakeNewDescriptor();
            PhotoshopTypeLibrary.IActionDescriptor Desc1 = null;
            // Play the event in photoshop
            PSX.PlayEvent((int)con.phEventFlattenImage, Desc1, (int)con.phDialogSilent, PSX.PlayBehavior.checkresult);

            LayerAPI.CheckLayerCount(-1, 0);
        }
        public static void RasterizeLayer(int layer_index)
        {
            // Ref1
            var Ref1 = LayerAPI.GetReferenceToLayerByIndex(layer_index);

            // Desc1
            var Desc1 = PSX.MakeNewDescriptor();

            Desc1.PutReference((int)con.phKeyNull, Ref1);

            // Play the event in photoshop
            PSX.PlayEvent(PSX.StrToID("rasterizeLayer"), Desc1, (int)con.phDialogSilent, PSX.PlayBehavior.checkresult);
        }
        public static void DeleteLayer(int layer_index)
        {
            // Ref1
            PhotoshopTypeLibrary.IActionReference Ref1 = LayerAPI.GetReferenceToLayerByIndex(layer_index);

            // Desc1
            PhotoshopTypeLibrary.IActionDescriptor Desc1 = PSX.MakeNewDescriptor();

            Desc1.PutReference((int)con.phKeyNull, Ref1);

            // Play the event in photoshop
            PSX.PlayEvent((int)con.phEventDelete, Desc1, (int)con.phDialogSilent, PSX.PlayBehavior.checkresult);
        }
        public static void CheckLayerCount(int doc_index, int expected_count)
        {
            ///
            /// <summary>
            /// Raises an exception of the document count is not what is expected
            ///	Workitem: Move some of this checking into PSX
            /// </summary>
            ///

            int actual_layer_count = LayerAPI.GetLayerCount(doc_index);

            if (actual_layer_count != expected_count)
            {
                string msg = string.Format("Expected layer count of {0}, got {1} instead", actual_layer_count, expected_count);
                throw (new Photoshop6OM.PhotoshoProxyError(msg));
            }
        }
        public static PhotoshopTypeLibrary.IActionDescriptor [] CreateColorStops(System.Drawing.Color [] CA)
        {
            const int max_location = 4096;
            const int min_location = 0;

            System.Diagnostics.Debug.Assert(CA.Length > 1);

            var color_stops = new PhotoshopTypeLibrary.IActionDescriptor [CA.Length];
            int count       = 0;
            int step        = max_location / (CA.Length - 1);

            foreach (System.Drawing.Color C in CA)
            {
                int location = max_location - (step * count);
                System.Diagnostics.Debug.Assert(location <= max_location);
                System.Diagnostics.Debug.Assert(location >= min_location);

                const int midpoint = 50;
                color_stops[count] = LayerAPI.CreateColorStop(C, location, midpoint);
                count++;
            }
            return(color_stops);
        }
        public static void CreateTextLayer(string text, string fontname, int fontsize, string fontstyle, int antialias)
        {
            PSX.CheckEnum(fontstyle, "Regular", "Bold Italic", "Italic", "Bold");
            PSX.CheckEnum(antialias, (int)con.phEnumAntiAliasCrisp, (int)con.phEnumAntiAliasStrong, (int)con.phEnumAntiAliasSmooth, (int)con.phEnumAntiAliasNone);

            // Desc10
            var Desc10 = PSX.MakeNewDescriptor();

            Desc10.PutEnumerated((int)con.phKeyAlignment, (int)con.phTypeAlignment, (int)con.phEnumLeft);
            Desc10.PutUnitDouble(PSX.StrToID("firstLineIndent"), PSX.StrToID("pointsUnit"), 0);
            Desc10.PutUnitDouble(PSX.StrToID("startIndent"), PSX.StrToID("pointsUnit"), 0);
            Desc10.PutUnitDouble(PSX.StrToID("endIndent"), PSX.StrToID("pointsUnit"), 0);
            Desc10.PutUnitDouble(PSX.StrToID("spaceBefore"), PSX.StrToID("pointsUnit"), 0);
            Desc10.PutUnitDouble(PSX.StrToID("spaceAfter"), PSX.StrToID("pointsUnit"), 0);
            Desc10.PutBoolean(PSX.StrToID("hyphenate"), PSX.TRUE);
            Desc10.PutInteger(PSX.StrToID("hyphenateWordSize"), 8);
            Desc10.PutInteger(PSX.StrToID("hyphenatePreLength"), 3);
            Desc10.PutInteger(PSX.StrToID("hyphenatePostLength"), 3);
            Desc10.PutInteger(PSX.StrToID("hyphenateLimit"), 2);
            Desc10.PutDouble(PSX.StrToID("hyphenationZone"), 36);
            Desc10.PutBoolean(PSX.StrToID("hyphenateCapitalized"), PSX.TRUE);
            Desc10.PutDouble(PSX.StrToID("justificationWordMinimum"), 0);
            Desc10.PutDouble(PSX.StrToID("justificationWordDesired"), 1);
            Desc10.PutDouble(PSX.StrToID("justificationWordMaximum"), 1);
            Desc10.PutDouble(PSX.StrToID("justificationLetterMinimum"), 0);
            Desc10.PutDouble(PSX.StrToID("justificationLetterDesired"), 0);
            Desc10.PutDouble(PSX.StrToID("justificationLetterMaximum"), 0);
            Desc10.PutDouble(PSX.StrToID("justificationGlyphMinimum"), 1);
            Desc10.PutDouble(PSX.StrToID("justificationGlyphDesired"), 1);
            Desc10.PutDouble(PSX.StrToID("justificationGlyphMaximum"), 1);
            Desc10.PutBoolean(PSX.StrToID("hangingRoman"), PSX.FALSE);
            Desc10.PutBoolean(PSX.StrToID("burasagari"), PSX.FALSE);
            Desc10.PutEnumerated(PSX.StrToID("preferredKinsokuOrder"), PSX.StrToID("preferredKinsokuOrder"), PSX.StrToID("pushIn"));
            Desc10.PutString(PSX.StrToID("mojiKumiName"), "None");
            Desc10.PutBoolean(PSX.StrToID("textEveryLineComposer"), PSX.FALSE);
            Desc10.PutDouble(PSX.StrToID("autoLeadingPercentage"), 1);
            Desc10.PutEnumerated(PSX.StrToID("leadingType"), PSX.StrToID("leadingType"), PSX.StrToID("leadingBelow"));

            // Desc9
            var Desc9 = PSX.MakeNewDescriptor();

            Desc9.PutInteger((int)con.phKeyFrom, 0);
            Desc9.PutInteger((int)con.phKeyTo, text.Length + 1);
            Desc9.PutObject(PSX.StrToID("paragraphStyle"), PSX.StrToID("paragraphStyle"), Desc10);

            // List3
            var List3 = PSX.MakeNewList();

            List3.PutObject(PSX.StrToID("paragraphStyleRange"), Desc9);

            // Desc8
            var Desc8 = PSX.MakeNewDescriptor();

            Desc8.PutDouble((int)con.phKeyRed, 241);
            Desc8.PutDouble((int)con.phKeyGrain, 101);
            Desc8.PutDouble((int)con.phKeyBlue, 34);

            // Desc7
            var Desc7 = PSX.MakeNewDescriptor();

            //Desc7.PutString(  PSX.StrToID( "fontPostScriptName" )  ,  fontname  );
            Desc7.PutString((int)con.phKeyFontName, fontname);
            Desc7.PutString((int)con.phKeyFontStyleName, fontstyle);
            Desc7.PutInteger((int)con.phKeyFontScript, 0);
            Desc7.PutInteger((int)con.phKeyFontTechnology, 0);
            //Desc7.PutUnitDouble(  (int) con.phkey,  PSX.StrToID( "pointsUnit" )  ,  fontsize  ); SAVEEN
            Desc7.PutBoolean(PSX.StrToID("syntheticBold"), PSX.FALSE);
            Desc7.PutBoolean(PSX.StrToID("syntheticItalic"), PSX.FALSE);
            Desc7.PutBoolean(PSX.StrToID("autoLeading"), PSX.TRUE);
            Desc7.PutInteger((int)con.phKeyHorizontalScale, 100);
            Desc7.PutInteger((int)con.phKeyVerticalScale, 100);
            Desc7.PutInteger((int)con.phKeyTracking, 0);
            Desc7.PutBoolean((int)con.phKeyAutoKern, PSX.TRUE);
            Desc7.PutUnitDouble((int)con.phKeyBaselineShift, PSX.StrToID("pointsUnit"), 0);
            Desc7.PutEnumerated(PSX.StrToID("fontCaps"), PSX.StrToID("fontCaps"), (int)con.phEnumNormal);
            Desc7.PutEnumerated(PSX.StrToID("baseline"), PSX.StrToID("baseline"), (int)con.phEnumNormal);
            Desc7.PutBoolean((int)con.phKeyUnderline, PSX.FALSE);
            Desc7.PutBoolean(PSX.StrToID("strikethrough"), PSX.FALSE);
            Desc7.PutBoolean(PSX.StrToID("ligature"), PSX.TRUE);
            Desc7.PutBoolean(PSX.StrToID("oldStyle"), PSX.FALSE);
            Desc7.PutBoolean(PSX.StrToID("proportionalNumbers"), PSX.TRUE);
            Desc7.PutBoolean((int)con.phKeyRotate, PSX.TRUE);
            Desc7.PutEnumerated(PSX.StrToID("baselineDirection"), PSX.StrToID("baselineDirection"), PSX.StrToID("withStream"));
            Desc7.PutDouble(PSX.StrToID("mojiZume"), 0);
            Desc7.PutEnumerated(PSX.StrToID("gridAlignment"), PSX.StrToID("gridAlignment"), PSX.StrToID("roman"));
            Desc7.PutEnumerated(PSX.StrToID("hyphenationLanguage"), PSX.StrToID("hyphenationLanguage"), PSX.StrToID("englishLanguage"));
            Desc7.PutInteger(PSX.StrToID("wariChuCount"), 1);
            Desc7.PutDouble(PSX.StrToID("wariChuScale"), 1);
            Desc7.PutInteger(PSX.StrToID("wariChuWidow"), 25);
            Desc7.PutInteger(PSX.StrToID("wariChuOrphan"), 25);
            Desc7.PutBoolean(PSX.StrToID("noBreak"), PSX.FALSE);
            Desc7.PutObject((int)con.phKeyColor, (int)con.phClassRGBColor, Desc8);
            Desc7.PutBoolean((int)con.phKeyFill, PSX.TRUE);
            Desc7.PutBoolean(1400140395, PSX.FALSE);
            Desc7.PutBoolean(PSX.StrToID("fillFirst"), PSX.FALSE);
            Desc7.PutEnumerated(PSX.StrToID("verticalUnderlinePosition"), PSX.StrToID("verticalUnderlinePosition"), PSX.StrToID("verticalUnderlineRight"));

            // Desc6
            var Desc6 = PSX.MakeNewDescriptor();

            Desc6.PutInteger((int)con.phKeyFrom, 0);
            Desc6.PutInteger((int)con.phKeyTo, text.Length + 1);
            Desc6.PutObject((int)con.phKeyTextStyle, (int)con.phClassTextStyle, Desc7);

            // List2
            var List2 = PSX.MakeNewList();

            List2.PutObject((int)con.phClassTextStyleRange, Desc6);

            // Desc5
            var Desc5 = PSX.MakeNewDescriptor();

            Desc5.PutEnumerated(1413830740, (int)con.phTypeChar, 1349415968);

            // List1
            var List1 = PSX.MakeNewList();

            List1.PutObject(PSX.StrToID("textShape"), Desc5);

            // Desc4
            var Desc4 = PSX.MakeNewDescriptor();

            Desc4.PutUnitDouble((int)con.phKeyHorizontal, (int)con.phUnitPercent, 13);
            Desc4.PutUnitDouble((int)con.phKeyVertical, (int)con.phUnitPercent, 25);

            // Desc3
            var Desc3 = PSX.MakeNewDescriptor();

            Desc3.PutEnumerated(PSX.StrToID("warpStyle"), PSX.StrToID("warpStyle"), PSX.StrToID("warpNone"));
            Desc3.PutDouble(PSX.StrToID("warpValue"), 0);
            Desc3.PutDouble(PSX.StrToID("warpPerspective"), 0);
            Desc3.PutDouble(PSX.StrToID("warpPerspectiveOther"), 0);
            Desc3.PutEnumerated(PSX.StrToID("warpRotate"), (int)con.phTypeOrientation, (int)con.phEnumHorizontal);

            // Desc2
            var Desc2 = PSX.MakeNewDescriptor();

            Desc2.PutString((int)con.phKeyText, text);
            Desc2.PutObject(PSX.StrToID("warp"), PSX.StrToID("warp"), Desc3);
            Desc2.PutObject((int)con.phKeyTextClickPoint, (int)con.phClassPoint, Desc4);
            Desc2.PutEnumerated(PSX.StrToID("textGridding"), PSX.StrToID("textGridding"), (int)con.phEnumNone);
            Desc2.PutEnumerated((int)con.phKeyOrientation, (int)con.phTypeOrientation, (int)con.phEnumHorizontal);
            Desc2.PutEnumerated((int)con.phKeyAntiAlias, (int)con.phTypeAntiAlias, (int)con.phEnumAntiAliasCrisp);
            Desc2.PutList(PSX.StrToID("textShape"), List1);
            Desc2.PutList((int)con.phKeyTextStyleRange, List2);
            Desc2.PutList(PSX.StrToID("paragraphStyleRange"), List3);

            // Ref1
            var Ref1 = PSX.MakeNewReference();

            Ref1.PutClass((int)con.phClassTextLayer);

            // Desc1
            var Desc1 = PSX.MakeNewDescriptor();

            Desc1.PutReference((int)con.phKeyNull, Ref1);
            Desc1.PutObject((int)con.phKeyUsing, (int)con.phClassTextLayer, Desc2);


            int old_layer_count = LayerAPI.GetLayerCount(-1);

            // Play the event in photoshop
            PSX.PlayEvent((int)con.phEventMake, Desc1, (int)con.phDialogSilent, PSX.PlayBehavior.checkresult);

            LayerAPI.CheckLayerCount(-1, old_layer_count + 1);
        }