David T. Lewis uploaded a new version of Sound to project The Trunk:
http://source.squeak.org/trunk/Sound-dtl.25.mcz
==================== Summary ====================
Name: Sound-dtl.25
Author: dtl
Time: 24 October 2010, 1:01:43.002 pm
UUID: 5c164c71-a94e-452d-a78a-96e936f3a920
Ancestors: Sound-nice.24
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 Sound-nice.24 ===============
Item was changed:
----- Method: SampledSound class>>convert8bitSignedFrom:to16Bit: (in category 'utilities') -----
convert8bitSignedFrom: aByteArray to16Bit: aSoundBuffer
"Copy the contents of the given array of signed 8-bit samples into the given array of 16-bit signed samples."
| n s |
<primitive: 'primitiveConvert8BitSigned' module: 'MiscPrimitivePlugin'>
+ <var: #aByteArray declareC: 'unsigned char *aByteArray'>
+ <var: #aSoundBuffer declareC: 'unsigned short *aSoundBuffer'>
- self var: #aByteArray declareC: 'unsigned char *aByteArray'.
- self var: #aSoundBuffer declareC: 'unsigned short *aSoundBuffer'.
n := aByteArray size.
1 to: n do: [:i |
s := aByteArray at: i.
s > 127
ifTrue: [aSoundBuffer at: i put: ((s - 256) bitShift: 8)]
ifFalse: [aSoundBuffer at: i put: (s bitShift: 8)]].
!
David T. Lewis uploaded a new version of Sound to project The Trunk:
http://source.squeak.org/trunk/Sound-dtl.25.mcz
==================== Summary ====================
Name: Sound-dtl.25
Author: dtl
Time: 24 October 2010, 1:01:43.002 pm
UUID: 5c164c71-a94e-452d-a78a-96e936f3a920
Ancestors: Sound-nice.24
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 Sound-nice.24 ===============
Item was changed:
----- Method: SampledSound class>>convert8bitSignedFrom:to16Bit: (in category 'utilities') -----
convert8bitSignedFrom: aByteArray to16Bit: aSoundBuffer
"Copy the contents of the given array of signed 8-bit samples into the given array of 16-bit signed samples."
| n s |
<primitive: 'primitiveConvert8BitSigned' module: 'MiscPrimitivePlugin'>
+ <var: #aByteArray declareC: 'unsigned char *aByteArray'>
+ <var: #aSoundBuffer declareC: 'unsigned short *aSoundBuffer'>
- self var: #aByteArray declareC: 'unsigned char *aByteArray'.
- self var: #aSoundBuffer declareC: 'unsigned short *aSoundBuffer'.
n := aByteArray size.
1 to: n do: [:i |
s := aByteArray at: i.
s > 127
ifTrue: [aSoundBuffer at: i put: ((s - 256) bitShift: 8)]
ifFalse: [aSoundBuffer at: i put: (s bitShift: 8)]].
!
David T. Lewis uploaded a new version of Sound to project The Trunk:
http://source.squeak.org/trunk/Sound-dtl.25.mcz
==================== Summary ====================
Name: Sound-dtl.25
Author: dtl
Time: 24 October 2010, 1:01:43.002 pm
UUID: 5c164c71-a94e-452d-a78a-96e936f3a920
Ancestors: Sound-nice.24
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 Sound-nice.24 ===============
Item was changed:
----- Method: SampledSound class>>convert8bitSignedFrom:to16Bit: (in category 'utilities') -----
convert8bitSignedFrom: aByteArray to16Bit: aSoundBuffer
"Copy the contents of the given array of signed 8-bit samples into the given array of 16-bit signed samples."
| n s |
<primitive: 'primitiveConvert8BitSigned' module: 'MiscPrimitivePlugin'>
+ <var: #aByteArray declareC: 'unsigned char *aByteArray'>
+ <var: #aSoundBuffer declareC: 'unsigned short *aSoundBuffer'>
- self var: #aByteArray declareC: 'unsigned char *aByteArray'.
- self var: #aSoundBuffer declareC: 'unsigned short *aSoundBuffer'.
n := aByteArray size.
1 to: n do: [:i |
s := aByteArray at: i.
s > 127
ifTrue: [aSoundBuffer at: i put: ((s - 256) bitShift: 8)]
ifFalse: [aSoundBuffer at: i put: (s bitShift: 8)]].
!
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!
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!
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!
Levente Uzonyi uploaded a new version of Tests to project The Trunk:
http://source.squeak.org/trunk/Tests-ul.97.mcz
==================== Summary ====================
Name: Tests-ul.97
Author: ul
Time: 24 October 2010, 6:06:56.495 am
UUID: f5f99e31-06dd-3048-b380-77cc97804a79
Ancestors: Tests-eem.96
Bitmap >> #writeOn: raises an error, because it evaluates code which sends #inline: and #var:declareC:, etc. Since these methods were moved to VMMaker these sends result in a DNU.
=============== Diff against Tests-eem.96 ===============
Item was changed:
+ ----- Method: BitmapBugz>>testBitmapByteAt (in category 'tests') -----
- ----- Method: BitmapBugz>>testBitmapByteAt (in category 'as yet unclassified') -----
testBitmapByteAt
| bm |
bm := Bitmap new: 1.
1 to: 4 do:[:i|
self should:[bm byteAt: i put: 1000] raise: Error.
].!
Item was added:
+ ----- Method: BitmapBugz>>testWriteOn (in category 'tests') -----
+ testWriteOn
+
+ | original binary copy |
+ original := Bitmap new: 1.
+ original byteAt: 1 put: 42.
+ binary := ByteArray streamContents: [ :stream |
+ original writeOn: stream ].
+ copy := Bitmap newFromStream: binary readStream.
+ self assert: original = copy!