David T. Lewis uploaded a new version of Graphics to project The Trunk:
http://source.squeak.org/trunk/Graphics-dtl.151.mcz ==================== Summary ==================== Name: Graphics-dtl.151 Author: dtl Time: 24 October 2010, 12:57:55.652 pm UUID: dc7bd744-10b2-457e-9213-692344a446aa Ancestors: Graphics-nice.150 Use pragma declarations in methods that are translated to C in MiscPrimitivePlugin. Supports removal of Object>>inline: and Object>>var:declareC: from trunk. =============== Diff against Graphics-nice.150 =============== Item was changed: ----- Method: Bitmap>>compress:toByteArray: (in category 'filing') ----- compress: bm toByteArray: ba "Store a run-coded compression of the receiver into the byteArray ba, and return the last index stored into. ba is assumed to be large enough. The encoding is as follows... S {N D}*. S is the size of the original bitmap, followed by run-coded pairs. N is a run-length * 4 + data code. D, the data, depends on the data code... 0 skip N words, D is absent 1 N words with all 4 bytes = D (1 byte) 2 N words all = D (4 bytes) 3 N words follow in D (4N bytes) S and N are encoded as follows... 0-223 0-223 224-254 (0-30)*256 + next byte (0-7935) 255 next 4 bytes" | size k word j lowByte eqBytes i | <primitive: 'primitiveCompressToByteArray' module: 'MiscPrimitivePlugin'> + <var: #bm declareC: 'int *bm'> + <var: #ba declareC: 'unsigned char *ba'> - self var: #bm declareC: 'int *bm'. - self var: #ba declareC: 'unsigned char *ba'. size := bm size. i := self encodeInt: size in: ba at: 1. k := 1. [k <= size] whileTrue: [word := bm at: k. lowByte := word bitAnd: 16rFF. eqBytes := ((word >> 8) bitAnd: 16rFF) = lowByte and: [((word >> 16) bitAnd: 16rFF) = lowByte and: [((word >> 24) bitAnd: 16rFF) = lowByte]]. j := k. [j < size and: [word = (bm at: j+1)]] "scan for = words..." whileTrue: [j := j+1]. j > k ifTrue: ["We have two or more = words, ending at j" eqBytes ifTrue: ["Actually words of = bytes" i := self encodeInt: j-k+1*4+1 in: ba at: i. ba at: i put: lowByte. i := i+1] ifFalse: [i := self encodeInt: j-k+1*4+2 in: ba at: i. i := self encodeBytesOf: word in: ba at: i]. k := j+1] ifFalse: ["Check for word of 4 = bytes" eqBytes ifTrue: ["Note 1 word of 4 = bytes" i := self encodeInt: 1*4+1 in: ba at: i. ba at: i put: lowByte. i := i+1. k := k + 1] ifFalse: ["Finally, check for junk" [j < size and: [(bm at: j) ~= (bm at: j+1)]] "scan for ~= words..." whileTrue: [j := j+1]. j = size ifTrue: [j := j + 1]. "We have one or more unmatching words, ending at j-1" i := self encodeInt: j-k*4+3 in: ba at: i. k to: j-1 do: [:m | i := self encodeBytesOf: (bm at: m) in: ba at: i]. k := j]]]. ^ i - 1 "number of bytes actually stored" " Space check: | n rawBytes myBytes b | n := rawBytes := myBytes := 0. Form allInstancesDo: [:f | f unhibernate. b := f bits. n := n + 1. rawBytes := rawBytes + (b size*4). myBytes := myBytes + (b compressToByteArray size). f hibernate]. Array with: n with: rawBytes with: myBytes ColorForms: (116 230324 160318 ) Forms: (113 1887808 1325055 ) Integerity check: Form allInstances do: [:f | f unhibernate. f bits = (Bitmap decompressFromByteArray: f bits compressToByteArray) ifFalse: [self halt]. f hibernate] Speed test: MessageTally spyOn: [Form allInstances do: [:f | Bitmap decompressFromByteArray: f bits compressToByteArray]] "! Item was changed: ----- Method: Bitmap>>decompress:fromByteArray:at: (in category 'filing') ----- decompress: bm fromByteArray: ba at: index "Decompress the body of a byteArray encoded by compressToByteArray (qv)... The format is simply a sequence of run-coded pairs, {N D}*. N is a run-length * 4 + data code. D, the data, depends on the data code... 0 skip N words, D is absent (could be used to skip from one raster line to the next) 1 N words with all 4 bytes = D (1 byte) 2 N words all = D (4 bytes) 3 N words follow in D (4N bytes) S and N are encoded as follows (see decodeIntFrom:)... 0-223 0-223 224-254 (0-30)*256 + next byte (0-7935) 255 next 4 bytes" "NOTE: If fed with garbage, this routine could read past the end of ba, but it should fail before writing past the ned of bm." | i code n anInt data end k pastEnd | <primitive: 'primitiveDecompressFromByteArray' module: 'MiscPrimitivePlugin'> + <var: #bm declareC: 'int *bm'> + <var: #ba declareC: 'unsigned char *ba'> - self var: #bm declareC: 'int *bm'. - self var: #ba declareC: 'unsigned char *ba'. i := index. "byteArray read index" end := ba size. k := 1. "bitmap write index" pastEnd := bm size + 1. [i <= end] whileTrue: ["Decode next run start N" anInt := ba at: i. i := i+1. anInt <= 223 ifFalse: [anInt <= 254 ifTrue: [anInt := (anInt-224)*256 + (ba at: i). i := i+1] ifFalse: [anInt := 0. 1 to: 4 do: [:j | anInt := (anInt bitShift: 8) + (ba at: i). i := i+1]]]. n := anInt >> 2. (k + n) > pastEnd ifTrue: [^ self primitiveFail]. code := anInt bitAnd: 3. code = 0 ifTrue: ["skip"]. code = 1 ifTrue: ["n consecutive words of 4 bytes = the following byte" data := ba at: i. i := i+1. data := data bitOr: (data bitShift: 8). data := data bitOr: (data bitShift: 16). 1 to: n do: [:j | bm at: k put: data. k := k+1]]. code = 2 ifTrue: ["n consecutive words = 4 following bytes" data := 0. 1 to: 4 do: [:j | data := (data bitShift: 8) bitOr: (ba at: i). i := i+1]. 1 to: n do: [:j | bm at: k put: data. k := k+1]]. code = 3 ifTrue: ["n consecutive words from the data..." 1 to: n do: [:m | data := 0. 1 to: 4 do: [:j | data := (data bitShift: 8) bitOr: (ba at: i). i := i+1]. bm at: k put: data. k := k+1]]]! Item was changed: ----- Method: Bitmap>>encodeBytesOf:in:at: (in category 'filing') ----- encodeBytesOf: anInt in: ba at: i "Copy the integer anInt into byteArray ba at index i, and return the next index" + <inline: true> + <var: #ba declareC: 'unsigned char *ba'> - self inline: true. - self var: #ba declareC: 'unsigned char *ba'. 0 to: 3 do: [:j | ba at: i+j put: (anInt >> (3-j*8) bitAnd: 16rFF)]. ^ i+4! Item was changed: ----- Method: Bitmap>>encodeInt:in:at: (in category 'filing') ----- encodeInt: anInt in: ba at: i "Encode the integer anInt in byteArray ba at index i, and return the next index. The encoding is as follows... 0-223 0-223 224-254 (0-30)*256 + next byte (0-7935) 255 next 4 bytes" + <inline: true> + <var: #ba declareC: 'unsigned char *ba'> - self inline: true. - self var: #ba declareC: 'unsigned char *ba'. anInt <= 223 ifTrue: [ba at: i put: anInt. ^ i+1]. anInt <= 7935 ifTrue: [ba at: i put: anInt//256+224. ba at: i+1 put: anInt\\256. ^ i+2]. ba at: i put: 255. ^ self encodeBytesOf: anInt in: ba at: i+1! |
Free forum by Nabble | Edit this page |