[Vm-dev] VM Maker: VMMaker.oscog-nice.2909.mcz

David T. Lewis lewis at mail.msen.com
Sun Dec 27 21:24:53 UTC 2020


Bravo! Thank you Nicolas.

Dave

On Sun, Dec 27, 2020 at 09:42:47PM +0100, karl ramberg wrote:
>  
> Finally :-D
> 
> Best,
> Karl
> 
> 
> On Wed, Dec 23, 2020 at 9:55 PM <commits at source.squeak.org> wrote:
> 
> >
> > Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
> > http://source.squeak.org/VMMaker/VMMaker.oscog-nice.2909.mcz
> >
> > ==================== Summary ====================
> >
> > Name: VMMaker.oscog-nice.2909
> > Author: nice
> > Time: 23 December 2020, 9:54:51.201058 pm
> > UUID: 6869c4f1-9d80-40c3-8409-7c05e087edf5
> > Ancestors: VMMaker.oscog-eem.2908
> >
> > WIP: implement new BitBlt ops (rules) for alpha compositing
> >
> >                 "42" alphaScale:with:
> >                 "43" alphaUnscale:with:
> >                 "44" alphaBlendUnscaled:with:
> >
> > This is a proposal implementation for
> > https://github.com/OpenSmalltalk/opensmalltalk-vm/issues/505
> >
> > The generated C code compiles, but it's otherwise mostly yet unused and
> > untested code. I commit it before I loose it.
> > There's probably more to do for letting accelerated code work (PI).
> >
> > =============== Diff against VMMaker.oscog-eem.2908 ===============
> >
> > Item was changed:
> >   SmartSyntaxInterpreterPlugin subclass: #BitBltSimulation
> >         instanceVariableNames: 'destForm sourceForm halftoneForm
> > combinationRule destX destY width height sourceX sourceY clipX clipY
> > clipWidth clipHeight sourceWidth sourceHeight sourceDepth sourcePitch
> > sourceBits sourcePPW sourceMSB destWidth destHeight destDepth destPitch
> > destBits destPPW destMSB bitCount skew mask1 mask2 preload nWords destMask
> > hDir vDir sourceIndex sourceDelta destIndex destDelta sx sy dx dy bbW bbH
> > halftoneHeight noSource noHalftone halftoneBase sourceAlpha srcBitShift
> > dstBitShift bitBltOop affectedL affectedR affectedT affectedB opTable
> > maskTable ditherMatrix4x4 ditherThresholds16 ditherValues16 hasSurfaceLock
> > warpSrcShift warpSrcMask warpAlignShift warpAlignMask warpBitShiftTable
> > querySurfaceFn lockSurfaceFn unlockSurfaceFn isWarping cmFlags cmMask
> > cmShiftTable cmMaskTable cmLookupTable cmBitsPerColor dither8Lookup
> > componentAlphaModeColor componentAlphaModeAlpha ungammaLookupTable
> > gammaLookupTable numGCsOnInvocation bitBltIsReceiver endOfDestination
> > endOfSource'
> >         classVariableNames: 'AllOnes AlphaIndex BBClipHeightIndex
> > BBClipWidthIndex BBClipXIndex BBClipYIndex BBColorMapIndex BBDestFormIndex
> > BBDestXIndex BBDestYIndex BBHalftoneFormIndex BBHeightIndex BBLastIndex
> > BBRuleIndex BBSourceFormIndex BBSourceXIndex BBSourceYIndex BBWarpBase
> > BBWidthIndex BBXTableIndex BEBitBltIndex BinaryPoint BlueIndex
> > ColorMapFixedPart ColorMapIndexedPart ColorMapNewStyle ColorMapPresent
> > CrossedX EndOfRun FixedPt1 FormBitsIndex FormDepthIndex FormHeightIndex
> > FormWidthIndex GreenIndex OpTable OpTableSize RedIndex'
> >         poolDictionaries: ''
> >         category: 'VMMaker-Interpreter'!
> >
> > + !BitBltSimulation commentStamp: 'nice 10/31/2020 23:39' prior: 0!
> > - !BitBltSimulation commentStamp: 'tpr 3/25/2013 16:50' prior: 0!
> >   This class implements BitBlt, much as specified in the Blue Book spec.
> >
> >   Performance has been enhanced through the use of pointer variables such
> > as sourceIndex and destIndex, and by separating several special cases of
> > the inner loop.
> >
> >   Operation has been extended to color, with support for 1, 2, 4, 8, 16,
> > and 32-bit pixel sizes.  Conversion between different pixel sizes is
> > facilitated by accepting an optional color map.
> >
> >   In addition to the original 16 combination rules, this BitBlt supports
> >         16      fail (for old paint mode)
> >         17      fail (for old mask mode)
> >         18      sourceWord + destinationWord
> >         19      sourceWord - destinationWord
> >         20      rgbAdd: sourceWord with: destinationWord
> >         21      rgbSub: sourceWord with: destinationWord
> >         22      OLDrgbDiff: sourceWord with: destinationWord
> >         23      OLDtallyIntoMap: destinationWord -- old vers doesn't clip
> > to bit boundary
> >         24      alphaBlend: sourceWord with: destinationWord
> >         25      pixPaint: sourceWord with: destinationWord
> >         26      pixMask: sourceWord with: destinationWord
> >         27      rgbMax: sourceWord with: destinationWord
> >         28      rgbMin: sourceWord with: destinationWord
> >         29      rgbMin: sourceWord bitInvert32 with: destinationWord
> >         30      alphaBlendConst: sourceWord with: destinationWord -- alpha
> > passed as an arg
> >         31      alphaPaintConst: sourceWord with: destinationWord -- alpha
> > passed as an arg
> >         32      rgbDiff: sourceWord with: destinationWord
> >         33      tallyIntoMap: destinationWord
> >         34      alphaBlendScaled: sourceWord with: destinationWord
> >         35 alphaBlendScaled: sourceWord with:   "unused here - only used
> > by FXBlt"
> >         36 alphaBlendScaled: sourceWord with:   "unused here - only used
> > by FXBlt"
> >         37 rgbMul: sourceWord with: destinationWord
> >         38 pixSwap: sourceWord with: destinationWord
> >         39 pixClear: sourceWord with: destinationWord
> >         40 fixAlpha: sourceWord with: destinationWord
> >         41 rgbComponentAlpha: sourceWord with: destinationWord
> > +       42 alphaScale: ignoredSourceWord with: destinationWord
> > +       43 alphaUnscale: ignoredSourceWord with: destinationWord
> > +       44      alphaBlendUnscaled: sourceWord with: destinationWord
> >
> >   This implementation has also been fitted with an experimental "warp
> > drive" that allows abritrary scaling and rotation (and even limited affine
> > deformations) with all BitBlt storage modes supported.
> >
> >   To add a new rule to BitBlt...
> >         1.  add the new rule method or methods in the category
> > 'combination rules' of BBSim
> >         2.  describe it in the class comment  of BBSim and in the class
> > comment for BitBlt
> >         3.  add refs to initializeRuleTable in proper positions
> >         4.  add refs to initBBOpTable, following the pattern
> >   !
> >
> > Item was changed:
> >   ----- Method: BitBltSimulation class>>initializeRuleTable (in category
> > 'initialization') -----
> >   initializeRuleTable
> >         "BitBltSimulation initializeRuleTable"
> >         "**WARNING** You MUST change initBBOpTable if you change this"
> >         OpTable := #(
> >                 "0" clearWord:with:
> >                 "1" bitAnd:with:
> >                 "2" bitAndInvert:with:
> >                 "3" sourceWord:with:
> >                 "4" bitInvertAnd:with:
> >                 "5" destinationWord:with:
> >                 "6" bitXor:with:
> >                 "7" bitOr:with:
> >                 "8" bitInvertAndInvert:with:
> >                 "9" bitInvertXor:with:
> >                 "10" bitInvertDestination:with:
> >                 "11" bitOrInvert:with:
> >                 "12" bitInvertSource:with:
> >                 "13" bitInvertOr:with:
> >                 "14" bitInvertOrInvert:with:
> >                 "15" destinationWord:with:
> >                 "16" destinationWord:with: "unused - was old paint"
> >                 "17" destinationWord:with: "unused - was old mask"
> >                 "18" addWord:with:
> >                 "19" subWord:with:
> >                 "20" rgbAdd:with:
> >                 "21" rgbSub:with:
> >                 "22" OLDrgbDiff:with:
> >                 "23" OLDtallyIntoMap:with:
> >                 "24" alphaBlend:with:
> >                 "25" pixPaint:with:
> >                 "26" pixMask:with:
> >                 "27" rgbMax:with:
> >                 "28" rgbMin:with:
> >                 "29" rgbMinInvert:with:
> >                 "30" alphaBlendConst:with:
> >                 "31" alphaPaintConst:with:
> >                 "32" rgbDiff:with:
> >                 "33" tallyIntoMap:with:
> >                 "34" alphaBlendScaled:with:
> >
> >                 "35" alphaBlendScaled:with:     "unused here - only used
> > by FXBlt"
> >                 "36" alphaBlendScaled:with:     "unused here - only used
> > by FXBlt"
> >                 "37" rgbMul:with:
> >                 "38" pixSwap:with:
> >                 "39" pixClear:with:
> >                 "40" fixAlpha:with:
> >                 "41" rgbComponentAlpha:with:
> > +               "42" alphaScale:with:
> > +               "43" alphaUnscale:with:
> > +               "44" alphaBlendUnscaled:with:
> >         ).
> >         OpTableSize := OpTable size + 1.  "0-origin indexing"
> >   !
> >
> > Item was added:
> > + ----- Method: BitBltSimulation>>alphaBlendUnscaled:with: (in category
> > 'combination rules') -----
> > + alphaBlendUnscaled: sourceWord with: destinationWord
> > +       "Blend sourceWord with destinationWord using the alpha value from
> > both sourceWord and destinationWord.
> > +       Alpha is encoded as 0 meaning 0.0, and 255 meaning 1.0.
> > +       The alpha channel and color produced are
> > +
> > +               srcAlpha + (destAlpha*(1-srcAlpha))
> > +               (srcAlpha*srcColor + (destAlpha*(1-srcAlpha)*dstColor)) /
> > (srcAlpha + (destAlpha*(1-srcAlpha)))
> > +
> > +       In contrast to alphaBlend:with: the method does not assume that
> > destination form is opaque.
> > +       In contrast to alphaBlendScaled:with: the method does not assume
> > that colors have been pre-scaled (muliplied) by alpha channel."
> > +       | alpha blendA result blendRB blendG |
> > +       <inline: false>
> > +       <returnTypeC: 'unsigned int'>
> > +       <var: #sourceWord type: 'unsigned int'>
> > +       <var: #destinationWord type: 'unsigned int'>
> > +       <var: #blendRB type: 'unsigned int'>
> > +       <var: #blendG type: 'unsigned int'>
> > +       <var: #result type: 'unsigned int'>
> > +       <var: #alpha type: 'unsigned int'>
> > +       <var: #blendA type: 'unsigned int'>
> > +       alpha := sourceWord >> 24.  "High 8 bits of source pixel, assuming
> > ARGB encoding"
> > +       alpha = 0 ifTrue: [ ^ destinationWord ].
> > +       alpha = 255 ifTrue: [ ^ sourceWord ].
> > +
> > +       blendA := 16rFF * alpha + (16rFF - alpha * (destinationWord >>
> > 24)) + 16rFF. "blend alpha channels"
> > +       blendA := blendA + (blendA - 1 >> 8 bitAnd: 16rFF) >> 8 bitAnd:
> > 16rFF. "divide by 255"
> > +
> > +       blendRB := ((sourceWord bitAnd: 16rFF00FF) * alpha) +
> > +                               ((destinationWord bitAnd: 16rFF00FF) *
> > (blendA-alpha))
> > +                               / blendA.       "blend red and blue"
> > +
> > +       blendG := ((sourceWord bitAnd: 16r00FF00) * alpha) +
> > +                               ((destinationWord bitAnd: 16r00FF00) *
> > (blendA-alpha))
> > +                               / blendA.       "blend green"
> > +       result := (blendRB bitOr: blendG) bitOr: blendA << 24.
> > +       ^ result
> > + !
> >
> > Item was added:
> > + ----- Method: BitBltSimulation>>alphaScale:with: (in category
> > 'combination rules') -----
> > + alphaScale: sourceWord with: destinationWord
> > +       "Scale (premultiply) the destination with its alpha channel.
> > +       Note that sourceWord is ignored."
> > +       | alpha rb g |
> > +       <inline: false> "Do NOT inline this into optimized loops"
> > +       <returnTypeC: 'unsigned int'>
> > +       <var: #sourceWord type: 'unsigned int'>
> > +       <var: #destinationWord type: 'unsigned int'>
> > +       <var: #rb type: 'unsigned int'>
> > +       <var: #g type: 'unsigned int'>
> > +       <var: #alpha type: 'unsigned int'>
> > +       alpha := destinationWord >> 24.  "High 8 bits is opacity (ARGB
> > format)"
> > +       rb := ((destinationWord bitAnd: 16rFF00FF) * alpha >> 8 bitAnd:
> > 16rFF00FF). "scale red and blue components"
> > +       g := ((destinationWord bitAnd: 16r00FF00) * alpha >> 8 bitAnd:
> > 16r00FF00). "scale green component"
> > +       ^(g bitOr: rb) bitOr: (destinationWord bitAnd: 16rFF000000)
> > "recompose"!
> >
> > Item was added:
> > + ----- Method: BitBltSimulation>>alphaUnscale:with: (in category
> > 'combination rules') -----
> > + alphaUnscale: sourceWord with: destinationWord
> > +       "Unscale (divide) the destination with its alpha channel.
> > +       Note that sourceWord is ignored."
> > +       | alpha rb g rgb carry |
> > +       <inline: false> "Do NOT inline this into optimized loops"
> > +       <returnTypeC: 'unsigned int'>
> > +       <var: #sourceWord type: 'unsigned int'>
> > +       <var: #destinationWord type: 'unsigned int'>
> > +       <var: #rb type: 'unsigned int'>
> > +       <var: #g type: 'unsigned int'>
> > +       <var: #rgb type: 'unsigned int'>
> > +       <var: #alpha type: 'unsigned int'>
> > +       <var: #carry type: 'unsigned int'>
> > +       alpha := destinationWord >> 24.  "High 8 bits is opacity (ARGB
> > format)"
> > +       alpha = 0 ifTrue: [^0].
> > +       rb := (destinationWord bitAnd: 16rFF00FF) << 8 / alpha. "unscale
> > red and blue components"
> > +       g := (destinationWord bitAnd: 16r00FF00) / alpha. "unscale green
> > component"
> > +       carry := ((rb >> 8 bitAnd: 16rAA00AA) >> 1 bitOr: (rb >> 8 bitAnd:
> > 16r550055) << 1)
> > +               bitOr: ((g bitAnd: 16r00AA00) >> 1 bitOr: (g bitAnd:
> > 16r005500) << 1).
> > +       carry := (carry bitAnd: 16rCCCCCC) >> 2 bitOr: (carry bitAnd:
> > 16r333333) << 2.
> > +       carry := (carry bitAnd: 16rF0F0F0) >> 4 bitOr: (carry bitAnd:
> > 16r0F0F0F) << 4.
> > +       rgb := (rb bitAnd: 16rFF00FF) bitOr: (g << 8 bitAnd: 16r00FF00).
> > +       rgb := rgb bitOr: carry.  "saturate RGB components if division
> > overflows"
> > +       ^rgb bitOr: (destinationWord bitAnd: 16rFF000000) "restore alpha"!
> >
> > Item was changed:
> >   ----- Method: BitBltSimulation>>initBBOpTable (in category
> > 'initialize-release') -----
> >   initBBOpTable
> >         self cCode: 'opTable[0+1] = (void *)clearWordwith'.
> >         self cCode: 'opTable[1+1] = (void *)bitAndwith'.
> >         self cCode: 'opTable[2+1] = (void *)bitAndInvertwith'.
> >         self cCode: 'opTable[3+1] = (void *)sourceWordwith'.
> >         self cCode: 'opTable[4+1] = (void *)bitInvertAndwith'.
> >         self cCode: 'opTable[5+1] = (void *)destinationWordwith'.
> >         self cCode: 'opTable[6+1] = (void *)bitXorwith'.
> >         self cCode: 'opTable[7+1] = (void *)bitOrwith'.
> >         self cCode: 'opTable[8+1] = (void *)bitInvertAndInvertwith'.
> >         self cCode: 'opTable[9+1] = (void *)bitInvertXorwith'.
> >         self cCode: 'opTable[10+1] = (void *)bitInvertDestinationwith'.
> >         self cCode: 'opTable[11+1] = (void *)bitOrInvertwith'.
> >         self cCode: 'opTable[12+1] = (void *)bitInvertSourcewith'.
> >         self cCode: 'opTable[13+1] = (void *)bitInvertOrwith'.
> >         self cCode: 'opTable[14+1] = (void *)bitInvertOrInvertwith'.
> >         self cCode: 'opTable[15+1] = (void *)destinationWordwith'.
> >         self cCode: 'opTable[16+1] = (void *)destinationWordwith'.
> >         self cCode: 'opTable[17+1] = (void *)destinationWordwith'.
> >         self cCode: 'opTable[18+1] = (void *)addWordwith'.
> >         self cCode: 'opTable[19+1] = (void *)subWordwith'.
> >         self cCode: 'opTable[20+1] = (void *)rgbAddwith'.
> >         self cCode: 'opTable[21+1] = (void *)rgbSubwith'.
> >         self cCode: 'opTable[22+1] = (void *)OLDrgbDiffwith'.
> >         self cCode: 'opTable[23+1] = (void *)OLDtallyIntoMapwith'.
> >         self cCode: 'opTable[24+1] = (void *)alphaBlendwith'.
> >         self cCode: 'opTable[25+1] = (void *)pixPaintwith'.
> >         self cCode: 'opTable[26+1] = (void *)pixMaskwith'.
> >         self cCode: 'opTable[27+1] = (void *)rgbMaxwith'.
> >         self cCode: 'opTable[28+1] = (void *)rgbMinwith'.
> >         self cCode: 'opTable[29+1] = (void *)rgbMinInvertwith'.
> >         self cCode: 'opTable[30+1] = (void *)alphaBlendConstwith'.
> >         self cCode: 'opTable[31+1] = (void *)alphaPaintConstwith'.
> >         self cCode: 'opTable[32+1] = (void *)rgbDiffwith'.
> >         self cCode: 'opTable[33+1] = (void *)tallyIntoMapwith'.
> >         self cCode: 'opTable[34+1] = (void *)alphaBlendScaledwith'.
> >         self cCode: 'opTable[35+1] = (void *)alphaBlendScaledwith'.
> >         self cCode: 'opTable[36+1] = (void *)alphaBlendScaledwith'.
> >         self cCode: 'opTable[37+1] = (void *)rgbMulwith'.
> >         self cCode: 'opTable[38+1] = (void *)pixSwapwith'.
> >         self cCode: 'opTable[39+1] = (void *)pixClearwith'.
> >         self cCode: 'opTable[40+1] = (void *)fixAlphawith'.
> > +       self cCode: 'opTable[41+1] = (void *)rgbComponentAlphawith'.
> > +       self cCode: 'opTable[42+1] = (void *)alphaScalewith'.
> > +       self cCode: 'opTable[43+1] = (void *)alphaUnscalewith'.
> > +       self cCode: 'opTable[44+1] = (void *)alphaBlendUnscaledwith'.!
> > -       self cCode: 'opTable[41+1] = (void *)rgbComponentAlphawith'.!
> >
> >



More information about the Vm-dev mailing list