Code archives/Graphics/Pixmap paste with mask
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
The supplied Pixmap.paste method will use memcopy to copy all the pixels from source to target. This means that pixels normally omitted using the mask colour are also copied. This function (which could do with a tidy up) will copy pixels from source to target omitting pixels whose colour matches the mask. | |||||
Graphics 640,480 image1:TImage=LoadImage("max.png") image2:TImage=LoadImage("light.png") While Not KeyHit(key_escape) Cls If MouseHit(1) argb:Int=intcolor(image2.mask_r,image2.mask_g,image2.mask_b) image1:TImage=drawbuffer(image1,image2,0,0,argb) EndIf DrawImage image1,0,0 Flip Wend WaitKey() Function drawbuffer:TImage(imagea:TImage,imageb:TImage,x:Int,y:Int,argb:Int) If x + ImageWidth(imageb) > ImageWidth(imagea) Or y + ImageHeight(imageb) > ImageHeight(imagea) RuntimeError("Imagea to big to fit in imageb") ' start_func=MilliSecs() mypixmap2:TPixmap=LockImage(imageb) UnlockImage(imageb) mypixmap1:TPixmap=LockImage(imagea) Local mypixelptr2:Int Ptr = Int Ptr(mypixmap2.pixelptr(0,0)) Local mypixelptr2backup:Int Ptr = mypixelptr2 Local mypixelptr1:Int Ptr = Int Ptr(mypixmap1.pixelptr(x,y)) Local mypixelptr1backup:Int Ptr = mypixelptr1 For my_x=0 To ((mypixmap2.width)*(mypixmap2.height)) If mypixelptr2[0] <> argb If mypixelptr2[0] <> 0 mypixelptr1[0]=mypixelptr2[0] ' If mypixelptr2[0] <> 16777215 mypixelptr1[0]=mypixelptr2[0] EndIf mypixelptr1:+1 mypixelptr2:+1 If mypixelptr2 = mypixelptr2backup+(mypixmap2.pitch Shr 2) mypixelptr1 = mypixelptr1backup+(mypixmap1.pitch Shr 2) mypixelptr1backup=mypixelptr1 mypixelptr2backup=mypixelptr2 EndIf Next Return LoadImage(mypixmap1) ' end_func=MilliSecs() End Function Function IntColor(R,G,B,A=255) 'returns argb value from red, green, blue. Return A Shl 24 | R Shl 16 | G Shl 8 | B Shl 0 End Function |
Comments
None.
Code Archives Forum