# HG changeset patch # User Claus Gittinger # Date 1256123626 -7200 # Node ID 1583e5525196a99d983fcdceb4bb57180d6bb906 # Parent 27067289164534f67973211286ada5cfb27f56d8 menu order diff -r 270672891645 -r 1583e5525196 ImageEditor.st --- a/ImageEditor.st Wed Oct 21 11:00:17 2009 +0200 +++ b/ImageEditor.st Wed Oct 21 13:13:46 2009 +0200 @@ -1956,13 +1956,13 @@ activeHelpKey: compressColormap enabled: hasColormap label: 'Compress Colormap' - itemValue: compressColorMap + itemValue: menu_compressColorMap translateLabel: true ) (MenuItem enabled: hasColormap label: 'Sort Colormap' - itemValue: sortColorMap + itemValue: menu_sortColorMap translateLabel: true ) (MenuItem @@ -1985,12 +1985,6 @@ ) (MenuItem enabled: imageIsLoaded - label: 'Invert' - itemValue: doNegativeImage - translateLabel: true - ) - (MenuItem - enabled: imageIsLoaded label: 'Brighten' itemValue: doBrightenImage translateLabel: true @@ -2001,6 +1995,12 @@ itemValue: doDarkenImage translateLabel: true ) + (MenuItem + enabled: imageIsLoaded + label: 'Invert' + itemValue: doNegativeImage + translateLabel: true + ) ) nil nil @@ -2069,20 +2069,26 @@ activeHelpKey: copyMask enabled: hasMask label: 'Copy Mask' - itemValue: copyMask + itemValue: menu_copyMask translateLabel: true ) (MenuItem activeHelpKey: pasteMask enabled: hasMask label: 'Paste Mask' - itemValue: pasteMask + itemValue: menu_pasteMask translateLabel: true ) (MenuItem enabled: hasMask label: 'Clear Masked Pixels' - itemValue: clearMaskedPixels + itemValue: menu_clearMaskedPixels + translateLabel: true + ) + (MenuItem + enabled: hasMask + label: 'Clear ColormapEntry for Masked Pixels' + itemValue: menu_clearColormapEntry0AndMaskedPixels translateLabel: true ) ) @@ -4282,28 +4288,43 @@ ]. ! +clearColormapEntry0AndMaskedPixels + "ensure that there is a colorMap entry with 0/0/0 at position + 0 and then clear all masked pixels (to pixelValue 0). + This is required for windows icons to be really transparent" + + |index colorMap| + + self compressColorMap. + colorMap := self image colorMap. + (colorMap includes:(Color black)) ifFalse:[ + self addColorToColormap:(Color black). + colorMap := self image colorMap. + ]. + index := colorMap indexOf:(Color black). + index == 1 ifFalse:[ + self sortColorMap. + colorMap := self image colorMap. + ]. + self clearMaskedPixels +! + clearMaskedPixels "clear all masked pixels (to pixelValue 0)" - |newImage oldImage| - - oldImage := self image. - - imageEditView makeUndo. - - self withExecuteCursorDo:[ - newImage := oldImage clearMaskedPixels. - 0 to:newImage height - 1 do:[:y | - 0 to:newImage width - 1 do:[:x | - (newImage maskAtX:x y:y) == 0 ifTrue:[ - newImage pixelAtX:x y:y put:0 - ] + |newImage| + + newImage := self image clearMaskedPixels. + 0 to:newImage height - 1 do:[:y | + 0 to:newImage width - 1 do:[:x | + (newImage maskAtX:x y:y) == 0 ifTrue:[ + newImage pixelAtX:x y:y put:0 ] - ]. - - (imageEditView image:newImage) notNil ifTrue:[ - self fetchImageData. ] + ]. + + (imageEditView image:newImage) notNil ifTrue:[ + self fetchImageData. ] ! @@ -4636,82 +4657,60 @@ oldImage := self image. depth := oldImage depth. - oldImage photometric ~~ #palette ifTrue:[ - self information:'Compress colorMap: Only palette images have colormaps.'. - ^ self - ]. - usedColors := oldImage realUsedColors. - usedColors size == (1 bitShift:depth) ifTrue:[ - self information:'Compress colorMap: All colors are used - no compression.'. - ^ self - ]. - usedColors size == oldImage colorMap size ifTrue:[ - self information:'Compress colorMap: Colormap already compressed - no compression.'. - ^ self + + "/ translation table + oldToNew := ByteArray new:(1 bitShift:depth). + newColorMap := usedColors asArray. + newColorMap sort:self sortBlockForColors. + + oldImage colorMap asArray keysAndValuesDo:[:oldIdx :clr | + |newPixel| + + (usedColors includes:clr) ifTrue:[ + newPixel := newColorMap indexOf:clr. + oldToNew at:oldIdx put:newPixel-1. + ] ]. - imageEditView makeUndo. - -"/ self information:('Compress colorMap: %1 colors used.' bindWith:usedColors size). - - self withExecuteCursorDo:[ -"/ newColorMap := Array new:usedColors size. - - "/ translation table - oldToNew := ByteArray new:(1 bitShift:depth). - newColorMap := usedColors asArray. - newColorMap sort:self sortBlockForColors. - - oldImage colorMap asArray keysAndValuesDo:[:oldIdx :clr | - |newPixel| - - (usedColors includes:clr) ifTrue:[ - newPixel := newColorMap indexOf:clr. - oldToNew at:oldIdx put:newPixel-1. - ] - ]. - - oldBits := oldImage bits. - newBits := ByteArray new:(oldBits size). - depth ~~ 8 ifTrue:[ - "/ expand/compress can only handle 8bits - tmpBits := ByteArray uninitializedNew:(oldImage width*oldImage height). - oldBits - expandPixels:depth - width:oldImage width - height:oldImage height - into:tmpBits - mapping:oldToNew. - tmpBits - compressPixels:depth - width:oldImage width - height:oldImage height - into:newBits - mapping:nil - ] ifFalse:[ - oldBits - expandPixels:depth - width:oldImage width - height:oldImage height - into:newBits - mapping:oldToNew. - ]. - - newImage := oldImage species new - width:oldImage width - height:oldImage height - depth:depth - fromArray:newBits. - - newImage colorMap:newColorMap. - newImage fileName:oldImage fileName. - newImage mask:(oldImage mask copy). - - (imageEditView image:newImage) notNil ifTrue: - [ - self fetchImageData. - ] + oldBits := oldImage bits. + newBits := ByteArray new:(oldBits size). + depth ~~ 8 ifTrue:[ + "/ expand/compress can only handle 8bits + tmpBits := ByteArray uninitializedNew:(oldImage width*oldImage height). + oldBits + expandPixels:depth + width:oldImage width + height:oldImage height + into:tmpBits + mapping:oldToNew. + tmpBits + compressPixels:depth + width:oldImage width + height:oldImage height + into:newBits + mapping:nil + ] ifFalse:[ + oldBits + expandPixels:depth + width:oldImage width + height:oldImage height + into:newBits + mapping:oldToNew. + ]. + + newImage := oldImage species new + width:oldImage width + height:oldImage height + depth:depth + fromArray:newBits. + + newImage colorMap:newColorMap. + newImage fileName:oldImage fileName. + newImage mask:(oldImage mask copy). + + (imageEditView image:newImage) notNil ifTrue:[ + self fetchImageData. ] "Created: / 28.7.1998 / 20:03:11 / cg" @@ -4722,13 +4721,6 @@ imageEditView setClipboardObject:(self selectedColorOrNil) ! -copyMask - |mask| - - mask := self image mask. - MaskClipboard := mask subImageIn: (0@0 extent:mask extent). -! - ditherToDepth |depth| @@ -4918,23 +4910,63 @@ self processSelectedColorWith:[:clr | Color brightness:(clr brightness)] ! -pasteColorIntoColormap - |copyBufferColor| - - copyBufferColor := imageEditView getClipboardObject. - copyBufferColor isColor ifFalse:[ - UserPreferences current beepInEditor ifTrue:[ - self window beep. - ]. +menu_clearColormapEntry0AndMaskedPixels + "ensure that there is a colorMap entry with 0/0/0 at position + 0 and then clear all masked pixels (to pixelValue 0)" + + imageEditView makeUndo. + self withExecuteCursorDo:[ + self clearColormapEntry0AndMaskedPixels + ] +! + +menu_clearMaskedPixels + "clear all masked pixels (to pixelValue 0)" + + imageEditView makeUndo. + + self withExecuteCursorDo:[ + self clearMaskedPixels + ] +! + +menu_compressColorMap + "calculates a new color map for the image, using only used colors" + + |depth oldImage usedColors| + + oldImage := self image. + depth := oldImage depth. + + oldImage photometric ~~ #palette ifTrue:[ + self information:'Compress colorMap: Only palette images have colormaps.'. ^ self ]. - - self processSelectedColorWith:[:clr | - copyBufferColor + usedColors := oldImage realUsedColors. + usedColors size == (1 bitShift:depth) ifTrue:[ + self information:'Compress colorMap: All colors are used - no compression.'. + ^ self + ]. + usedColors size == oldImage colorMap size ifTrue:[ + self information:'Compress colorMap: Colormap already compressed - no compression.'. + ^ self + ]. + + imageEditView makeUndo. + + self withExecuteCursorDo:[ + self compressColorMap ] ! -pasteMask +menu_copyMask + |mask| + + mask := self image mask. + MaskClipboard := mask subImageIn: (0@0 extent:mask extent). +! + +menu_pasteMask |img mask| imageEditView makeUndo. @@ -4954,6 +4986,46 @@ ] ! +menu_sortColorMap + "calculates a new color map for the image, sorting colors" + + self menu_sortColorMapWith:self sortBlockForColors +! + +menu_sortColorMapWith:sortBlock + "calculates a new color map for the image, sorting colors" + + self image photometric ~~ #palette ifTrue:[ + self information:'Compress colorMap: Only palette images have colormaps.'. + ^ self + ]. + + imageEditView makeUndo. + + self withExecuteCursorDo:[ + self sortColorMapWith:sortBlock + ] + + "Modified: / 15.9.1998 / 17:53:32 / cg" + "Created: / 30.9.1998 / 23:51:23 / cg" +! + +pasteColorIntoColormap + |copyBufferColor| + + copyBufferColor := imageEditView getClipboardObject. + copyBufferColor isColor ifFalse:[ + UserPreferences current beepInEditor ifTrue:[ + self window beep. + ]. + ^ self + ]. + + self processSelectedColorWith:[:clr | + copyBufferColor + ] +! + pickAndAddColorToColormap self addColorToColormap:(Color fromUser) ! @@ -5184,8 +5256,7 @@ sortColorMap "calculates a new color map for the image, sorting colors" - self - sortColorMapWith:self sortBlockForColors + self sortColorMapWith:self sortBlockForColors ! sortColorMapWith:sortBlock @@ -5196,71 +5267,61 @@ oldImage := self image. depth := oldImage depth. - oldImage photometric ~~ #palette ifTrue:[ - self information:'Compress colorMap: Only palette images have colormaps.'. - ^ self + usedColors := oldImage realColorMap. + + + "/ translation table + oldToNew := ByteArray new:(1 bitShift:depth). + newColorMap := usedColors asArray. + newColorMap sort:sortBlock. + + oldImage colorMap asArray keysAndValuesDo:[:oldIdx :clr | + |newPixel| + + (usedColors includes:clr) ifTrue:[ + newPixel := newColorMap indexOf:clr. + oldToNew at:oldIdx put:newPixel-1. + ] ]. - usedColors := oldImage realColorMap. - - imageEditView makeUndo. - - self withExecuteCursorDo:[ -"/ newColorMap := Array new:usedColors size. - - "/ translation table - oldToNew := ByteArray new:(1 bitShift:depth). - newColorMap := usedColors asArray. - newColorMap sort:sortBlock. - - oldImage colorMap asArray keysAndValuesDo:[:oldIdx :clr | - |newPixel| - - (usedColors includes:clr) ifTrue:[ - newPixel := newColorMap indexOf:clr. - oldToNew at:oldIdx put:newPixel-1. - ] - ]. - - oldBits := oldImage bits. - newBits := ByteArray new:(oldBits size). - depth ~~ 8 ifTrue:[ - "/ expand/compress can only handle 8bits - tmpBits := ByteArray uninitializedNew:(oldImage width*oldImage height). - oldBits - expandPixels:depth - width:oldImage width - height:oldImage height - into:tmpBits - mapping:oldToNew. - tmpBits - compressPixels:depth - width:oldImage width - height:oldImage height - into:newBits - mapping:nil - ] ifFalse:[ - oldBits - expandPixels:depth - width:oldImage width - height:oldImage height - into:newBits - mapping:oldToNew. - ]. - - newImage := oldImage species new - width:oldImage width - height:oldImage height - depth:depth - fromArray:newBits. - - newImage colorMap:newColorMap. - newImage fileName:oldImage fileName. - newImage mask:(oldImage mask copy). - - (imageEditView image:newImage) notNil ifTrue:[ - self fetchImageData. - ] + oldBits := oldImage bits. + newBits := ByteArray new:(oldBits size). + depth ~~ 8 ifTrue:[ + "/ expand/compress can only handle 8bits + tmpBits := ByteArray uninitializedNew:(oldImage width*oldImage height). + oldBits + expandPixels:depth + width:oldImage width + height:oldImage height + into:tmpBits + mapping:oldToNew. + tmpBits + compressPixels:depth + width:oldImage width + height:oldImage height + into:newBits + mapping:nil + ] ifFalse:[ + oldBits + expandPixels:depth + width:oldImage width + height:oldImage height + into:newBits + mapping:oldToNew. + ]. + + newImage := oldImage species new + width:oldImage width + height:oldImage height + depth:depth + fromArray:newBits. + + newImage colorMap:newColorMap. + newImage fileName:oldImage fileName. + newImage mask:(oldImage mask copy). + + (imageEditView image:newImage) notNil ifTrue:[ + self fetchImageData. ] "Modified: / 15.9.1998 / 17:53:32 / cg"