izapple2/screen/snapshotsDebug.go

183 lines
4.2 KiB
Go

package screen
import (
"image"
"image/color"
"strings"
)
// SnapshotParts the currently visible screen
func SnapshotParts(vs VideoSource, screenMode int) *image.RGBA {
videoMode := vs.GetCurrentVideoMode()
isSecondPage := (videoMode & VideoSecondPage) != 0
videoBase := videoMode & VideoBaseMask
mixMode := videoMode & VideoMixTextMask
modifiers := videoMode & VideoModifiersMask
snapScreen := snapshotByMode(vs, videoMode, screenMode)
snapPage1 := snapshotByMode(vs, videoMode&^VideoSecondPage, screenMode)
snapPage2 := snapshotByMode(vs, videoMode|VideoSecondPage, screenMode)
var snapAux *image.RGBA
/*
if videoBase == videoRGBMix {
_, mask := snapshotDoubleHiResModeMono(a, isSecondPage, true /*isRGBMixMode*/ /*, color.White)
snapAux = filterMask(mask)
}*/
if videoBase == VideoText40RGB {
snapAux = snapshotText40RGBColors(vs, isSecondPage)
} else {
switch mixMode {
case VideoMixText80:
snapAux = snapshotByMode(vs, VideoText80|modifiers, screenMode)
case VideoMixText40RGB:
snapAux = snapshotByMode(vs, VideoText40RGB|modifiers, screenMode)
default:
snapAux = snapshotByMode(vs, VideoText40|modifiers, screenMode)
}
}
return mixFourSnapshots([]*image.RGBA{snapScreen, snapAux, snapPage1, snapPage2})
}
// VideoModeName returns the name of the current video mode
func VideoModeName(vs VideoSource) string {
videoMode := vs.GetCurrentVideoMode()
videoBase := videoMode & VideoBaseMask
mixMode := videoMode & VideoMixTextMask
var name string
switch videoBase {
case VideoText40:
name = "TEXT40COL"
case VideoText80:
name = "TEXT80COL"
case VideoText40RGB:
name = "TEXT40COLRGB"
case VideoGR:
name = "GR"
case VideoDGR:
name = "DGR"
case VideoHGR:
name = "HGR"
case VideoDHGR:
name = "DHGR"
case VideoMono560:
name = "Mono560"
case VideoRGBMix:
name = "RGBMIX"
case VideoRGB160:
name = "RGB160"
case VideoSHR:
name = "SHR"
case VideoVidex:
name = "VIDEX"
default:
name = "Unknown video mode"
}
if (videoMode & VideoSecondPage) != 0 {
name += "-PAGE2"
}
if (videoMode & VideoAltText) != 0 {
name += "-ALT"
}
if (videoMode & VideoFourColors) != 0 {
name += "-4COLORS"
}
switch mixMode {
case VideoMixText40:
name += "-MIX40"
case VideoMixText80:
name += "-MIX80"
case VideoMixText40RGB:
name += "-MIX40RGB"
}
return name
}
func mixFourSnapshots(snaps []*image.RGBA) *image.RGBA {
width := snaps[0].Rect.Dx()
height := snaps[0].Rect.Dy()
size := image.Rect(0, 0, width*2, height*2)
out := image.NewRGBA(size)
for i := 1; i < 4; i++ {
if snaps[i].Bounds().Dx() < width {
snaps[i] = doubleWidthFilter(snaps[i])
}
}
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
out.Set(x, y, snaps[0].At(x, y))
out.Set(x+width, y, snaps[1].At(x, y))
out.Set(x, y+height, snaps[2].At(x, y))
out.Set(x+width, y+height, snaps[3].At(x, y))
}
}
return out
}
func doubleWidthFilter(in *image.RGBA) *image.RGBA {
b := in.Bounds()
size := image.Rect(0, 0, 2*b.Dx(), b.Dy())
out := image.NewRGBA(size)
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
c := in.At(x, y)
out.Set(2*x, y, c)
out.Set(2*x+1, y, c)
}
}
return out
}
// SnapshotCharacterGenerator shows the current character set
func SnapshotCharacterGenerator(vs VideoSource, isAltText bool) *image.RGBA {
text := make([]uint8, textLines*text40Columns)
for l := 0; l < textLines; l++ {
for c := 0; c < text40Columns; c++ {
text[text40Columns*l+c] = 0x20 + 0x80 // Space
}
}
for l := 0; l < 8; l++ {
for c := 0; c < 32; c++ {
text[text40Columns*(2*l+4)+c+4] = uint8(l*32 + c)
}
}
snap := renderText(vs, text, isAltText, nil, color.White)
snap = linesSeparatedFilter(snap)
return snap
}
// SnapshotMessageGenerator shows a message on the screen
func SnapshotMessageGenerator(vs VideoSource, message string) *image.RGBA {
lines := strings.Split(message, "\n")
text := make([]uint8, textLines*text40Columns)
for i := range text {
text[i] = 0x20 + 0x80 // Space
}
for l, line := range lines {
for c, char := range line {
if c < text40Columns && l < textLines {
text[text40Columns*l+c] = uint8(char) + 0x80
}
}
}
snap := renderText(vs, text, false, nil, color.White)
snap = linesSeparatedFilter(snap)
return snap
}