[squeak-dev] The Trunk: Graphics-ul.392.mcz

Tobias Pape Das.Linux at gmx.de
Mon Feb 5 20:18:20 UTC 2018


> 
> On 05.02.2018, at 21:03, commits at source.squeak.org wrote:
> 
> Levente Uzonyi uploaded a new version of Graphics to project The Trunk:
> http://source.squeak.org/trunk/Graphics-ul.392.mcz
> 
> ==================== Summary ====================
> 
> Name: Graphics-ul.392
> Author: ul
> Time: 22 January 2018, 12:28:13.814623 am
> UUID: 8fbfdf92-ed6c-4460-b74b-fc649d42fe83
> Ancestors: Graphics-tpr.391
> 
> - use ByteArray literals instead of Arrays

Is this any faster? Or do you have a different reasoning behind these changes?
Just curious.

Best regards
	-Tobias

> 
> =============== Diff against Graphics-tpr.391 ===============
> 
> Item was changed:
>  ----- Method: BMPReadWriter>>nextPutImage: (in category 'writing') -----
>  nextPutImage: aForm
>  	| bhSize rowBytes rgb data colorValues depth image ppw scanLineLen pixline |
>  	depth := aForm depth.
> + 	depth := #[1 4 8 32] detect: [ :each | each >= depth].
> - 	depth := #(1 4 8 32 ) detect: [ :each | each >= depth].
>  	image := aForm asFormOfDepth: depth.
>  	image unhibernate.
>  	bhSize := 14.  "# bytes in file header"
>  	biSize := 40.  "info header size in bytes"
>  	biWidth := image width.
>  	biHeight := image height.
>  	biClrUsed := depth = 32 ifTrue: [0] ifFalse:[1 << depth].  "No. color table entries"
>  	bfOffBits := biSize + bhSize + (4*biClrUsed).
>  	rowBytes := ((depth min: 24) * biWidth + 31 // 32) * 4.
>  	biSizeImage := biHeight * rowBytes.
> 
>  	"Write the file header"
>  	stream position: 0.
>  	stream nextLittleEndianNumber: 2 put: 19778.  "bfType = BM"
>  	stream nextLittleEndianNumber: 4 put: bfOffBits + biSizeImage.  "Entire file size in bytes"
>  	stream nextLittleEndianNumber: 4 put: 0.  "bfReserved"
>  	stream nextLittleEndianNumber: 4 put: bfOffBits.  "Offset of bitmap data from start of hdr (and file)"
> 
>  	"Write the bitmap info header"
>  	stream position: bhSize.
>  	stream nextLittleEndianNumber: 4 put: biSize.  "info header size in bytes"
>  	stream nextLittleEndianNumber: 4 put: image width.  "biWidth"
>  	stream nextLittleEndianNumber: 4 put: image height.  "biHeight"
>  	stream nextLittleEndianNumber: 2 put: 1.  "biPlanes"
>  	stream nextLittleEndianNumber: 2 put: (depth min: 24).  "biBitCount"
>  	stream nextLittleEndianNumber: 4 put: 0.  "biCompression"
>  	stream nextLittleEndianNumber: 4 put: biSizeImage.  "size of image section in bytes"
>  	stream nextLittleEndianNumber: 4 put: 2800.  "biXPelsPerMeter"
>  	stream nextLittleEndianNumber: 4 put: 2800.  "biYPelsPerMeter"
>  	stream nextLittleEndianNumber: 4 put: biClrUsed.
>  	stream nextLittleEndianNumber: 4 put: 0.  "biClrImportant"
>  	biClrUsed > 0 ifTrue: [
>  		"write color map; this works for ColorForms, too"
>  		colorValues := image colormapIfNeededForDepth: 32.
>  		1 to: biClrUsed do: [:i |
>  			rgb := colorValues at: i.
>  			0 to: 24 by: 8 do: [:j | stream nextPut: (rgb >> j bitAnd: 16rFF)]]].
> 
>  	depth < 32 ifTrue: [
>  		"depth = 1, 4 or 8."
>  		data := image bits asByteArray.
>  		ppw := 32 // depth.
>  		scanLineLen := biWidth + ppw - 1 // ppw * 4.  "# of bytes in line"
>  		1 to: biHeight do: [:i |
>  			stream next: scanLineLen putAll: data startingAt: (biHeight-i)*scanLineLen+1.
>  		].
>  	] ifFalse: [
>  		data := image bits.
>  		pixline := ByteArray new: (((biWidth * 3 + 3) // 4) * 4).
>  		1 to: biHeight do:[:i |
>  			self store24BitBmpLine: pixline from: data startingAt: (biHeight-i)*biWidth+1 width: biWidth.
>  			stream nextPutAll: pixline.
>  		].
>  	].
>  	stream position = (bfOffBits + biSizeImage) ifFalse: [self error:'Write failure'].
>  	stream close.!
> 
> Item was changed:
>  ----- Method: BitBlt class>>benchmark (in category 'benchmarks') -----
>  benchmark		"BitBlt benchmark"
>  	"Run a benchmark on different combinations rules, source/destination depths and BitBlt modes. Note: This benchmark doesn't give you any 'absolute' value - it is intended only for benchmarking improvements in the bitblt code and nothing else.
>  	Attention: *this*may*take*a*while*"
>  	| destRect log |
>  	log := WriteStream on: String new.
>  	destRect := 0 at 0 extent: 600 at 600.
>  	"Form paint/Form over - the most common rules"
> + 	#[25 3] do:[:rule|
> - 	#( 25 3 ) do:[:rule|
>  		Transcript cr; show:'---- Combination rule: ', rule printString,' ----'.
>  		log cr; nextPutAll:'---- Combination rule: ', rule printString,' ----'.
> + 		#[1 2 4 8 16 32] do:[:destDepth| | dest |
> - 		#(1 2 4 8 16 32) do:[:destDepth| | dest |
>  			dest := nil.
>  			dest := Form extent: destRect extent depth: destDepth.
>  			Transcript cr.
>  			log cr.
> + 			#[1 2 4 8 16 32] do:[:sourceDepth| | t source bb |
> - 			#(1 2 4 8 16 32) do:[:sourceDepth| | t source bb |
>  				Transcript cr; show: sourceDepth printString, ' => ', destDepth printString.
>  				log cr; nextPutAll: sourceDepth printString, ' => ', destDepth printString.
>  				source := nil. bb := nil.
>  				source := Form extent: destRect extent depth: sourceDepth.
>  				(source getCanvas) fillOval: dest boundingBox color: Color yellow borderWidth: 30 borderColor: Color black.
>  				bb := WarpBlt toForm: dest.
>  				bb sourceForm: source.
>  				bb sourceRect: source boundingBox.
>  				bb destRect: dest boundingBox.
>  				bb colorMap: (source colormapIfNeededFor: dest).
>  				bb combinationRule: rule.
> 
>  				"Measure speed of copyBits"
>  				t := Time millisecondsToRun:[bb copyBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				bb sourceForm: source destRect: source boundingBox.
> 
>  				"Measure speed of 1x1 warpBits"
>  				bb cellSize: 1.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				"Measure speed of 2x2 warpBits"
>  				bb cellSize: 2.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				"Measure speed of 3x3 warpBits"
>  				bb cellSize: 3.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
>  			].
>  		].
>  	].
>  	^log contents!
> 
> Item was changed:
>  ----- Method: BitBlt class>>benchmark2 (in category 'benchmarks') -----
>  benchmark2		"BitBlt benchmark"
>  	"Run a benchmark on different combinations rules, source/destination depths and BitBlt modes. Note: This benchmark doesn't give you any 'absolute' value - it is intended only for benchmarking improvements in the bitblt code and nothing else.
>  	Attention: *this*may*take*a*while*"
>  	| destRect log |
>  	log := WriteStream on: String new.
>  	destRect := 0 at 0 extent: 600 at 600.
>  	"Form paint/Form over - the most common rules"
> + 	#[25 3] do:[:rule|
> - 	#( 25 3 ) do:[:rule|
>  		Transcript cr; show:'---- Combination rule: ', rule printString,' ----'.
>  		log cr; nextPutAll:'---- Combination rule: ', rule printString,' ----'.
> + 		#[1 2 4 8 16 32] do:[:destDepth| | dest |
> - 		#(1 2 4 8 16 32) do:[:destDepth| | dest |
>  			dest := nil.
>  			dest := Form extent: destRect extent depth: destDepth.
>  			Transcript cr.
>  			log cr.
> + 			#[1 2 4 8 16 32] do:[:sourceDepth| | t bb source |
> - 			#(1 2 4 8 16 32) do:[:sourceDepth| | t bb source |
>  				Transcript cr; show: sourceDepth printString, ' => ', destDepth printString.
>  				log cr; nextPutAll: sourceDepth printString, ' => ', destDepth printString.
>  				source := nil. bb := nil.
>  				source := Form extent: destRect extent depth: sourceDepth.
>  				(source getCanvas) fillOval: dest boundingBox color: Color yellow borderWidth: 30 borderColor: Color black.
>  				bb := WarpBlt toForm: dest.
>  				bb sourceForm: source.
>  				bb sourceRect: source boundingBox.
>  				bb destRect: dest boundingBox.
>  				bb colorMap: (source colormapIfNeededFor: dest).
>  				bb combinationRule: rule.
> 
>  				"Measure speed of copyBits"
>  				t := Time millisecondsToRun:[1 to: 10 do:[:i| bb copyBits]].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				bb sourceForm: source destRect: source boundingBox.
> 
>  				"Measure speed of 1x1 warpBits"
>  				bb cellSize: 1.
>  				t := Time millisecondsToRun:[1 to: 4 do:[:i| bb warpBits]].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				"Measure speed of 2x2 warpBits"
>  				bb cellSize: 2.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				"Measure speed of 3x3 warpBits"
>  				bb cellSize: 3.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
>  			].
>  		].
>  	].
>  	^log contents!
> 
> Item was changed:
>  ----- Method: BitBlt class>>benchmark3 (in category 'benchmarks') -----
>  benchmark3		"BitBlt benchmark"
>  	"Run a benchmark on different combinations rules, source/destination depths and BitBlt modes. Note: This benchmark doesn't give you any 'absolute' value - it is intended only for benchmarking improvements in the bitblt code and nothing else.
>  	Attention: *this*may*take*a*while*"
>  	| destRect log |
>  	log := WriteStream on: String new.
>  	destRect := 0 at 0 extent: 600 at 600.
>  	"Form paint/Form over - the most common rules"
> + 	#[25 3] do:[:rule|
> - 	#( 25 3 ) do:[:rule|
>  		Transcript cr; show:'---- Combination rule: ', rule printString,' ----'.
>  		log cr; nextPutAll:'---- Combination rule: ', rule printString,' ----'.
> + 		#[1 2 4 8 16 32] do:[:destDepth| | dest |
> - 		#(1 2 4 8 16 32) do:[:destDepth| | dest |
>  			dest := nil.
>  			dest := Form extent: destRect extent depth: destDepth.
>  			Transcript cr.
>  			log cr.
> + 			#[1 2 4 8 16 32] do:[:sourceDepth| | t source bb |
> - 			#(1 2 4 8 16 32) do:[:sourceDepth| | t source bb |
>  				Transcript cr; show: sourceDepth printString, ' => ', destDepth printString.
>  				log cr; nextPutAll: sourceDepth printString, ' => ', destDepth printString.
>  				source := nil. bb := nil.
>  				source := Form extent: destRect extent depth: sourceDepth.
>  				(source getCanvas) fillOval: dest boundingBox color: Color yellow borderWidth: 30 borderColor: Color black.
>  				bb := WarpBlt toForm: dest.
>  				bb sourceForm: source.
>  				bb sourceRect: source boundingBox.
>  				bb destRect: dest boundingBox.
>  				bb colorMap: (source colormapIfNeededFor: dest).
>  				bb combinationRule: rule.
> 
>  				"Measure speed of copyBits"
>  				t := Time millisecondsToRun:[1 to: 10 do:[:i| bb copyBits]].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				bb sourceForm: source destRect: source boundingBox.
> 
>  				"Measure speed of 1x1 warpBits"
>  				bb cellSize: 1.
>  				t := Time millisecondsToRun:[1 to: 4 do:[:i| bb warpBits]].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				"Measure speed of 2x2 warpBits"
>  				bb cellSize: 2.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
> 
>  				"Measure speed of 3x3 warpBits"
>  				bb cellSize: 3.
>  				t := Time millisecondsToRun:[bb warpBits].
>  				Transcript tab; show: t printString.
>  				log tab; nextPutAll: t printString.
>  			].
>  		].
>  	].
>  	^log contents!
> 
> Item was changed:
>  ----- Method: GIFReadWriter>>writeHeader (in category 'private-encoding') -----
>  writeHeader
> 
>  	| byte |
>  	stream position = 0 ifTrue: [
>  		"For first image only"
>  		self nextPutAll: 'GIF89a' asByteArray.
>  		self writeWord: width.	"Screen Width"
>  		self writeWord: height.	"Screen Height"
>  		byte := 16r80.  "has color map"
>  		byte := byte bitOr: ((bitsPerPixel - 1) bitShift: 5).  "color resolution"
>  		byte := byte bitOr: bitsPerPixel - 1.  "bits per pixel"
>  		self nextPut: byte.
>  		self nextPut: 0.		"background color."
>  		self nextPut: 0.		"reserved"
>  		colorPalette do: [:pixelValue |
>  			self	nextPut: ((pixelValue bitShift: -16) bitAnd: 255);
>  				nextPut: ((pixelValue bitShift: -8) bitAnd: 255);
>  				nextPut: (pixelValue bitAnd: 255)].
>  		loopCount notNil ifTrue: [
>  			"Write a Netscape loop chunk"
>  			self nextPut: Extension.
> + 			self nextPutAll: #[255 11 78 69 84 83 67 65 80 69 50 46 48 3 1].
> - 			self nextPutAll: #(255 11 78 69 84 83 67 65 80 69 50 46 48 3 1) asByteArray.
>  			self writeWord: loopCount.
>  			self nextPut: 0]].
> 
>  	delay notNil | transparentIndex notNil ifTrue: [
>  		self nextPut: Extension;
>  			nextPutAll: #(16rF9 4) asByteArray;
>  			nextPut: (transparentIndex isNil ifTrue: [0] ifFalse: [9]);
>  			writeWord: (delay isNil ifTrue: [0] ifFalse: [delay]);
>  			nextPut: (transparentIndex isNil ifTrue: [0] ifFalse: [transparentIndex]);
>  			nextPut: 0].
> 
>  	self nextPut: ImageSeparator.
>  	self writeWord: 0.		"Image Left"
>  	self writeWord: 0.		"Image Top"
>  	self writeWord: width.	"Image Width"
>  	self writeWord: height.	"Image Height"
>  	byte := interlace ifTrue: [16r40] ifFalse: [0].
>  	self nextPut: byte.
>  !
> 
> 



More information about the Squeak-dev mailing list