BB bugged or just the command ?

Blitz3D Forums/Blitz3D Beginners Area/BB bugged or just the command ?

Maverick357(Posted 2004) [#1]
; Color, ColorRed(), ColorBlue(), ColorGreen() Example

; Gotta be in graphics mode
Graphics 640,480, 8
Cls

; Let's set the color to something random
SeedRnd MilliSecs() ; Seed the randomizer with the current system time in milliseconds.

Red = Rnd(0,63)
Green = Rnd(0,63)
Blue = Rnd(0,63)
Color Red,Green,Blue

; Now let's see what they are!
Text 10,10,"This Text is printed in Red=" + ColorRed() + " Green=" + ColorGreen() + " Blue=" + ColorBlue() + "!"
WaitKey


Color 255,255,255
Print : Print : Print
Print Red
Print Green
Print Blue
WaitKey

The purpose of this program whas to see how to use 8 bits, 256 colors mode.
I need it for my tile/sprite ripper/editor.

When i use Graphics 640,480 , i get 16 bits colors and colorred(), colorgreen(), colorblue() return the good value.

When i use Graphics 640,480,8 , i get 16 bits colors and colorred(), colorgreen(), colorblue() return bads values (all at 255). And the colors palette is not good (allways white (36,28,50 for example this is not a white color palette)

What is wrong with BB palette colors ?


skidracer(Posted 2004) [#2]
BB does not support use of palettes, a depth of 8 with the Graphics command should throw a runtime error.


Maverick357(Posted 2004) [#3]
Ok Thank you Skidracer.

Can i create a internal 256 colors in datas for example or do i must translate every 256 colors palette (from the bmp file) to a 16 bits colors values ?

How can i test a grabimage with another ? Is the a command to test if a grabimage is the EXACT copy of another in memory ? With the handle of createimage or with a special command ? Do i must create my own function ?


skidracer(Posted 2004) [#4]
Blitz translates the pixels from 8 to 16 bit at load time so you do not have to worry about palettes at all.

You will need to code your own compare image command which would look something like:

Function IdenticalImages(i1,i2)

	w=ImageWidth(i1)
	h=ImageHeight(i1)
	
	If w<>ImageWidth(i2) Return False
	If h<>ImageHeight(i2) Return False

	b1=ImageBuffer(i1)
	b2=ImageBuffer(i2)
	
	For y=0 To h-1
		For x=0 To w-1
			If ReadPixel(x,y,b1)<>ReadPixel(x,y,b2) Return False
		Next
	Next

	Return True

End Function



Maverick357(Posted 2004) [#5]
Thanks a lot SkidRacer :-)


AbbaRue(Posted 2004) [#6]
What I was reading about 8 bit colour, if you are planing on using it to speed up your program, most video cards don't show any speed increase with 8 bit colour over 16.
And many actually show a decrease, in speed.
The only real reason it is supported still is for backwards compatability, with older software.


Maverick357(Posted 2004) [#7]
I just need 8 bits colors because my editor will create tiles and sprites for a futur RPG game like "harvest moon" or snes/gba style.
I must know where are the color used for each pixel of a tile, and because my ripper must know wich color is already used for mixing 2 tileset between us.
With 16M o colors, how can i know witch color is used for tile xx and tile xy and reducing the palette (16M colors but colors sorted in the top of the color array data).
I need to know that i a want to create a special data format library (multiTileSet in one file with 2000 different tiles in each tileSet)
With this format of tileset (2000), maplevels can be very diversified with a lot of different architectural houses, for example and seasons.


AbbaRue(Posted 2004) [#8]
OK! I understand! And that's 64K colours not 16M for 16 bit.


Maverick357(Posted 2004) [#9]
Thank for the info AbbaRue.
Now i understand better the 16 bits colors mode.
Never used before because Dos/vga whas an big graphics memory problem in others mode than ModeX.


ford escort(Posted 2004) [#10]
the following code check all the tiles in one picture and make a new tileset with the uniques tiles only

hope you like

Graphics 800,600,32,02
Global mytileset=CreateImage(640,480,1,2); or loadimage the tileset
;------------------------------------------
; this part create a 'tileset' remove it if you load one
SetBuffer ImageBuffer(mytileset)
For blah=1 To 150
	Color 255,2552,55
	Text Rand(640),Rand(480),"O"
Next
;-------------------------------------------
SetBuffer FrontBuffer()
comp$=comparetileset(mytileset,32,32)
maxtile_x=ImageWidth(mytileset)/32
maxtile_y=ImageHeight(mytileset)/32
maxtiles=maxtile_x*maxtile_y-1
Text 0,10,"found "+Len(comp$)/4+"of"+maxtiles+" tiles matching ("+(maxtiles-Len(comp$)/4)+")unique tiles)
Text 0,20,"press a key to compute new tileset"
Flip
WaitKey
newtileset=compute(mytileset,32,32,comp$)
Flip
WaitKey
End
Function comparetileset$(image,width,height)
DrawBlock mytileset,0,0
Flip
maxtile_x=ImageWidth(image)/width
maxtile_y=ImageHeight(image)/height
maxtiles=maxtile_x*maxtile_y-1
For tile=0 To maxtiles
	find=False
	For a=1 To Len(comp$)/4
		If tile=unformat(comp$,a)
			find=True
		EndIf
	Next
	If find=False
	yt=Int(tile/maxtile_x)	
	xt=tile-(yt*maxtile_x)

	LockBuffer BackBuffer() ;ImageBuffer(image)
	For tile2=0 To maxtiles
		If tile2>=tile
		find=False
		For a=1 To Len(comp$)/4
			If tile2=unformat(comp$,a)
				find=True
			EndIf
		Next
		If find=False
		yt2=Int(tile2/maxtile_x)	
		xt2=tile2-(yt2*maxtile_x)
		xc=0
		yc=0
		If tile<>tile2
		Repeat			
			c1=ReadPixelFast(xt*width+xc,yt*height+yc,BackBuffer());,ImageBuffer(image))
			c2=ReadPixelFast(xt2*width+xc,yt2*height+yc,BackBuffer());,ImageBuffer(image))
			xc=xc+1
			If xc>width-1
				xc=0
				yc=yc+1
			EndIf
		Until c1<>c2 Or yc>height-1
		If yc>height-1
			comp$=comp$+format$(tile2)
		EndIf
		EndIf
		EndIf
		EndIf
	Next
	UnlockBuffer BackBuffer() ;ImageBuffer(image)
	EndIf

Next 
Return comp$
End Function
Function format$(value) 
	Return String$("0",4-Len(Str(value)))+Str(value)
End Function
Function unformat(strin$,pos)
	Return Mid(strin$,((pos-1)*4)+1,4)
End Function
Function compute(image,width,height,comp$)
	maxtile_x=ImageWidth(image)/width
	maxtile_y=ImageHeight(image)/height
	temp=CreateImage(ImageWidth(image),ImageHeight(image),1,2)
	maxtiles=(maxtile_x*maxtile_y)-1
	Newpos=0
	Color 255,255,255
	Rect 0,0,800,600,1
	For tile=0 To maxtiles
		matching=False
		For search=1 To Len(comp$)/4
			If tile=unformat(comp$,search)
				matching=True
			EndIf
		Next 
		If matching=False
			yt=Int(tile/maxtile_x)	
			xt=tile-(yt*maxtile_x)
			yt2=Int(Newpos/maxtile_x)	
			xt2=Newpos-(yt2*maxtile_x)
			CopyRect xt*width,yt*height,width,height,xt2*width,yt2*height,ImageBuffer(image),BackBuffer();ImageBuffer(temp)
			newpos=newpos+1
		EndIf
	Next
End Function



AbbaRue(Posted 2004) [#11]
16 bit colour is stored in order, from left to right and top to bottom.
Each 2 bytes represents one pixel. If you rip each 2 bytes into an array of (16 bit words) Those (16 bit words) are as good as an ID you can store in a table.
Also you could cut down the number of colours to 256 by using a lookup table of 256 colours, and rounding each colour down to it's nearest colour in your table.
Maybe this will help.


Maverick357(Posted 2004) [#12]
Thanks a lot Ford Escort for your code.
I cannot run it because i get an error "Too many parameters"
but i will examine the logic of it.

Thanks AbbaRue, i will follow your tips.
After all, i will in first time keep the 16 bits colors (because of the beautiful looking ;-) ) and see if that take not too much size for a 2000 tileset.


ford escort(Posted 2004) [#13]
if you run b3D or bb just ignore the last parameters in the create image commands

Global mytileset=CreateImage(640,480);
instead of
Global mytileset=CreateImage(640,480,1,2);


and
temp=CreateImage(ImageWidth(image),ImageHeight(image))
instead of
temp=CreateImage(ImageWidth(image),ImageHeight(image),1,2)

it's just additional parameters for blitzplus :)


Maverick357(Posted 2004) [#14]
Tanks a lot Ford Escort, now it work perfectli for BB3D :-)