WritePixel

BlitzMax Forums/BlitzMax Programming/WritePixel

DavidDC(Posted 2009) [#1]
I'm looking at the WritePixel source and wondering if Case PF_RGBA8888 shouldn't be raised to the top of the Select list? Isn't that the format most pixmaps use?

	Method WritePixel( x,y,argb )
		Assert x>=0 And x<width And y>=0 And y<height Else "Pixmap coordinates out of bounds"
		Local p:Byte Ptr=PixelPtr(x,y)
		Select format
		Case PF_A8
			p[0]=argb Shr 24
		Case PF_I8
			p[0]=( (argb Shr 16 & $ff)+(argb Shr 8 & $ff)+(argb & $ff) )/3
		Case PF_RGB888
			p[0]=argb Shr 16 ; p[1]=argb Shr 8 ; p[2]=argb
		Case PF_BGR888
			p[0]=argb ; p[1]=argb Shr 8 ; p[2]=argb Shr 16
		Case PF_RGBA8888
			p[0]=argb Shr 16 ; p[1]=argb Shr 8 ; p[2]=argb ; p[3]=argb Shr 24
		Case PF_BGRA8888
			p[0]=argb ; p[1]=argb Shr 8 ; p[2]=argb Shr 16 ; p[3]=argb Shr 24
		End Select
	End Method



xlsior(Posted 2009) [#2]
Good point?


plash(Posted 2009) [#3]
Case PF_RGBA8888 shouldn't be raised to the top of the Select list?
Don't you mean, it should be at the top of the Select statement?


grable(Posted 2009) [#4]
Or mark could just make the compiler do jump tables in stead ;) hehe


ImaginaryHuman(Posted 2009) [#5]
It kinda depends. I prefer RGBA myself but some macs and pc's default to like ARGB or ABGR formats. I don't really like that pixmap operations default to other formats. I think it should be standardized to RGBA. Note that graphics cards all use internal formats which may be different for images than for pixmaps.


ImaginaryHuman(Posted 2009) [#6]
You'd actually be better off doing something like:

local a:TPixmap=LoadPixmap("Pic.png")
a=ConvertPixmap(a,PF_RGBA8888)
local b:Byte Ptr=PixmapPixelPtr(a,0,0)
local c:Int=PixmapPitch(a)

'then e.g.

a[50+(50*c)]=$FF              'write one color component at the 50th component on line 50

Ie use pointers to write the bytes/integers in your preferred format - although this would potentially break if the pixmap system is changed somehow.