Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #/////////////////////Caesar's Graphics Toolkit///////////////////////
- #~~~~~~~~~~~~~~~~by Caesar~~~~~~~~~~~~~~~~
- #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- # Das CGT enthält viele nßtzliche Methoden, die der
- # Verbesserung, der Vereinfachung und der Erweiterung
- # der Grafikverarbeitung dienen.
- #<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- class Bitmap
- #>>>>>>>>>>>>>>>>>>>
- # Mit dem DDA-Algorithmus (Digital Differential Analyzer)
- # werden zwei Punkte (x1, y1) und (x2, y2) miteineander
- # verbunden.
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_line(x1, y1, x2, y2, color, stroke=1)
- return if stroke <= 0
- if x2 < x1
- temp = x2
- x2 = x1
- x1 = temp
- temp = y2
- y2 = y1
- y1 = temp
- end
- length = x2-x1
- length = Math.abs(y2-y1) if length < Math.abs(y2-y1)
- x_increment =(x2-x1).to_f / length
- y_increment = (y2-y1).to_f / length
- x = x1
- y = y1
- s = stroke.to_f / 2
- if x == x2
- fill_rect(x-s, [y1, y2].min, s+s, Math.abs(y2-y1), color)
- end
- while x < x2
- fill_rect(x-s, y-s, s+s, s+s, color)
- x += x_increment
- y += y_increment
- end
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>
- # Mit dem Bresenham-Algorithmus wird ein Kreis um den Mittelpunkt
- # (cx, cy) gezeichnet.
- # -- radius: Radius
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_circle(cx, cy, radius, color, stroke=1)
- return if stroke <= 0
- x = 0
- y = radius
- d = radius-1
- while y >= x
- s = stroke.to_f / 2
- fill_rect(cx+x-s, cy+y-s, s+s, s+s, color) # footprints
- fill_rect(cx+x-s, cy-y-s, s+s, s+s, color)
- fill_rect(cx-x-s, cy+y-s, s+s, s+s, color)
- fill_rect(cx-x-s, cy-y-s, s+s, s+s, color)
- fill_rect(cx+y-s, cy+x-s, s+s, s+s, color)
- fill_rect(cx-y-s, cy+x-s, s+s, s+s, color)
- fill_rect(cx+y-s, cy-x-s, s+s, s+s, color)
- fill_rect(cx-y-s, cy-x-s, s+s, s+s, color)
- return if y == x
- if d < 0
- d += 2*x + 3
- else
- y -= 1
- d += 2*x - 2*y + 5
- end
- x += 1
- end
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>>
- # Zeichnet einen gefĂźllten Kreis um den Mittelpunkt (cxcy).
- # -- radius: Radius
- # -- color: Farbe
- #<<<<<<<<<<<<<<<<<<
- def fill_circle(cx, cy, radius, color)
- x = 0
- y = radius
- d = radius-1
- while y >= x
- fill_rect(cx-x, cy-y, 2*x, 1, color)
- fill_rect(cx-y, cy-x, 2*y, 1, color)
- fill_rect(cx-x, cy+y, 2*x, 1, color)
- fill_rect(cx-y, cy+x, 2*y, 1, color)
- return if y == x
- if d < 0
- d += 2*x + 3
- else
- y -= 1
- d += 2*x - 2*y + 5
- end
- x += 1
- end
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet eine Ellipse um den Mittelpunkt (cx, cy) mit den Radien
- # a und b.
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_ellipse(cx, cy, a, b, color, stroke=1)
- return if stroke <= 0
- x = 0
- y = b
- d1 = b*b-a*a*b-(a*a.to_f/4)
- ellipse_footprints(cx, cy, x, y, color, stroke)
- while( a*a*(y-0.5) > b*b*(x-1))
- if d1 < 0
- d1 += b*b*(2*x+3)
- else
- d1 += (b*b*(2*x+3)+a*a*(-2*y+2))
- y -= 1
- end
- x += 1
- ellipse_footprints(cx, cy, x, y, color, stroke)
- end
- d2 = b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b
- while(y > 0)
- if d2 < 0
- d2 += b*b*(2*x+2)+a*a*(-2*y+3)
- x += 1
- else
- d2 += a*a*(-2*y+3)
- end
- y -= 1
- ellipse_footprints(cx, cy, x, y, color, stroke)
- end
- end
- #----
- def ellipse_footprints(cx, cy, x, y, color, stroke=1)
- s = stroke.to_f / 2
- fill_rect(cx+x-s, cy+y-s, s+s, s+s, color)
- fill_rect(cx+x-s, cy-y-s, s+s, s+s, color)
- fill_rect(cx-x-s, cy+y-s, s+s, s+s, color)
- fill_rect(cx-x-s, cy-y-s, s+s, s+s, color)
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet eine gefĂźllte Ellipse um den Mittelpunkt (cx, cy) mit den
- # Radien a und b.
- # -- color: Farbe
- #<<<<<<<<<<<<<<<<<<<
- def fill_ellipse(cx, cy, a, b, color)
- x = 0
- y = b
- d1 = b*b-a*a*b-(a*a.to_f/4)
- fill_rect(cx-x, cy-y, 2*x, 1, color)
- fill_rect(cx-x, cy+y, 2*x, 1, color)
- while( a*a*(y-0.5) > b*b*(x-1))
- if d1 < 0
- d1 += b*b*(2*x+3)
- else
- d1 += (b*b*(2*x+3)+a*a*(-2*y+2))
- y -= 1
- end
- x += 1
- fill_rect(cx-x, cy-y, 2*x, 1, color)
- fill_rect(cx-x, cy+y, 2*x, 1, color)
- end
- d2 = b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b
- while(y > 0)
- if d2 < 0
- d2 += b*b*(2*x+2)+a*a*(-2*y+3)
- x += 1
- else
- d2 += a*a*(-2*y+3)
- end
- y -= 1
- fill_rect(cx-x, cy-y, 2*x, 1, color)
- fill_rect(cx-x, cy+y, 2*x, 1, color)
- end
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet den Kreis oder die Ellipse, die dem Rechteck
- # einbeschrieben ist.
- # -- x, y, width, height: Rechteck
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_oval(x, y, width, height, color, stroke=1)
- if width == height
- return draw_circle(x + width/2, y + height/2, width/2, color, stroke)
- end
- draw_ellipse(x + width/2, y + height/2, width/2, height/2, color, stroke)
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet den Kreis oder die Ellipse, die dem Rechteck
- # einbeschrieben ist, gefĂźllt.
- # -- x, y, width, height: Rechteck
- # -- color: Farbe
- #<<<<<<<<<<<<<<<<<<<
- def fill_oval(x, y, width, height, color)
- return fill_circle(x + width/2, y + height/2, width/2, color) if width == height
- fill_ellipse(x + width/2, y + height/2, width/2, height/2, color)
- end
- #--------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichent ein Rechteck.
- # -- x, y, width, height: Rechteck
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_rect(x, y, width, height, color, stroke=1)
- return if stroke <= 0
- #~~~~~rekursiv~~~~~
- #fill_rect(x, y, width, 1, color)
- #fill_rect(x, y, 1, height, color)
- #fill_rect(x+width-1, y, 1, height, color)
- #fill_rect(x, y+height-1, width, 1, color)
- #draw_rect(x+1, y+1, width-2, height-2, color, stroke-1)
- #~~~~nicht rekursiv~~~~
- fill_rect(x, y, width, stroke, color)
- fill_rect(x, y, stroke, height, color)
- fill_rect(x+width-stroke, y, stroke, height, color)
- fill_rect(x, y+height-stroke, width, stroke, color)
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein Rechteck mit einem speziellen "3D-Effekt".
- # -- x, y, width, height: Rechteck
- # -- color: Farbe
- # -- raised (true): gibt an, ob das Rechteck hĂśher (true) oder tiefer (false)
- # gezeichnet wird.
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_3d_rect(x, y, width, height, color, raised=true, stroke=1)
- return if stroke <= 0
- if raised
- color1 = color.brighter
- color2 = color.darker
- else
- color1 = color.darker
- color2 = color.brighter
- end
- fill_rect(x, y, width, 1, color1)
- fill_rect(x, y, 1, height, color1)
- fill_rect(x+width-1, y, 1, height, color2)
- fill_rect(x, y+height-1, width, 1, color2)
- draw_3d_rect(x+1, y+1, width-2, height-2, color, raised, stroke-1)
- end
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein dickes Rechteck mit einem FarbĂźbergang von auĂen
- # nach innen.
- # -- x, y, width, height: Rechteck
- # -- color: Farbe auĂen
- # -- stroke (3): Linienstärke
- # -- brighter (true): FarbĂźbergang nach innen heller (true) oder dunkler (false)
- #<<<<<<<<<<<<<<<<<<<
- def draw_frame_rect(x, y, width, height, color, stroke=3, brighter=true)
- return if stroke <= 0
- fill_rect(x, y, width, 1, color)
- fill_rect(x, y, 1, height, color)
- fill_rect(x+width-1, y, 1, height, color)
- fill_rect(x, y+height-1, width, 1, color)
- next_color = brighter ? color.brighter : color.darker
- draw_frame_rect(x+1, y+1, width-2, height-2, next_color, stroke-1, brighter)
- end
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein Rechteck mit abgerundeten Ecken.
- # -- x, y, width, height: Rechteck
- # -- b: gibt an, wie rund die Ecken sind (Radius der Viertelkreise an den Ecken)
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_round_rect(x, y, width, height, b, color, stroke=1)
- fill_rect(x+b, y, width-b-b, stroke, color)
- fill_rect(x, y+b, stroke, height-b-b, color)
- fill_rect(x+width-stroke, y+b, stroke, height-b-b, color)
- fill_rect(x+b, y+height-stroke, width-b-b, stroke, color)
- circle = Bitmap.new(b+b, b+b)
- circle.draw_oval(0, 0, b+b, b+b, color, stroke)
- blt(x, y, circle.area(0, 0, b, b), Rect.new(0, 0, b, b))
- blt(x+width-b, y, circle.area(b, 0, b, b), Rect.new(0, 0, b, b))
- blt(x+width-b, y+height-b, circle.area(b, b, b, b), Rect.new(0, 0, b, b))
- blt(x, y+height-b, circle.area(0, b, b, b), Rect.new(0, 0, b, b))
- end
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein gefĂźlltes Rechteck mit abgerundeten Ecken.
- # -- x, y, width, height: Rechteck
- # -- b: gibt an, wie rund die Ecken sind (Radius der Viertelkreise an den Ecken)
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def fill_round_rect(x, y, width, height, b, color)
- fill_rect(x, y+b, width, height-b-b, color)
- fill_rect(x+b, y, width-b-b, b, color)
- fill_rect(x+b, y+height-b, width-b-b, b, color)
- circle = Bitmap.new(b+b, b+b)
- circle.fill_oval(0, 0, b+b, b+b, color)
- blt(x, y, circle.area(0, 0, b, b), Rect.new(0, 0, b, b))
- blt(x+width-b, y, circle.area(b, 0, b, b), Rect.new(0, 0, b, b))
- blt(x+width-b, y+height-b, circle.area(b, b, b, b), Rect.new(0, 0, b, b))
- blt(x, y+height-b, circle.area(0, b, b, b), Rect.new(0, 0, b, b))
- end
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein Polygon (Vieleck).
- # -- color: Farbe
- # -- stroke: Linienstärke
- # -- *vertices: Eckpunkte als Arrays der GrĂśĂe 2 fĂźr x- und y-Koordinaten
- # Ein Aufruf der Methode kĂśnnte z.B. so aussehen:
- # draw_polygon(Color.black, 2, [0, 0], [30, 10], [300, 100], [200, 40], [30, 50])
- #<<<<<<<<<<<<<<<<<<<
- def draw_polygon(color, stroke, *vertices)
- if vertices[0].size > 2
- vertices = vertices[0]
- end
- return if stroke <= 0 or vertices.size <= 2
- count = vertices.size
- for i in -1..count-2
- x1, y1 = vertices[i]
- x2, y2 = vertices[i+1]
- draw_line(x1, y1, x2, y2, color, stroke)
- end
- end
- #---------------
- # todo: gefĂźlltes Polygon zeichnen, ich habe keinen effezienten Algorithmus
- # finden kĂśnnen.
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein regelmäĂiges Vieleck um den Mittelpunkt (cx, cy).
- # -- n: Anzahl der Ecken
- # -- radius: Radius
- # -- color: Farbe
- # -- stroke (1): Linienstärke
- #<<<<<<<<<<<<<<<<<<<
- def draw_regular_polygon(cx, cy, n, radius, color, stroke=1)
- return if stroke <= 0 or n <= 2
- phi = 0
- dphi = 2 * Math::PI / n
- vertices = []
- n.times do
- x = radius*Math.cos(phi) + cx
- y = radius*Math.sin(phi) + cy
- vertices.push([x.to_i, y.to_i])
- phi += dphi
- end
- draw_polygon(color, stroke, vertices)
- end
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet einen Text mit einem netten Schatteneffekt.
- # -- x, y, width, height: Rechteck
- # -- str: Text
- # -- align (0): Ausrichtung, 0 = linksbĂźndig, 1 = zentriert, 2 = rechtsbĂźndig
- #<<<<<<<<<<<<<<<<<<<
- def draw_shadow_text(x, y, width, height, str, align=0)
- color = font.color.dup
- font.color = Color.new(192, 192, 192, 156)
- draw_text(x+2, y+2, width, height, str, align)
- font.color = color
- draw_text(x, y, width, height, str, align)
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap vertikal gespiegelt zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def vertical_flip
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- pixel = get_pixel(x, y)
- buffer.set_pixel(x, height-y, pixel)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>
- # Spiegelt die Bitmap vertikal.
- #<<<<<<<<<<<<<<<<<<
- def vertical_flip!
- buffer = vertical_flip
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap horizontal gespiegelt zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def horizontal_flip
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- pixel = get_pixel(x, y)
- buffer.set_pixel(width-x, y, pixel)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>
- # Spiegelt die Bitmap horizontal.
- #<<<<<<<<<<<<<<<<<<
- def horizontal_flip!
- buffer = horizontal_flip
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt das Negativ der Bitmap, d.h. mit allen Farben umgekehrt, zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def negative
- # Look Up Table
- lut = Array.new(256)
- for i in 0..255
- lut[i] = i ^ 255
- end
- #:::::
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- px = get_pixel(x, y)
- pixel = Color.new(lut[px.red], lut[px.green], lut[px.blue], px.alpha)
- buffer.set_pixel(x, y, pixel)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Kehrt alle Farbwerte um.
- #<<<<<<<<<<<<<<<<<<<
- def negative!
- buffer = negative
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>>
- # Gibt das Graustufenbild der Bitmap zurĂźck, d.h. die Farbe jedes
- # Pixels wird auf den Mittelwert seiner RGB-Werte gesetzt.
- #<<<<<<<<<<<<<<<<<<<<
- def grayscale
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- color = get_pixel(x, y).grayscale
- buffer.set_pixel(x, y, color)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Konvertiert die Bitmap zum Graustufenbild.
- #<<<<<<<<<<<<<<<<<<<
- def grayscale!
- buffer = grayscale
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap verpixelt zurĂźck, d.h. Quadrate von factor * factor
- # pixels werden zu ihrem Durchschnitt zusammengefasst.
- #<<<<<<<<<<<<<<<<<<<
- def pixelize(factor=2)
- return dup if factor <= 1
- #return scale(1.to_f/factor).scale(factor)
- buffer = Bitmap.new(width, height)
- for ix in 0..width/factor
- for iy in 0..height/factor
- x = ix*factor
- y = iy*factor
- color = average_color(x, y, factor, factor)
- buffer.fill_rect(x, y, factor, factor, color)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Verpixelt die Bitmap.
- #<<<<<<<<<<<<<<<<<<<
- def pixelize!(factor=2)
- buffer = pixelize(factor)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap verwaschen zurĂźck. Der Algorithmus ist nicht sehr
- # effezient. Wäre gut, wenn jemand noch einen besseren fände.
- #<<<<<<<<<<<<<<<<<<<
- def blur(f=1)
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- color = average_color(x-f, y-f, 2*f, 2*f)
- buffer.set_pixel(x, y, color)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Verwäscht die Bitmap.
- #<<<<<<<<<<<<<<<<<<<
- def blur!(f=1)
- buffer = blur(f)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap "geschĂźttelt", d.h. mehrmals Ăźbereinander
- # mit verringer Opacity gezeichnet, zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def shake(d=1, horizontal=true, vertical=true)
- return dup if d <= 0 or (! horizontal and ! vertical)
- buffer = Bitmap.new(width, height)
- if horizontal and vertical
- buffer.blt(-d, -d, self, Rect.new(0, 0, width, height), 64)
- buffer.blt(d, -d, self, Rect.new(0, 0, width, height), 64)
- buffer.blt(-d, d, self, Rect.new(0, 0, width, height), 64)
- buffer.blt(d, d, self, Rect.new(0, 0, width, height), 64)
- elsif horizontal
- buffer.blt(-d, 0, self, Rect.new(0, 0, width, height), 128)
- buffer.blt(d, 0, self, Rect.new(0, 0, width, height), 128)
- elsif vertical
- buffer.blt(0, -d, self, Rect.new(0, 0, width, height), 128)
- buffer.blt(0, d, self, Rect.new(0, 0, width, height), 128)
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # "SchĂźttelt" die Bitmap.
- #<<<<<<<<<<<<<<<<<<<
- def shake!(d=1, horizontal=true, vertical=true)
- buffer = shake(d, horizontal, vertical)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Ăndert die Helligkeit der Bitmap.
- # -- b: die Helligkeit, muss zwischen -255 (ganz schwarz)
- # und +255 (ganz weiĂ) liegen.
- #<<<<<<<<<<<<<<<<<<<
- def change_brightness(b)
- b = [[-255, b].max, 255].min
- # Look Up Table
- lut = Array.new(256)
- for i in 0..255
- if b >= 0
- c = (255 - i) * (b.to_f/255) + i
- else
- c = i * ((255+b.to_f) / 255)
- end
- lut[i] = c
- end
- #::::::::::
- for x in 0..width
- for y in 0..height
- px = get_pixel(x, y)
- color = Color.new(lut[px.red], lut[px.green], lut[px.blue], px.alpha)
- set_pixel(x, y, color)
- end
- end
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Verändert den Kontrast.
- # -- contrast: der Parameter muss zwischen -127 und +127 liegen
- #<<<<<<<<<<<<<<<<<<<
- def change_contrast(contrast)
- # LUT
- lut = Array.new(256)
- for i in 0..255
- c = (i - 127 )*((contrast+127).to_f / 127) + 127
- c = [[0, c].max, 255].min
- lut[i] = c
- end
- #::::
- for x in 0..width-1
- for y in 0..height-1
- px = get_pixel(x, y)
- color = Color.new(lut[px.red], lut[px.green], lut[px.blue], px.alpha)
- set_pixel(x, y, color)
- end
- end
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Mit dem Threshold-Algorithmus wird ein Schwarz-WeiĂ-Bild erzeugt.
- # -- s (128): fĂźr jedes Pixel wird der Mittelwert der RGB-Werte gebildet, liegt
- # er unterhalb des Grenzwertes s, wird das Pixel schwarz, ansonsten weiĂ.
- #<<<<<<<<<<<<<<<<<<<
- def threshold(s=128)
- buffer = Bitmap.new(width, height)
- for x in 0..width-1
- for y in 0..height-1
- px = get_pixel(x, y)
- b = px.red + px.green + px.blue
- color = b < 3*s ? Color.black(px.alpha) : Color.white(px.alpha)
- buffer.set_pixel(x, y, color)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Konvertiert die Bitmap nach Schwarz-WeiĂ mit dem Threshold-Algorithmus.
- # -- s (128): fĂźr jedes Pixel wird der Mittelwert der RGB-Werte gebildet, liegt
- # er unterhalb des Grenzwertes s, wird das Pixel schwarz, ansonsten weiĂ.
- #<<<<<<<<<<<<<<<<<<<
- def threshold!(s=128)
- buffer = threshold(s)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- # Gibt die Bitmap "geprägt", als Relief, zurßck.
- #<<<<<<<<<<<<<<<<<<<
- def emboss
- buffer = Bitmap.new(width, height)
- for x in 0..width-1
- for y in 0..height-1
- px = get_pixel(x, y)
- c = (px.average - get_pixel(x+1, y+1).average) + 128
- color = Color.new(c, c, c, px.alpha)
- buffer.set_pixel(x, y, color)
- end
- end
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # "Prägt" die Bitmap, eine Art Relief wird erzeugt.
- #<<<<<<<<<<<<<<<<<<<
- def emboss!
- buffer = emboss
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap mit einem bestimmten Faktor verkleinert / gestreckt zurĂźck.
- # -- factor_x: Faktor fĂźr horizontale Streckung
- # -- factor_y (factor_x): Faktor fĂźr vertikale Streckung
- #<<<<<<<<<<<<<<<<<<<
- def scale(factor_x, factor_y=factor_x)
- buffer = Bitmap.new(width*factor_x, height*factor_y)
- buffer.stretch_blt(buffer.rect, self, rect)
- return buffer
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap auf eine bestimmte GrĂśĂe gestreckt / verkleinert zurĂźck.
- # -- width: Breite
- # -- height: HĂśhe
- #<<<<<<<<<<<<<<<<<<<
- def scale_to(width, height)
- factor_x = width.to_f / self.width
- factor_y = height.to_f / self.height
- return scale(factor_x, factor_y)
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt einen Teil der Bitmap auf die volle GrĂśĂe gestreckt zurĂźck.
- # -- x, y, width, height: Ausschnitt der Bitmap
- #<<<<<<<<<<<<<<<<<<<
- def zoom_area(x, y, width, height)
- return area(x, y, width, height).scale_to(self.width, self.height)
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Ăndert die Bitmap zu einem Ausschnitt, der auf die volle GrĂśĂe
- # gestreckt wird.
- # -- x, y, width, height: Ausschnitt der Bitmap
- #<<<<<<<<<<<<<<<<<<<
- def zoom_area!(x, y, width, height)
- buffer = zoom_area(x, y, width, height)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, self.width, self.height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Ăndert die Opacity der Bitmap.
- # -- opacity: Wert zwischen 0 und 255
- #<<<<<<<<<<<<<<<<<<<
- def change_opacity(opacity)
- buffer = Bitmap.new(width, height)
- buffer.blt(0, 0, self, Rect.new(0, 0, width, height), opacity)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, self.width, self.height))
- end
- #-------------
- #>>>>>>>>>>>>>>>>>>>
- # Zeichnet ein mit einem FarbĂźbergang gefĂźlltes Rechteck.
- # -- x, y, width, height: Rechteck
- # -- color1: erste Farbe (links)
- # -- color2: zweite Farbe (rechts)
- #<<<<<<<<<<<<<<<<<<<
- def fill_rect_horizontal_gradient(x, y, width, height, color1, color2)
- r1 = color1.red
- g1 = color1.green
- b1 = color1.blue
- a1 = color1.alpha
- r2 = color2.red
- g2 = color2.green
- b2 = color2.blue
- a2 = color2.alpha
- for i in x..(x+width)
- k = i / (x+width).to_f
- red = k*(r2-r1)+r1
- green = k*(g2-g1)+g1
- blue = k*(b2-b1)+b1
- alpha = k*(a2-a1)+a1
- color = Color.new(red, green, blue, alpha)
- fill_rect(i, y, 1, height, color)
- end
- end
- #---------------
- #>>>>>>>>>>>>>>>>>>>
- # FĂźllt ein Rechteck, gefĂźllt mit einem vertikalen FarbĂźbergang von
- # color1 zu color2.
- # -- x, y, width, height: Rechteck
- # -- color1: erste Farbe (oben)
- # -- color2: zweite Farbe (unten)
- #<<<<<<<<<<<<<<<<<<<
- def fill_rect_vertical_gradient(x, y, width, height, color1, color2)
- r1 = color1.red
- g1 = color1.green
- b1 = color1.blue
- a1 = color1.alpha
- r2 = color2.red
- g2 = color2.green
- b2 = color2.blue
- a2 = color2.alpha
- for i in y..height
- k = i / (y+height).to_f
- red = k*(r2-r1)+r1
- green = k*(g2-g1)+g1
- blue = k*(b2-b1)+b1
- alpha = k*(a2-a1)+a1
- color = Color.new(red, green, blue, alpha)
- fill_rect(x, i, width, 1, color)
- end
- end
- #-----------------
- #>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap mit vertauschten RGB-Farbwerten zurĂźck.
- # -- order: die neue Reihenfolge der Farbwerte, muss einer von
- # folgenden Strings sein: "rgb", "bgr", "brg", "grb", "gbr"
- #<<<<<<<<<<<<<<<<<
- def swap_colors(order)
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- color = get_pixel(x, y).swap(order)
- buffer.set_pixel(x, y, color)
- end
- end
- return buffer
- end
- #-----------------
- #>>>>>>>>>>>>>>>>>
- # Vertauscht die RGB-Farbwerte der Bitmap.
- # -- order: die neue Reihenfolge der Farbwerte, muss einer von
- # folgenden Strings sein: "rgb", "bgr", "brg", "grb", "gbr"
- #<<<<<<<<<<<<<<<<<
- def swap_colors!(order)
- for x in 0..width
- for y in 0..height
- color = get_pixel(x, y).swap(order)
- set_pixel(x, y, color)
- end
- end
- end
- #-----------------
- #>>>>>>>>>>>>>>>>>
- # Gibt die Bitmap mit ersetzten Farben zurĂźck.
- # -- red, green, blue, alpha: zu ersetzende Farbe, die Parameter kĂśnnen sein:
- # - ein genauer Wert, z.B. 172
- # - ein Wertebereich, z.B. 100..200
- # - -1 (Farbwert ist egal)
- # -- red2, green2, blue2, alpha2: neue Farbe, die Parameter kĂśnnen sein:
- # - ein genauer Wert, z.B. 215
- # - -1 (Farbwert wird nicht geändert)
- #<<<<<<<<<<<<<<<<<
- def replace_colors(red, green, blue, alpha, red2, green2, blue2, alpha2)
- buffer = Bitmap.new(width, height)
- for x in 0..width
- for y in 0..height
- color = get_pixel(x, y)
- if ((red.is_a?(Range) and red.include?(color.red)) or
- color.red == red or
- red == -1) and
- ((green.is_a?(Range) and green.include?(color.green)) or
- color.green == green or
- green == -1) and
- ((blue.is_a?(Range) and blue.include?(color.blue)) or
- color.blue == blue or
- blue == -1) and
- ((alpha.is_a?(Range) and alpha.include?(color.alpha)) or
- color.alpha == alpha or
- alpha == -1)
- new_red = red2 == -1 ? color.red : red2
- new_green = green2 == -1 ? color.green : green2
- new_blue = blue2 == -1 ? color.blue : blue2
- new_alpha = alpha2 == -1 ? color.alpha : alpha2
- new_color = Color.new(new_red, new_green, new_blue, new_alpha)
- else
- new_color = get_pixel(x, y)
- end
- buffer.set_pixel(x, y, new_color)
- end
- end
- return buffer
- end
- #-----------------
- #>>>>>>>>>>>>>>>>>
- # Ersetzt Farben.
- # -- red, green, blue, alpha: zu ersetzende Farbe, die Parameter kĂśnnen sein:
- # - ein genauer Wert, z.B. 172
- # - ein Wertebereich, z.B. 100..200
- # - -1 (Farbwert ist egal)
- # -- red2, green2, blue2, alpha2: neue Farbe, die Parameter kĂśnnen sein:
- # - ein genauer Wert, z.B. 215
- # - -1 (Farbwert wird nicht geändert)
- #<<<<<<<<<<<<<<<<<
- def replace_colors!(red, green, blue, alpha, red2, green2, blue2, alpha2)
- buffer = replace_colors(red, green, blue, alpha, red2, green2, blue2, alpha2)
- clear
- blt(0, 0, buffer, Rect.new(0, 0, width, height))
- end
- #-----------------
- #>>>>>>>>>>>>>>>>>
- # Gibt einen Ausschnitt der Bitmap zurĂźck.
- # -- x, y, width, height: Ausschnitt
- #<<<<<<<<<<<<<<<<<
- def area(x, y, width, height)
- buffer = Bitmap.new(width, height)
- src_rect = Rect.new(x, y, width, height)
- buffer.blt(0, 0, self, src_rect)
- return buffer
- end
- #-----------------
- #>>>>>>>>>>>>>>>>>
- # Gibt die durchschnittliche Farbe in einem Ausschnitt der Bitmap zurĂźck.
- # -- x, y, width, height: Ausschnitt
- # Die Methode ist ein wenig unperformant, sollte also nicht zu oft
- # hintereinander aufgerufen werden.
- #<<<<<<<<<<<<<<<<<
- def average_color(x, y, width, height)
- width = [self.width, x+width].min
- height = [self.height, y+height].min
- red = green = blue = alpha = 0
- count = 0
- for ix in x..width
- for iy in y..height
- px = get_pixel(ix, iy)
- red += px.red
- green += px.green
- blue += px.blue
- alpha += px.alpha
- count += 1
- end
- end
- red /= count
- green /= count
- blue /= count
- alpha /= count
- return Color.new(red, green, blue, alpha)
- end
- end
- #====
- class Color
- #>>>>>>>>>>>>>>>>>>>>>
- # Gibt die Farbe als Integer zurĂźck. Das erste Byte steht fĂźr den
- # Alpha-Wert, das zweite fĂźr den Rot-Wert etc.
- #<<<<<<<<<<<<<<<<<<<<<
- def int
- return ((alpha.to_i & 0xFF) << 24) |
- ((red.to_i & 0xFF) << 16) |
- ((green.to_i & 0xFF) << 8) |
- ((blue.to_i & 0xFF) << 0)
- end
- #----------
- #>>>>>>>>>>>>>>>>>>>>>
- # Gibt eine etwas hellere Farbe zurĂźck.
- # -- factor: der Faktor, mit dem die Farbe errechnet wird, muss
- # zwischen 0.0 und 1.0 liegen
- # Die Methoden brighter und darker sind nicht umkehrbar!
- #<<<<<<<<<<<<<<<<<<<<<
- def brighter(factor=0.7)
- factor = 1-[[0, factor].max, 1].min
- new_red = factor*(255-red) + red
- new_green = factor*(255-green) + green
- new_blue = factor*(255-blue) + blue
- return Color.new(new_red, new_green, new_blue, alpha)
- end
- #--------
- #>>>>>>>>>>>>>>>>>>>>>
- # Gibt eine etwas dunklere Farbe zurĂźck.
- # -- factor: der Faktor, mit dem die Farbe errechnet wird, muss
- # zwischen 0.0 und 1.0 liegen
- # Die Methoden brighter und darker sind nicht umkehrbar!
- #<<<<<<<<<<<<<<<<<<<<<
- def darker(factor=0.7)
- factor = [[0, factor].max, 1].min
- new_red = red * factor
- new_green = green * factor
- new_blue = blue * factor
- return Color.new(new_red, new_green, new_blue, alpha)
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Komplementärfarbe zurßck, d.h. die RGB-Werte werden
- # umgekehrt.
- #<<<<<<<<<<<<<<<<<<<
- def negative
- #return Color.new(255-red, 255-green, 255-blue, alpha)
- #return int ^ 0xFFFFFF
- return Color.new(red ^ 0xFF, green ^ 0xFF, blue ^ 0xFF, alpha)
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Farbe als Graustufe zurĂźck, d.h. die RGB-Werte sind gleich.
- #<<<<<<<<<<<<<<<<<<<
- def grayscale
- g = average
- return Color.new(g, g, g, alpha)
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt den Durchschnitt der RGB-Werte zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def average
- return Math.average(red, green, blue)
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Farbe mit vertauschten Werten zurĂźck.
- # -- order: die neue Reihenfolge der Farbwerte, muss einer von
- # folgenden Strings sein: "rgb", "bgr", "brg", "grb", "gbr"
- #<<<<<<<<<<<<<<<<<<<
- def swap(order)
- order.downcase!
- o = ["rbg", "bgr", "brg", "grb", "gbr"]
- return self if not o.include?(order)
- case o.index(order)
- when 0
- return Color.new(red, blue, green, alpha)
- when 1
- return Color.new(blue, green, red, alpha)
- when 2
- return Color.new(blue, red, green, alpha)
- when 3
- return Color.new(green, red, blue, alpha)
- when 4
- return Color.new(green, blue, red, alpha)
- end
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # Gibt die Farbe in der Hexadezimalschreibweise (als String) zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def encode
- format = "%02x"
- return (format % red) + (format % green) + (format % blue) + (format % alpha)
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # Wertet einen String in der Hexadezimalschreibweise (z.B. "0082d6")
- # aus und gibt die Farbe zurĂźck.
- #<<<<<<<<<<<<<<<<<<<
- def Color.decode(hex)
- hex.downcase!
- red = hex[0..1].hex
- green = hex[2..3].hex
- blue = hex[4..5].hex
- alpha = hex.length == 8 ? hex[6..7].hex : 255
- return Color.new(red, green, blue, alpha)
- end
- #-----------
- #>>>>>>>>>>>>>>>>>>>
- # einige Farbkonstanten, sehr nĂźtzlich:
- #<<<<<<<<<<<<<<<<<<<
- def Color.white(alpha=255)
- return Color.new(255, 255, 255, alpha)
- end
- #-----------
- def Color.black(alpha=255)
- return Color.new(0, 0, 0, alpha)
- end
- #----------
- def Color.red(alpha=255)
- return Color.new(255, 0, 0, alpha)
- end
- #----------
- def Color.green(alpha=255)
- return Color.new(0, 255, 0, alpha)
- end
- #---------
- def Color.blue(alpha=255)
- return Color.new(0, 0, 255, alpha)
- end
- #----------
- def Color.yellow(alpha=255)
- return Color.new(255, 255, 0, alpha)
- end
- #----------
- def Color.cyan(alpha=255)
- return Color.new(0, 255, 255, alpha)
- end
- #----------
- def Color.magenta(alpha=255)
- return Color.new(255, 255, 0, alpha)
- end
- #----------
- def Color.light_gray(alpha=255)
- return Color.new(192, 192, 192, alpha)
- end
- #-----------
- def Color.gray(alpha=255)
- return Color.new(128, 128, 128, alpha)
- end
- #-----------
- def Color.dark_gray(alpha=255)
- return Color.new(64, 64, 64, alpha)
- end
- #-----------
- def Color.pink(alpha=255)
- return Color.new(255, 175, 175, alpha)
- end
- #-----------
- def Color.orange(alpha=255)
- return Color.new(255, 200, 0, alpha)
- end
- end
- #==========
- class Rect
- #>>>>>>>>>>>>>>>>>>>>>
- # Gibt true zurĂźck, wenn der Punkt (x, y) innerhalb des Rechteckes liegt.
- #<<<<<<<<<<<<<<<<<<<<<
- def inside?(x, y)
- return ((x >= self.x) and (x < self.x+width) and
- (y >= self.y) and (y < self.y+height))
- end
- end
- #==========
- class Window_Base
- #>>>>>>>>>>>>>>>>>>>>>
- # Zeichnet die Battlergrafik.
- # -- actor: der Held, dessen Grafik gezeichnet werden soll
- #<<<<<<<<<<<<<<<<<<<<<
- def draw_actor_battler(actor, x, y)
- bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue)
- self.contents.blt(x, y, bitmap, Rect.new(0, 0, bitmap.width, bitmap.height))
- end
- end
- #==========
- module Math
- #>>>>>>>>>>>>>>>>>>>>>
- # Gibt den Absolutwert (Betrag) einer Zahl zurĂźck.
- #<<<<<<<<<<<<<<<<<<<<<
- def self.abs(num)
- return num<0 ? -num : num
- end
- #----------
- #>>>>>>>>>>>>>>>>>>>>>
- # Errechnet den Durchschnitt der Ăźbergebenen Zahlen.
- #<<<<<<<<<<<<<<<<<<<<<
- def self.average(*nums)
- sum = 0
- for i in nums
- sum += i
- end
- return sum.to_f / nums.size
- end
- end
- #//////////////////////////////////////////////////////////
- # Verbesserungsvorschläge, Bugreports etc. an [email protected]
- #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Advertisement
Add Comment
Please, Sign In to add comment