Code archives/Graphics/TBM Images
This code has been declared by its author to be Public Domain code.
Download source code
| First you'll need to create a TBM image file and then you can load and display them. It uses banks so it's faster than just drawing transparent (adjustable transparency) Blitz-loaded images. Supports frames! |
Function CreateTBMImage(img$, map$, file$, flag=1) ; flags: 1 - normal, 2 - scaled image, 3 - scaled map Local x, y Local temp_image = LoadImage(img$) Local temp_map = LoadImage(map$) If temp_image And temp_map Select flag Case 2 ScaleImage temp_image, ImageWidth(temp_map), ImageHeight(temp_map) Case 2 ScaleImage temp_map, ImageWidth(temp_image), ImageHeight(temp_image) End Select wf = WriteFile(file$) If wf WriteInt wf, ImageWidth(temp_image) ; Width WriteInt wf, ImageHeight(temp_image) ; Height LockBuffer ImageBuffer(temp_image) LockBuffer ImageBuffer(temp_map) For y = 0 To ImageHeight(temp_image) - 1 For x = 0 To ImageWidth(temp_image) - 1 argb = ReadPixel(x, y, ImageBuffer(temp_image)) red = (argb Shr 16) And $FF green = (argb Shr 8) And $FF blue = argb And $FF argb = ReadPixel(x, y, ImageBuffer(temp_map)) red2 = (argb Shr 16) And $FF green2 = (argb Shr 8) And $FF blue2 = argb And $FF WriteByte wf, red WriteByte wf, green WriteByte wf, blue WriteByte wf, (red2 + green2 + blue2) / 3 Next Next UnlockBuffer ImageBuffer(temp_map) UnlockBuffer ImageBuffer(temp_image) FreeImage temp_map FreeImage temp_image Else Notify "Unable to write the file!" EndIf Else Notify "Unable to open one of the image files!" EndIf End Function Function LoadTBMImage(file$) Local rf = ReadFile(file$) Local Width, Height, Bank, argb If rf Width = ReadInt(rf) Height = ReadInt(rf) Bank = CreateBank(8 + Width * Height * 4) PokeInt Bank, 0, Width PokeInt Bank, 4, Height i = 8 For i = 8 To 8 + (Width - 1) * Height * 4 PokeByte Bank, 8 + i, ReadByte(rf) Next CloseFile rf Return Bank Else Notify "Unable to read the file!" EndIf End Function Function DrawTBMImage(Handler%, x%, y%, strength#=1.0, frame=0, frames= 1) ; Draw the TBM image on the screen If Strength > 0 Local Width = PeekInt(Handler%, 0) Local Height = PeekInt(Handler%, 4) Local red, green, blue, r, g, b, modifier, xx, yy, argb Local FrameWidth = (Width / Frames) Local offset = (frame * FrameWidth) Local Size = BankSize(handler%) ReadPixelFast(-1, -1) LockBuffer GraphicsBuffer() For yy = 0 To Height - 1 For xx = 0 To FrameWidth - 1 If Size < 8 + ((yy * Width) + (xx + offset) + 2) * 4 + 3 Then Exit red = PeekByte(Handler%, 8 + ((yy * Width) + (xx + offset) + 2) * 4 + 0) green = PeekByte(Handler%, 8 + ((yy * Width) + (xx + offset) + 2) * 4 + 1) blue = PeekByte(Handler%, 8 + ((yy * Width) + (xx + offset) + 2) * 4 + 2) modifier = PeekByte(Handler%, 8 + ((yy * Width) + (xx + offset) + 2) * 4 + 3) If modifier > 0 If strength < 1.0 Or modifier < 255 argb = ReadPixelFast(x + xx, y + yy, GraphicsBuffer()) r = (argb Shr 16) And $FF g = (argb Shr 8) And $FF b = argb And $FF red = r + (red - r) * (Float modifier / 255) * strength# green = g + (green - g) * (Float modifier / 255) * strength# blue = b + (blue - b) * (Float modifier / 255) * strength# EndIf WritePixel x + xx, y + yy, (blue Or (green Shl 8) Or (red Shl 16) Or ($FF000000)), GraphicsBuffer() EndIf Next Next UnlockBuffer GraphicsBuffer() EndIf End Function Function TBMImageWidth%(Handler%) ; Width of the TBM image Return PeekInt(Handler%, 0) End Function Function TBMImageHeight%(Handler%) ; Height of the TBM image Return PeekInt(Handler%, 4) End Function |