Code archives/BlitzPlus Gui/drawpixmaptext
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
This command allows you to write text to a pixmap without requiring a DX or OGL graphics context open. | |||||
Function drawpixmaptext(text$,pix:TPixmap,x,y,font:TImageFont,red=255,green=255,blue=255) Local newx Local theight theight = font.Height() Print theight For i = 0 To text.length-1 tempText$ = Mid(text, i+1, 1) asciiVal = Asc(tempText) n=font.CharToGlyph( asciiVal ) If n<0 Continue glyph:TImageGlyph = font.LoadGlyph(n) image:TImage=glyph._image Print "Draw "+Chr(asciiVal) If image <> Null tempix:TPixmap = LockImage(image) UnlockImage(glyph._image) If tempix For yy = 0 To tempix.height-1 For xx = 0 To tempix.width-1 If newx+x+xx < pix.width And y+yy < pix.height Then alpha# = RGBA_alpha(ReadPixel(tempix,xx,yy)) alphan# = Float(alpha#/255.0) anti# = 1.0-alphan# ured = RGBA_Red(ReadPixel(tempix,xx,yy)) ugrn = RGBA_Green(ReadPixel(tempix,xx,yy)) ublu = RGBA_Blue(ReadPixel(tempix,xx,yy)) newred = ((RGBA_Red(ReadPixel(pix,newx+x+xx,y+yy))*anti#)+(ured*alphan#)) newgrn = ((RGBA_Green(ReadPixel(pix,newx+x+xx,y+yy))*anti#)+(ugrn*alphan#)) newblu = ((RGBA_Blue(ReadPixel(pix,newx+x+xx,y+yy))*anti#)+(ublu*alphan#)) If newred > 255 Then newred = 255 If newgrn > 255 Then newgrn = 255 If newblu > 255 Then newblu = 255 WritePixel(pix,newx+x+xx,(theight-tempix.height)+y+yy,ToRGBA(newred,newgrn,newblu,255)) EndIf Next Next EndIf EndIf newx = newx + tempix.width Next End Function Function RGBA_Red%(rgba%) Return (rgba Shr 16) & $FF End Function Function RGBA_Green%(rgba%) Return (rgba Shr 8) & $FF End Function Function RGBA_Blue%(rgba%) Return rgba & $FF End Function Function RGBA_alpha%(rgba%) Return (rgba% Shr 24) & $FF End Function Function ToRGBA%(r%,g%,b%,a%) 'return (a << 24) | (r << 16) | (g << 8) | (b); Return ((A Shl 24) | (R Shl 16) | (G Shl 8) | B) End Function |
Comments
| ||
really nice,thanks for share! |
| ||
Awesome! I wonder why I haven't seen this before... EDIT: Nevermind. Doesn't work too well. |
| ||
the color part doesn't work also the alpha code doesn't work! you can modify this a little to draw the alpha text |
| ||
try this:Function drawpixmaptext(Text:String, pix:TPixmap, x:Int, y:Int, font:TImageFont, RED:Int = 255, Green:Int = 255, Blue:Int = 255) Local newx:Int Local theight:Int IF font = Null then return theight = font.Height() For Local I:Int = 0 To Text.Length - 1 Local tempText:String = Mid(Text, I + 1, 1) Local asciiVal:Int = Asc(tempText) Local n:Int = font.CharToGlyph(asciiVal) If n<0 Continue Local glyph:TImageGlyph = font.LoadGlyph(n) Local image:TImage = glyph._image Local tempix:TPixmap If image <> Null tempix = LockImage(image) UnlockImage(glyph._image) If tempix Local tx:Float = glyph._x Local ty:Float = glyph._y For Local yy:Int = 0 To glyph._h - 1'Height - 1 For Local xx:Int = 0 To glyph._w - 1'tempix.width - 1 If newx + x + xx + tx < pix.width And y + yy + ty < pix.Height Then Local Alpha:Float = RGBA_alpha(ReadPixel(tempix, xx, yy)) Local alphan:Float = Float(Alpha:Float / 255.0) Local anti:Float = 1.0 - alphan:Float Local ured:Int = RED'RGBA_Red(ReadPixel(tempix, xx, yy)) Local ugrn:Int = Green'RGBA_Green(ReadPixel(tempix, xx, yy)) Local ublu:Int = Blue'RGBA_Blue(ReadPixel(tempix, xx, yy)) Local newred:Int = ((RGBA_Red(ReadPixel(pix, newx + x + xx + tx, ty + y + yy)) * anti) + (ured * alphan:Float)) Local newgrn:Int = ((RGBA_Green(ReadPixel(pix, newx + x + xx + tx, ty + y + yy)) * anti) + (ugrn * alphan:Float)) Local newblu:Int = ((RGBA_Blue(ReadPixel(pix, newx + x + xx + tx, ty + y + yy)) * anti) + (ublu * alphan:Float)) Local newAlpha:Int = ((RGBA_alpha(ReadPixel(pix, newx + x + xx + tx, ty + y + yy)) * anti) + (Alpha * alphan:Float)) If newred > 255 Then newred = 255 If newgrn > 255 Then newgrn = 255 If newblu > 255 Then newblu = 255 If newAlpha > 255 Then newAlpha = 255 WritePixel(pix, newx + x + xx + tx, y + yy + ty, ToRGBA(newred, newgrn, newblu, newAlpha)) EndIf Next Next EndIf EndIf newx = newx + glyph.Advance() Next End Function Function RGBA_Red:Int(rgba:Int) Return (rgba Shr 16) & $FF End Function Function RGBA_Green:Int(rgba:Int) Return (rgba Shr 8) & $FF End Function Function RGBA_Blue:Int(rgba:Int) Return rgba & $FF End Function Function RGBA_alpha:Int(rgba:Int) Return (rgba:Int Shr 24) & $FF End Function Function ToRGBA:Int(r:Int, g:Int, b:Int, a:Int) 'return (a << 24) | (r << 16) | (g << 8) | (b); Return ((A Shl 24) | (R Shl 16) | (G Shl 8) | B) End Function Function TextWidthFont:Int(Text:String, Font:TImageFont) Local width:Int = 0 For Local n:Int = 0 Until Text.Length Local I:Int = font.CharToGlyph(Text[n]) If I < 0 Continue width:+font.LoadGlyph(I).Advance() Next Return width End Function Its fixed version of the above: -Alpha support -Color Support -Correct Spacing for chars (using glyph details) -Extra Function to retrieve the TextWidth without the need to have a graphiccontext |
| ||
got an error :pixmap coordinates out of bounds! i used a unicode truetype font for testing. also i used a "simple" version to show the original text: Function drawpixmaptext1(text$,pix:TPixmap,x,y,font:TImageFont) Local newx Local theight theight = font.Height() 'Print theight For i = 0 To text.length-1 tempText$ = Mid(text, i+1, 1) asciiVal = Asc(tempText) n=font.CharToGlyph( asciiVal ) If n<0 Continue glyph:TImageGlyph = font.LoadGlyph(n) image:TImage=glyph._image 'Print "Draw "+Chr(asciiVal) If image <> Null tempix:TPixmap = LockImage(image) UnlockImage(glyph._image) If tempix For yy = 0 To tempix.height-1 For xx = 0 To tempix.width-1 If newx+x+xx < pix.width And y+yy < pix.height Local rgba:Int=ReadPixel(tempix,xx,yy) WritePixel(pix,newx+x+xx,(theight-tempix.height)+y+yy,rgba) EndIf Next Next EndIf EndIf newx = newx + tempix.width Next End Function |
| ||
oh yeah, i missed the glyph height and width in the checking for pixmap bounds. Otherwise it should work. I have tested it with various ttfs and also had written the whole maxide src to one pixmap. (time < 5sec) |
| ||
kelpto2, can you modify your code above? |
| ||
I think he did. Some test code. 'Rem Strict Graphics 640,480,0 Local pixmap:TPixmap = CreatePixmap(128, 128, PF_RGBA8888) Local font:TImageFont = TImageFont.CreateDefault() DrawPixmapText("R", pixmap, 10, 10, font, 255, 0, 0) DrawPixmapText(" A", pixmap, 10, 10, font, 255, 127, 0) DrawPixmapText(" I", pixmap, 10, 10, font, 255, 255, 0) DrawPixmapText(" N", pixmap, 10, 10, font, 0, 255, 0) DrawPixmapText(" B", pixmap, 10, 10, font, 0, 255, 255) DrawPixmapText(" O", pixmap, 10, 10, font, 255, 0, 255) DrawPixmapText(" W", pixmap, 10, 10, font, 127, 0, 255) DrawPixmapText(" :)", pixmap, 10, 10, font, 255, 255, 255) While Not (KeyDown(KEY_ESCAPE) Or AppTerminate()) Cls DrawPixmap(pixmap,0,0) Flip Wend 'EndRem |
| ||
works fine now,thanks |
Code Archives Forum