home *** CD-ROM | disk | FTP | other *** search
Wrap
from JascApp import * import JascUtils def ScriptProperties(): return { 'Author': 'Joe Fromm', 'Copyright': 'Copyright (C) 2002-2003, Jasc Software Inc., All Rights Reserved. Permission to create derivate works of this script is granted provided this copyright notice is included', 'Description': 'Make a pseudo-palette - a series of squares filled with solid colors', 'Host': 'Paint Shop Pro', 'Host Version': '8.00', 'ForceTextEditor': App.Constants.Boolean.true } def Do(Environment): if JascUtils.RequireADoc( Environment ) == App.Constants.Boolean.false: return # all of these formats have palettes, and we need a paletted image. PalettedFormats = [ App.Constants.PixelFormat.Index1, App.Constants.PixelFormat.Index4, App.Constants.PixelFormat.Index8, App.Constants.PixelFormat.Grey, App.Constants.PixelFormat.GreyA ] # is the current image paletted? If not, give them the option to reduce color depth Info = App.Do( Environment, 'ReturnImageInfo' ) if not Info['PixelFormat'] in PalettedFormats: result = App.Do(Environment, 'MsgBox', { 'Buttons': App.Constants.MsgButtons.YesNo, 'Icon': App.Constants.MsgIcons.Question, 'Text': 'This script requires a paletted image. Would you like to ' 'reduce the color depth?', }) if result == 0: return else: # always do this interactively, even if the script as a whole is silent App.Do( Environment, 'DecreaseColorsToX', { 'GeneralSettings': { 'ExecutionMode': App.Constants.ExecutionMode.Interactive, 'AutoActionMode': App.Constants.AutoActionMode.Match } }) # get a new copy of the image info since it just changed Info = App.Do( Environment, 'ReturnImageInfo' ) ColorList = Info[ 'PaletteColorList' ] if not ColorList: print 'Internal error: No palette found' return # now make a pseudo-palette - an image with little swatches of color against a solid # background. Make the background a medium grey, and separate each swatch by 2 pixels # of grout. Each color square is 10x10 # *** Change these parameters for a different output image MakePseudoPalette( Environment, ColorList, GroutColor=(128,128,128), GroutWidth=2, ColorsPerRow=16, TileSize=(10,10), ButtonMargin=0 ) # we just created a new image - just leave it open for the user to decide what to do # Create a new image that appears somewhat like a palette - a series of color swatches # organized into rows and columns. The resulting image can be customized by setting the # parameters appropriately. # ColorList - list of (r,g,b) tuples with the colors to use. Must be between 2 and 1024 # GroutColor - underlying color of the image, seen between the color tiles. Defaults to # medium grey # GroutWidth - how much grout is seen between color tiles. Defaults to 2 pixels. # ColorsPerRow - number of tiles on each row. Along with TileSize[0], determines # the width of the image. Defaults to 16 # TileSize - (x,y) size tuple. A rectangle of that size will be filled with each color. # along with length of the colorlist and ColorsPerRow, determines the resulting # size of the image. Defaults to (10,10) # ButtonMargin - how much of a buttonize effect to apply to each color tile. Default of 0 # means no buttonize is done. A buttonize of 2 yields a slight 3D effect. def MakePseudoPalette( Environment, ColorList, GroutColor=(0,0,0), GroutWidth=2, ColorsPerRow=16, TileSize=(10,10), ButtonMargin=0): # lets put some sanity checks on our arguments - these values are arbitrary for the # most part, so if you don't like them, change them. if not GroutWidth in range(0,20): print 'GroutWidth value must be between 0 and 20' return 0 if not ColorsPerRow in range(1,100): print 'ColorsPerRow value must be between 1 and 100' return 0 if not TileSize[0] in range(2, 50): print 'TileSize must be between 2 and 50' return 0 if not TileSize[1] in range(2, 50): print 'TileSize must be between 2 and 50' return 0 if not len(ColorList) in range( 2, 1024 ): print 'Number of colors must be between 2 and 1024' return 0 if not ButtonMargin in range( 0, min(TileSize)/2 ): print 'ButtonMargin must be less than half the tilesize' return 0 # run through the list of colors we were given and remove consecutive duplicates # this will address the issue of reducing to an odd number of colors, but permit # duplicates to occur in the middle of the color list OldColor = ( 1000, 0, 0 ) # not a legal color value, so should never occur in nature iStartDup = 0 iCurrentIndex = 0 for Color in ColorList: if Color != OldColor: iStartDup = iCurrentIndex OldColor = Color iCurrentIndex += 1 if iStartDup + 1 < len(ColorList): ColorList = ColorList[ 0 : iStartDup+1 ] # start by determining how big a document we want to create NumRows = (len(ColorList) + ColorsPerRow - 1) / ColorsPerRow Height = (NumRows * TileSize[1]) + ((NumRows + 1) * GroutWidth) Width = (ColorsPerRow * TileSize[0]) + ((ColorsPerRow + 1) * GroutWidth) # make an image of the proper size using a background of the grout color App.Do( Environment, 'NewFile', { 'Width': Width, 'Height': Height, 'ColorDepth': App.Constants.Colordepth.SixteenMillionColor, 'DimensionUnits': App.Constants.DimensionType.Pixels, 'FillMaterial': { 'Color': GroutColor, 'Pattern': None, 'Gradient': None, 'Texture': None }, 'Transparent': App.Constants.Boolean.false, 'VectorBackground': App.Constants.Boolean.false, 'GeneralSettings': { 'ExecutionMode': App.Constants.ExecutionMode.Silent, 'AutoActionMode': App.Constants.AutoActionMode.Match } }) TargetDoc = App.ActiveDocument # now iterate across the list of colors RowNumber = 0 ColNumber = 0 RowStart = GroutWidth ColStart = GroutWidth Index = 0 for Color in ColorList: # just send data to the output so they know something is happening. print 'Color %d is (%02X,%02X,%02X)' % (Index, Color[0], Color[1], Color[2]) Index += 1 # when we reach the end of a row reset our column and advance row if ColNumber >= ColorsPerRow: ColNumber = 0 RowNumber += 1 RowStart += TileSize[1] + GroutWidth ColStart = GroutWidth # make a selection of the rectangle this color should cover App.Do( Environment, 'Selection', { 'General': { 'Mode': App.Constants.SelectionOperation.Replace, 'Antialias': App.Constants.Boolean.false, 'Feather': 0 }, 'SelectionShape': App.Constants.SelectionShape.Rectangle, 'Start': (ColStart, RowStart), 'End': (ColStart + TileSize[0], RowStart + TileSize[1]), 'GeneralSettings': { 'ExecutionMode': App.Constants.ExecutionMode.Silent, 'AutoActionMode': App.Constants.AutoActionMode.Match } }, TargetDoc ) # fill it with the color App.Do( Environment, 'Fill', { 'BlendMode': 0, 'MatchMode': 1, 'Material': { 'Color': Color, 'Pattern': None, 'Gradient': None, 'Texture': None }, 'UseForground': App.Constants.Boolean.true, 'Opacity': 100, 'Point': (ColStart+1, RowStart+1), 'SampleMerged': 0, 'Tolerance': 20, 'GeneralSettings': { 'ExecutionMode': App.Constants.ExecutionMode.Silent, 'AutoActionMode': App.Constants.AutoActionMode.Match } }, TargetDoc ) # buttonize the color if requested if ButtonMargin != 0: App.Do( Environment, 'Buttonize', { 'Width': ButtonMargin, 'Height': ButtonMargin, 'Transparent': App.Constants.Boolean.false, 'Color': (255,255,255), 'Opacity': 75, 'GeneralSettings': { 'ExecutionMode': App.Constants.ExecutionMode.Silent, 'AutoActionMode': App.Constants.AutoActionMode.Match } }, TargetDoc) # go on to the next column ColNumber += 1 ColStart += TileSize[0] + GroutWidth # select none to get rid of the selection on the last color square. App.Do( Environment, 'SelectNone', {}, TargetDoc ) return 1 # success