Folks:
Drawing symbols on an image, in my app, has gone up a factor of 10, from 2.25 
seconds in version 6.6.2 to 24 seconds in version 7.0RC1. I’m on OSX, 
Mavericks. This is a significant slowdown. The slowdown occurs in the 
drawSymbol method. If I comment it out, so all the operations happen without 
actually drawing the symbol, the speed without drawing the symbol is 4.55 
seconds in v7.0. I can tolerate the delay from 2.25 to 4.55 seconds, but the 
symbol drawing routine slowdown is quite significant and I’d like to see it 
speeded up.

My drawing code is derived from Colin’s SimplePaint program, modified for byte 
operations. The drawing code is below. First an array of the symbol image data 
is created, then when drawing all of the symbols, that array is accessed to put 
the image data into the binary of the image. I included the setSymbolArray 
handler (which is only called once), for clarity. The major slowdown is not in 
this method.

Can anybody, with a quick scan suggest how to optimize this, or perhaps its a 
problem with livecode. If it’s not obvious to anybody, I’ll see if I can narrow 
the problem to a specific line of script.

Thanks,
Bill

—This is the draw program. For each symbol, the correct element of the symbol 
array is loaded to the array: sBrushDataArray
on drawTheSymbol x,y
   put round(x) into startX
   put round(y) into startY
   put round(sBrushWidth/4) into sXDelta
   put round(sBrushHeight/2) into sYDelta
   put the keys of sBrushDataArray into tBrushKeys
   repeat for each line aKey in tBrushKeys
      put sBrushDataArray[aKey] into tbrushBinaryData --  the current part of a 
row of binary data of brush 
      put length (tbrushBinaryData) into tLength -- the length of the binary 
data
      put aKey div sBrushWidth into tBrushRow -- calculate the row of the brush 
the data comes from
      -- get currentBrushRow for calculation of imagedata row to fit it into 
the image, sYDelta offsets the brush
      put tBrushRow + startY - sYDelta  into tImageCurrRow
      
      put aKey mod sBrushWidth into tCurrBrushColumn -- the column of the brush 
the current data comes from
      put tCurrBrushColumn + startX - sXDelta into tCurrImageColumn -- the 
column in the image to fit into the imageData; sXDelta offsets the brush
      
      put tImageCurrRow * sMyWidth + tCurrImageColumn into tNewStart -- 
calculate the byte in xy coord of the image where to insert brushData
      put byte 1 to tLength of tbrushBinaryData into byte tNewStart * 4 - 3 to 
tNewStart*4 - 3  + tLength -1 of imgdata  -- insert brushimageData into image 
imageData
   end repeat
end drawTheSymbol

—This method is called only once. The array is created with an element for each 
symbol that is to be plotted
   --This puts image data into the quakeBrushForMag[#] array
on setSymbolArray currentbrush
   put the imageData of image currentbrush into currentbrushdata
   put the alphaData of image currentbrush into brushalpha
   put the width of image currentBrush into sBrushWidth
   put the height of image currentBrush into sBrushHeight
   
   put  round(sBrushWidth/2) into sXDelta  -- to offset the brush so it is 
visible when using the finger
   put  sBrushHeight into sYDelta -- same as above
   put 0 into sXDelta
   put 0 into sYDelta
   put "" into sBrushDataArray
   
   --- build array of brush imagedata
   repeat with y = 0 to sBrushHeight - 1
      put byteToNum (byte ((y*sBrushWidth)+1) of brushalpha)
      if byteToNum (byte ((y*sBrushWidth)+1) of brushalpha) > sAlphaCutOff  then
         put true into tAlphaOn
         put "" into tCollect
         put ((y*sBrushWidth ) + 1) into tStartDot
      else 
         put false into tAlphaOn
         put "" into tCollect
      end if
      repeat with x = 0 to sBrushWidth - 1
         put ((x+(y*sBrushWidth))+1) into tDot
         put (byteToNum(byte tDot of brushalpha) > sAlphaCutOff) into 
tNowAlphaOn
         if tNowAlphaOn then 
            put byte tDot * 4 - 3 to tDot * 4  of currentbrushdata after 
tCollect -- above threshold-> collect
         end if
         -- test if state of alpha threshold changed
         if tAlphaOn <> tNowAlphaOn then
            if tAlphaOn then 
               -- state changed to alpha below threshold, write array
               put tDot into tStopDot
               put tCollect into sBrushDataArray[tStartDot]
               put "" into tCollect -- clear tCollect since it is passed to the 
array
            else
               -- state changed to alpha above threshold
               put tDot into tStartDot
            end if
            -- reset tAlphaOn to current state of alpha threshold since it 
changed
            put tNowAlphaOn into tAlphaOn
            -- end alpha state changed
         end if
      end repeat
      if tCollect <> "" then put tCollect into sBrushDataArray[tStartDot]
      put "" into tCollect
   end repeat
   --- end build array
end setSymbolArray


William A. Prothero
http://es.earthednet.org/

_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode

Reply via email to