Colour bars/Display: Difference between revisions
No edit summary |
|||
Line 572:
tput sgr0 # reset</lang>
=={{header|XPL0}}==
<lang XPL0>include c:\cxpl\codes; \intrinsic code declarations
int W, X0, X1, Y, C;
[SetVid($13); \320x200x8 graphics
W:= 320/8; \width of color bar (pixels)
for C:= 0 to 8-1 do
[X0:= W*C; X1:= X0+W-1;
for Y:= 0 to 200-1 do
[Move(X0, Y); Line(X1, Y, C)];
];
C:= ChIn(1); \wait for keystroke
SetVid(3); \restore normal text mode
]</lang>
== {{header|ZX Spectrum Basic}} ==
|
Revision as of 19:59, 21 April 2012
You are encouraged to solve this task according to the task description, using any language you may know.
The task is to display a series of vertical color bars across the width of the display. The color bars should either use the system palette, or the sequence of colors: Black, Red, Green, Blue, Magenta, Cyan, Yellow, White.
AutoHotkey
(available at http://www.autohotkey.net/~tic/Gdip.ahk)
<lang AutoHotkey>#SingleInstance, Force
- NoEnv
SetBatchLines, -1
- Uncomment if Gdip.ahk is not in your standard library
- Include, Gdip.ahk
- Start gdi+
If !pToken := Gdip_Startup() {
message = ( LTrim gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system. ) MsgBox, 48, %message% ExitApp
} OnExit, Exit
- Set the width and height we want as our drawing area, to draw everything in.
- This will be the dimensions of our bitmap
Width := A_ScreenWidth, Height := A_ScreenHeight
- Create a layered window
- (+E0x80000
- must be used for UpdateLayeredWindow to work!)
- that is always on top (+AlwaysOnTop), has no taskbar entry or caption
Gui, 1: -Caption +E0x80000 +LastFound +OwnDialogs +Owner +AlwaysOnTop
- Show the window
Gui, 1: Show, NA
- Get a handle to this window we have created in order to update it later
hwnd1 := WinExist()
- Create a gdi bitmap with width and height of what we are going to
- draw into it. This is the entire drawing area for everything
hbm := CreateDIBSection(Width, Height)
- Get a device context compatible with the screen
hdc := CreateCompatibleDC()
- Select the bitmap into the device context
obm := SelectObject(hdc, hbm)
- Get a pointer to the graphics of the bitmap, for use with drawing functions
G := Gdip_GraphicsFromHDC(hdc)
- ARGB = Transparency, Red, Green, Blue
Colors := "0xFF000000,0xFFFF0000,0xFF00FF00,0xFF0000FF" Colors .= ",0xFFFF00FF,0xFF00FFFF,0xFFFFFF00,0xFFFFFFFF"
- This list ^ is Black, Red, Green, Blue, Magenta, Cyan, Yellow, White
StringSplit Colors, Colors, `, w := Width // Colors0 Loop % Colors0 {
; Create a brush to draw a rectangle pBrush := Gdip_BrushCreateSolid(Colors%A_Index%) ; Fill the graphics of the bitmap with a rectangle using the brush created Gdip_FillRectangle(G, pBrush, w*(A_Index-1), 0, w, height) ; Delete the brush as it is no longer needed and wastes memory Gdip_DeleteBrush(pBrush)
}
- Update the specified window we have created (hwnd1) with a handle to our
- bitmap (hdc), specifying the x,y,w,h we want it positioned on our screen
- So this will position our gui at (0,0) with the Width and
- Height specified earlier
UpdateLayeredWindow(hwnd1, hdc, 0, 0, Width, Height)
- Select the object back into the hdc
SelectObject(hdc, obm)
- Now the bitmap may be deleted
DeleteObject(hbm)
- Also the device context related to the bitmap may be deleted
DeleteDC(hdc)
- The graphics may now be deleted
Gdip_DeleteGraphics(G) Return
GuiEscape: Exit:
- gdi+ may now be shutdown on exiting the program
Gdip_Shutdown(pToken) ExitApp Return</lang>
BBC BASIC
<lang bbcbasic> SW_MAXIMIZE = 3
SYS "ShowWindow", @hwnd%, SW_MAXIMIZE VDU 26 W% = @vdu%!208 / 4 H% = @vdu%!212 * 2 COLOUR 1,9 COLOUR 2,10 COLOUR 3,12 COLOUR 4,13 COLOUR 5,14 COLOUR 6,11 COLOUR 7,15 FOR C% = 0 TO 7 GCOL C% RECTANGLE FILL C%*W%, 0, W%, H% NEXT
</lang>
C++
using Qt 4.6
file colorbars.h
<lang cpp>#ifndef MYWIDGET_H
- define MYWIDGET_H
- include <QWidget>
class QPaintEvent ;
class MyWidget : public QWidget { public :
MyWidget( ) ;
protected :
void paintEvent( QPaintEvent * ) ;
private :
int width ; int height ; const int colornumber ;
} ;
- endif</lang>
file colorbars.cpp
<lang cpp>#include <QtGui>
- include "colorbars.h"
MyWidget::MyWidget( ) :
width( 640 ) , height( 240 ) , colornumber( 8 ) { setGeometry( 0, 0 , width , height ) ;
}
void MyWidget::paintEvent ( QPaintEvent * ) {
int rgbtriplets[ ] = { 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 , 0 , 0 , 0 , 255 , 255 , 0 , 255 , 0 , 255 , 255 , 255 , 255 , 0 , 255 , 255 , 255 } ; QPainter myPaint( this ) ; int rectwidth = width / colornumber ; //width of one rectangle int xstart = 1 ; //x coordinate of the first rectangle int offset = -1 ; //to allow for ++offset to define the red value even in the first run of the loop below for ( int i = 0 ; i < colornumber ; i++ ) { QColor rectColor ; rectColor.setRed( rgbtriplets[ ++offset ] ) ; rectColor.setGreen( rgbtriplets[ ++offset ] ) ; rectColor.setBlue( rgbtriplets[ ++offset ] ) ; myPaint.fillRect( xstart , 0 , rectwidth , height - 1 , rectColor ) ; xstart += rectwidth + 1 ; }
}</lang>
file main.cpp
<lang cpp>#include <QApplication>
- include "colorbars.h"
int main( int argc, char * argv[ ] ) {
QApplication app( argc , argv ) ; MyWidget window ; window.setWindowTitle( QApplication::translate( "colorslides" , "color slides demonstration" ) ) ; window.show( ) ; return app.exec( ) ;
}</lang>
Icon and Unicon
The procedure below is generalized to take a description of a test card and display it.
<lang Icon>link graphics,printf
procedure main() # generalized colour bars
DrawTestCard(Simple_TestCard()) WDone()
end
procedure DrawTestCard(TC)
size := sprintf("size=%d,%d",TC.width,TC.height) &window := TC.window := open(TC.id,"g","bg=black",size) | stop("Unable to open window")
every R := TC.bands[r := 1 to *TC.bands -1] do every C := R.bars[c := 1 to *R.bars - 1] do {
Fg(R.bars[c].colour) FillRectangle( C.left, R.top, R.bars[c+1].left-C.left, TC.bands[r+1].top-R.top ) }
return TC
end
record testcard(window,id,width,height,bands) record band(top,bars) record bar(left,colour)
procedure Simple_TestCard() #: return structure simple testcard
return testcard(,"Simple Test Card",width := 800,height := 600,
[ band( 1, [ bar( 1, "black"), bar(114, "red"), bar(228, "green"), bar(342, "blue"),
bar(456, "magenta"), bar(570, "cyan"), bar(684, "yellow"), bar(width) ] ),
band(height) ]) end</lang>
The following example is a wee tiny bit more interesting.
<lang Icon>procedure SMPTE_TestCard() #: return structure with 480i(ish) testcard
return testcard(,"SMPTE TV Test Card",width := 672,height := 504,
[ band( 1, [ bar( 1, "#c0c0c0"), bar( 95, "#c0c000"),
bar(191, "#00c0c0"),
bar(288, "#00c000"), bar(383, "#c000c0"), bar(480, "#c00000"), bar(575, "#0000c0"), bar(width) ] ), band(335, [ bar( 1, "#0000c0"), bar( 95, "#131313"), bar(191, "#c000c0"), bar(288, "#131313"), bar(383, "#00c0c0"), bar(480, "#131313"), bar(575, "#c0c0c0"), bar(width) ] ), band(378, [ bar( 1, "#00214c"), bar(120, "#ffffff"), bar(240, "#32006a"), bar(360, "#131313"), bar(480, "#090909"), bar(512, "#131313"), bar(544, "#1d1d1d"), bar(576, "#131313"), bar(width) ] ), band(height) ]) end</lang>
graphics.icn provides graphics printf.icn provides sprintf
J
<lang j> load 'viewmat'
size=: 2{.".wd'qm' NB. J6 size=: getscreenwh_jgtk_ NB. J7 'rgb'viewmat (|.size){. (>.&.(%&160)|.size)$ 20# 256#.255*#:i.8</lang>
Note: You need to pick an implementation of size
based on the version of J you are using.
Java
<lang java> import java.awt.Color; import java.awt.Graphics;
import javax.swing.JFrame;
public class ColorFrame extends JFrame { public ColorFrame(int width, int height) { this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setSize(width, height); this.setVisible(true); }
@Override public void paint(Graphics g) { Color[] colors = { Color.black, Color.red, Color.green, Color.blue, Color.pink, Color.CYAN, Color.yellow, Color.white };
for (int i = 0; i < colors.length; i++) { g.setColor(colors[i]); g.fillRect(this.getWidth() / colors.length * i, 0, this.getWidth() / colors.length, this.getHeight()); } }
public static void main(String args[]) { new ColorFrame(200, 200); } } </lang>
Liberty BASIC
<lang lb>nomainwin colors$="black red green blue pink cyan yellow white" WindowWidth=DisplayWidth:WindowHeight=DisplayHeight UpperLeftX=1:UpperLeftY=1 barWidth=DisplayWidth/8 graphicbox #main.g, 0,0,DisplayWidth,DisplayHeight open "" for window_popup as #main
- main "trapclose [quit]"
- main.g "down; setfocus; when characterInput [quit]"
- main.g "when leftButtonUp [quit]"
- main.g "size ";barWidth
for x = barWidth/2 to DisplayWidth step barWidth
i=i+1 if i>8 then i=1 col$=word$(colors$,i) #main.g "color ";col$;"; line ";x;" 0 ";x;" ";DisplayHeight
next wait [quit] close #main:end
</lang>
Locomotive Basic
Show the default MODE 0 palette (includes two blinking colors at the end):
<lang locobasic>10 MODE 0:BORDER 23 20 FOR x=0 TO 15 30 ORIGIN x*40,0 40 GRAPHICS PEN x 50 FOR z=0 TO 39 STEP 4:MOVE z,0:DRAW z,400:NEXT 60 NEXT 70 CALL &bb06 ' wait for key press</lang>
OCaml
<lang ocaml>open Graphics
let round x =
int_of_float (floor (x +. 0.5))
let () =
open_graph ""; let cols = size_x () in let rows = size_y () in let colors = [| black; red; green; blue; magenta; cyan; yellow; white |] in let n = Array.length colors in let bar_width = (float cols) /. (float n) in Array.iteri (fun i color -> let x1 = bar_width *. (float i) in let x2 = bar_width *. (float (succ i)) in set_color color; fill_rect (round x1) 0 (round x2) rows; ) colors; ignore (read_key ());
- </lang>
execute with:
$ ocaml graphics.cma display_colour_bars.ml
Perl
<lang Perl>#!/usr/bin/perl -w use strict ; use GD ;
my %colors = ( white => [ 255 , 255 , 255 ] , red => [255 , 0 , 0 ] ,
green => [ 0 , 255 , 0 ] , blue => [ 0 , 0 , 255 ] , magenta => [ 255 , 0 , 255 ] , yellow => [ 255 , 255 , 0 ] , cyan => [ 0 , 255 , 255 ] , black => [ 0 , 0 , 0 ] ) ;
my $barwidth = 160 / 8 ; my $image = new GD::Image( 160 , 100 ) ; my $start = 0 ; foreach my $rgb ( values %colors ) {
my $paintcolor = $image->colorAllocate( @$rgb ) ; $image->filledRectangle( $start * $barwidth , 0 , $start * $barwidth +
$barwidth - 1 , 99 , $paintcolor ) ;
$start++ ;
} open ( DISPLAY , ">" , "testprogram.png" ) || die ; binmode DISPLAY ; print DISPLAY $image->png ; close DISPLAY ;#to be watched with <image viewer> testprogram.png </lang>
PicoLisp
<lang PicoLisp>(call 'clear)
(let Width (in '(tput cols) (read))
(do (in '(tput lines) (read)) (for B (range 0 7) (call 'tput 'setab B) (space (/ Width 8)) ) (prinl) ) )
(call 'tput 'sgr0) # reset</lang>
PHP
Will output result directly to the browser. Use it as CGI/BIN script. <lang PHP><?php $colors = array(array(255, 255, 255), // white
array(255, 0, 0), // red array( 0, 255, 0), // green array( 0, 0, 255), // blue array(255, 0, 255), // magenta array(255, 255, 0), // yellow array( 0, 255, 255), // cyan array( 0, 0, 0)); // black
define('BARWIDTH', 640 / count($colors)); define('HEIGHT', 480);
$image = imagecreate(BARWIDTH * count($colors), HEIGHT);
foreach ($colors as $position => $color) {
$color = imagecolorallocate($image, $color[0], $color[1], $color[2]); imagefilledrectangle($image, $position * BARWIDTH, 0, $position * BARWIDTH + BARWIDTH - 1, HEIGHT - 1, $color);
}
header('Content-type:image/png'); imagepng($image); imagedestroy($image);</lang>
PureBasic
Press Enter or Escape to exit the program. <lang PureBasic>Dim color(7) color(0) = RGB($00, $00, $00) ;black color(1) = RGB($FF, $00, $00) ;red color(2) = RGB($00, $FF, $00) ;green color(3) = RGB($00, $00, $FF) ;blue color(4) = RGB($FF, $00, $FF) ;magenta color(5) = RGB($00, $FF, $FF) ;cyan color(6) = RGB($FF, $FF, $00) ;yellow color(7) = RGB($FF, $FF, $FF) ;white
If Not InitKeyboard(): End: EndIf ;can't init keyboard If Not InitSprite(): End: EndIf ;can't init sprite/screen library If Not ExamineDesktops(): End: EndIf ;can't retrieve information about desktop
height = DesktopHeight(0) width = DesktopWidth(0) depth = DesktopDepth(0) If OpenScreen(width, height, depth, "Press ENTER to exit")
StartDrawing(ScreenOutput()) For c = 0 To 7 Box((width * c) / 8, 0, width / 8, height, color(c)) Next StopDrawing() FlipBuffers()
Repeat Delay(10) ExamineKeyboard() Until KeyboardPushed(#PB_Key_Escape) Or KeyboardPushed(#PB_Key_Return) CloseScreen()
EndIf</lang>
Alternate method using console
<lang PureBasic>DataSection
;Black, Red, Green, Blue, Magenta, Cyan, Yellow, White Data.i 0, 12, 10, 9, 13, 11, 14, 15
EndDataSection
Dim colors(7) For c = 0 To 7
Read.i colors(c)
Next
If OpenConsole()
;The console display is 80 columns wide by 25 rows For r = 0 To 24 For c = 0 To 7 ConsoleColor(colors(c), colors(c)) Print(Space(80 / 8)) Next Next EnableGraphicalConsole(1) ConsoleLocate(0, 0) ConsoleTitle("Press ENTER to exit"): Input() CloseConsole()
EndIf</lang>
Run BASIC
<lang runbasic>dim color$(8) color$(1) = "black" color$(2) = "red" color$(3) = "green" color$(4) = "blue" color$(5) = "magenta" color$(6) = "cyan" color$(7) = "yellow" color$(8) = "white"
html "
" for i = 1 to 8 html "<td width=20 bgcolor='";color$(i);"'" next i html ""</lang>
Output
Scala
<lang scala>import java.awt.Color import scala.swing._
class ColorBars extends Component {
override def paintComponent(g:Graphics2D)={ val colors=List(Color.BLACK, Color.RED, Color.GREEN, Color.BLUE, Color.MAGENTA, Color.CYAN, Color.YELLOW, Color.WHITE) val colCount=colors.size val deltaX=size.width.toDouble/colCount for(x <- 0 until colCount){ val startX=(deltaX*x).toInt val endX=(deltaX*(x+1)).toInt g.setColor(colors(x)) g.fillRect(startX, 0, endX-startX, size.height) } }
}</lang> Open window:
<lang scala>new MainFrame(){
title="Color bars" visible=true preferredSize=new Dimension(640, 320) contents=new ColorBars()
}</lang>
Tcl
<lang tcl>package require Tcl 8.5 package require Tk 8.5
wm attributes . -fullscreen 1 pack [canvas .c -highlightthick 0] -fill both -expand 1 set colors {black red green blue magenta cyan yellow white}
for {set x 0} {$x < [winfo screenwidth .c]} {incr x 8} {
.c create rectangle $x 0 [expr {$x+7}] [winfo screenheight .c] \ -fill [lindex $colors 0] -outline {} set colors [list {*}[lrange $colors 1 end] [lindex $colors 0]]
}</lang>
UNIX Shell
<lang sh>#!/bin/sh clear WIDTH=`tput cols` HEIGHT=`tput lines` NUMBARS=8 BARWIDTH=`expr $WIDTH / $NUMBARS`
l="1" # Set the line counter to 1 while [ "$l" -lt $HEIGHT ]; do
b="0" # Bar counter while [ "$b" -lt $NUMBARS ]; do tput setab $b s="0" while [ "$s" -lt $BARWIDTH ]; do echo -n " " s=`expr $s + 1` done b=`expr $b + 1` done echo # newline l=`expr $l + 1`
done
tput sgr0 # reset</lang>
XPL0
<lang XPL0>include c:\cxpl\codes; \intrinsic code declarations int W, X0, X1, Y, C; [SetVid($13); \320x200x8 graphics W:= 320/8; \width of color bar (pixels) for C:= 0 to 8-1 do
[X0:= W*C; X1:= X0+W-1; for Y:= 0 to 200-1 do [Move(X0, Y); Line(X1, Y, C)]; ];
C:= ChIn(1); \wait for keystroke SetVid(3); \restore normal text mode ]</lang>
ZX Spectrum Basic
<lang zxbasic>10 REM The ZX Spectrum display is 32 columns wide, so we have 8 columns of 4 spaces 20 FOR r=0 TO 20: REM There are 21 rows 30 FOR c=0 TO 7: REM We use the native colour sequence here 40 PAPER c: REM set the background colour for the spaces to be printed 50 PRINT " ";: REM four spaces, the semicolon prevents newline 60 NEXT c 70 REM at this point the cursor has wrapped, so we don't need a newline 80 NEXT r</lang>