'From Squeak3.1alpha of 4 February 2001 [latest update: #3768] on 3 March 2001 at 4:47:42 pm'! "Change Set: ProjResources2 Date: 3 March 2001 Author: Andreas Raab Improvements to resources from the net. Fixes the problem of lost forms that were held by the hand when the net version was coming in. Uses bilinear interpolation for thumbnails. Makes better estimation about when to store a form separately from the project."! !Bitmap methodsFor: 'accessing' stamp: 'ar 3/3/2001 16:11'! atAllPut: value "Fill the receiver, an indexable bytes or words object, with the given positive integer. The range of possible fill values is [0..255] for byte arrays and [0..(2^32 - 1)] for word arrays." super atAllPut: value.! ! !Bitmap methodsFor: 'accessing' stamp: 'ar 3/3/2001 16:18'! byteSize ^self size * 4! ! !ByteArray methodsFor: 'accessing' stamp: 'ar 3/3/2001 16:17'! byteSize ^self size! ! !Form methodsFor: 'displaying' stamp: 'ar 3/3/2001 16:13'! displayResourceFormOn: aForm "a special display method for blowing up resource thumbnails" | engine tx cmap | self extent = aForm extent ifTrue:[^self displayOn: aForm]. Smalltalk at: #B3DRenderEngine ifPresent:[:engineClass| engine _ (engineClass defaultForPlatformOn: aForm)]. engine ifNil:[ "We've got no bilinear interpolation. Use WarpBlt instead" (WarpBlt current toForm: aForm) sourceForm: self destRect: aForm boundingBox; combinationRule: 3; cellSize: 2; warpBits. ^self ]. "map transparency to current World background color" tx _ self asTexture. cmap _ depth <= 8 ifTrue:[Bitmap new: (1 << self depth)] ifFalse:[4096]. cmap at: 1 put: (World color pixelWordForDepth: tx depth). (BitBlt current toForm: tx) sourceForm: self; destRect: aForm boundingBox; sourceOrigin: 0@0; combinationRule: Form paint; colorMap: cmap; copyBits. engine viewport: aForm boundingBox. engine material: ((Smalltalk at: #B3DMaterial) new emission: Color white). engine texture: tx. engine render: ((Smalltalk at: #B3DIndexedQuadMesh) new plainTextureRect). engine finish. "the above, using bilinear interpolation doesn't leave transparent pixel values intact" (WarpBlt current toForm: aForm) sourceForm: self destRect: aForm boundingBox; combinationRule: Form and; colorMap: (Color maskingMap: self depth); warpBits.! ! !Form methodsFor: 'fileIn/Out' stamp: 'ar 3/3/2001 16:16'! objectForDataStream: refStream | prj repl | prj _ refStream project. prj ifNil:[^super objectForDataStream: refStream]. ResourceCollector current ifNil:[^super objectForDataStream: refStream]. repl _ ResourceCollector current objectForDataStream: refStream fromForm: self. ^repl! ! !Form methodsFor: 'fileIn/Out' stamp: 'ar 3/3/2001 15:50'! unhibernate "If my bitmap has been compressed into a ByteArray, then expand it now, and return true." | resBits | bits isForm ifTrue:[ resBits _ bits. bits _ Bitmap new: self bitsSize. resBits displayResourceFormOn: self. ^true]. bits == nil ifTrue:[bits _ Bitmap new: self bitsSize. ^true]. (bits isMemberOf: ByteArray) ifTrue: [bits _ Bitmap decompressFromByteArray: bits. ^ true]. ^ false! ! !Morph methodsFor: 'initialization' stamp: 'ar 3/3/2001 15:28'! resourceJustLoaded "In case resource relates to me" self releaseCachedState.! ! !HandMorph methodsFor: 'initialization' stamp: 'ar 3/3/2001 15:27'! resourceJustLoaded "In case resource relates to me" cacheCanvas _ nil.! ! !PasteUpMorph methodsFor: 'initialization' stamp: 'ar 3/3/2001 15:30'! newResourceLoaded "Some resource has just been loaded. Notify all morphs in case somebody wants to update accordingly." self allMorphsDo:[:m| m resourceJustLoaded ]. self fullRepaintNeeded.! ! !ResourceCollector methodsFor: 'accessing' stamp: 'ar 3/3/2001 16:18'! objectForDataStream: refStream fromForm: aForm "Return a replacement for aForm to be stored instead" | stub fName fStream copy loc fullSize | stub _ originalMap at: aForm ifAbsent:[nil]. stub ifNotNil:[^aForm]. aForm hibernate. (aForm bits byteSize < 4096) ifTrue:[^aForm]. "too small to be of interest" stub _ FormStub extent: (aForm width min: 32) @ (aForm height min: 32) depth: (aForm depth min: 8). aForm displayScaledOn: stub. aForm hibernate. copy _ Form extent: aForm extent depth: aForm depth bits: nil. copy setResourceBits: aForm bits. fName _ localDirectory nextNameFor:'resource' extension:'form'. fStream _ localDirectory newFileNamed: fName. fStream binary. copy storeResourceOn: fStream. "Compress contents here" fStream position: 0. fStream compressFile. localDirectory deleteFileNamed: fName. localDirectory rename: fName, FileDirectory dot, 'gz' toBe: fName. fStream _ localDirectory readOnlyFileNamed: fName. fullSize _ fStream size. fStream close. ProgressNotification signal: '2:resourceFound' extra: stub. stub hibernate. loc _ locatorMap at: aForm ifAbsent:[nil]. (loc notNil and:[loc hasRemoteContents not]) ifTrue:[ "The locator describes some local resource. If we're preparing to upload the entire project to a remote server, make it a remote URL instead." baseUrl asUrl hasRemoteContents ifTrue:[loc urlString: baseUrl, fName]]. loc ifNil:[ loc _ ResourceLocator new urlString: baseUrl, fName. locatorMap at: aForm put: loc]. loc localFileName: (localDirectory fullNameFor: fName). loc resourceFileSize: fullSize. stub locator: loc. aForm setResourceBits: stub. originalMap at: aForm put: copy. stubMap at: stub put: aForm. locatorMap at: aForm put: loc. "note: *must* force aForm in out pointers if in IS or else won't get #comeFullyUpOnReload:" refStream replace: aForm with: aForm. ^aForm! ! !ResourceManager methodsFor: 'private' stamp: 'ar 3/3/2001 15:30'! formChangedReminder ^[World newResourceLoaded].! ! !String methodsFor: 'accessing' stamp: 'ar 3/3/2001 16:17'! byteSize ^self size! ! !WordArray methodsFor: 'accessing' stamp: 'ar 3/3/2001 16:18'! byteSize ^self size * 4! ! ResourceManager removeSelector: #installResource:from:!