Colour bars/Display
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.
Contents |
[edit] AutoHotkey
(available at http://www.autohotkey.net/~tic/Gdip.ahk)#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
[edit] BBC BASIC
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
[edit] C++
using Qt 4.6
file colorbars.h:
#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
file colorbars.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 ;
}
}
file main.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( ) ;
}
[edit] Icon and Unicon
The procedure below is generalized to take a description of a test card and display it.
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
The following example is a wee tiny bit more interesting.
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
graphics.icn provides graphics printf.icn provides sprintf
[edit] J
load 'viewmat'
size=: 2{.".wd'qm' NB. J6
size=: getscreenwh_jgtk_ '' NB. J7
'rgb'viewmat (|.size){. (>.&.(%&160)|.size)$ 20# 256#.255*#:i.8
Note: You need to pick an implementation of size based on the version of J you are using.
[edit] 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);
}
}
[edit] Liberty BASIC
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
[edit] Locomotive Basic
Show the default MODE 0 palette (includes two blinking colors at the end):
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
[edit] Mathematica
ArrayPlot[
ConstantArray[{Black, Red, Green, Blue, Magenta, Cyan, Yellow,
White}, 5]]
[edit] 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 ());
;;
execute with:
$ ocaml graphics.cma display_colour_bars.ml
[edit] 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
[edit] Perl 6
my $HOR = 1280;
my $VERT = 720;
my @colors = map -> $r, $g, $b { Buf.new: ($r, $g, $b) xx $HOR div 8 },
0, 0, 0,
255, 0, 0,
0,255, 0,
0, 0,255,
255, 0,255,
0,255,255,
255,255, 0,
255,255,255;
my $PPM = open "colorbars.ppm", :w, :bin or die "Can't create colorbars.ppm: $!";
$PPM.print: qq:to/EOH/;
P6
# colorbars.ppm
$HOR $VERT
255
EOH
for ^$VERT -> $v {
for ^@colors -> $h {
$PPM.write: @colors[$h];
}
}
$PPM.close;
[edit] 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
[edit] PHP
Will output result directly to the browser. Use it as CGI/BIN script.
<?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);
[edit] PureBasic
Press Enter or Escape to exit the program.
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
[edit] Alternate method using console
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
[edit] Python
#!/usr/bin/env python
#vertical coloured stripes in window in Python 2.7.1
from livewires import *
horiz=640; vert=480
begin_graphics(width=horiz,height=vert,title="v_stripes",background=Colour.black)
NameColors=["black","red","green","dark_blue","purple","blue","yellow","white"]
stepik=horiz/len(NameColors)
for index,each in enumerate(NameColors):
ExcStrng="set_colour(Colour."+each+")"
exec ExcStrng
box(index*stepik,0,(index+1)*stepik,vert,filled=1)
while keys_pressed() != ['x']: # press x key to terminate program
pass
end_graphics()
[edit] R
Create the color palette, set margins to zero so the image will fill the display, and use image to create the graphic:
pal <- c("black", "red", "green", "blue", "magenta", "cyan", "yellow", "white")
par(mar = rep(0, 4))
image(matrix(1:8), col = pal, axes = FALSE)
[edit] Racket
#lang racket/gui
(define-values [W H] (get-display-size #t))
(define colors
'("Black" "Red" "Green" "Blue" "Magenta" "Cyan" "Yellow" "White"))
(define (paint-pinstripe canvas dc)
(send dc set-pen "black" 0 'transparent)
(for ([x (in-range 0 W (/ W (length colors)))] [c colors])
(send* dc (set-brush c 'solid) (draw-rectangle x 0 W H))))
(define full-frame%
(class frame%
(define/override (on-subwindow-char r e)
(when (eq? 'escape (send e get-key-code))
(send this show #f)))
(super-new
[label "Color bars"] [width W] [height H]
[style '(no-caption no-resize-border hide-menu-bar no-system-menu)])
(define c (new canvas% [parent this] [paint-callback paint-pinstripe]))
(send this show #t)))
(void (new full-frame%))
[edit] Run BASIC
colors$ = "black,red,green,blue,magenta,cyan,yellow,white"
html "<TABLE BORDER=1 CELLPADDING=0 CELLSPACING=4><tr height=70>"
for i = 1 to 8
html "<td width=20 bgcolor='";word$(colors$,i,",");"'</td>"
next i
html "</tr></table>"
Output
[edit] 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)
}
}
}
Open window:
new MainFrame(){
title="Color bars"
visible=true
preferredSize=new Dimension(640, 320)
contents=new ColorBars()
}
[edit] 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]]
}
[edit] UNIX Shell
#!/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
[edit] 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
]
[edit] ZX Spectrum Basic
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

