diff --git a/src/BrailleBuffer.coffee b/src/BrailleBuffer.coffee new file mode 100644 index 0000000..dc874d8 --- /dev/null +++ b/src/BrailleBuffer.coffee @@ -0,0 +1,78 @@ +### + termap - Terminal Map Viewer + by Michael Strassburger + + Simple pixel to barille character mapper + + Implementation inspired by node-drawille (https://github.com/madbence/node-drawille) + * added written text support + * added color support + * general optimizations + -> more bit shifting/operations, less Math.floors + + Will either be merged into node-drawille or become an own module at some point +### + +module.exports = class BrailleBuffer + characterMap: [[0x1, 0x8],[0x2, 0x10],[0x4, 0x20],[0x40, 0x80]] + + pixelBuffer: null + charBuffer: null + colorBuffer: null + + constructor: (@width, @height) -> + @pixelBuffer = new Buffer @width*@height/8 + @clear() + + clear: -> + @pixelBuffer.fill 0 + @charBuffer = [] + @colorBuffer = [] + + setPixel: (x, y, color) -> + @_locate x, y, (idx, mask) => + @pixelBuffer[idx] |= mask + @colorBuffer[(x>>1)+(y*@height<<2)] = @termColor color + + unsetPixel: (x, y) -> + @_locate x, y, (idx, mask) => + @pixelBuffer[idx] &= ~mask + + _locate: (x, y, cb) -> + return unless 0 <= x < @width and 0 <= y < @height + idx = (x>>1) + (@width>>1)*(y>>2) + mask = @characterMap[y&3][x&1] + cb idx, mask + + frame: -> + output = [] + delimeter = "\n" + color = null + + for idx in [0...@pixelBuffer.length] + output.push delimeter unless idx % (@width/2) + + if @charBuffer[idx] + output.push @charBuffer[idx] + else if @pixelBuffer[idx] is 0 + output.push ' ' + else + output.push color = colorCode if color isnt colorCode = @colorBuffer[idx] or "\x1B[39m" + output.push String.fromCharCode 0x2800+@pixelBuffer[idx] + + output.push "\x1B[39m"+delimeter + output.join '' + + termColor: (color) -> + "\x1B[38;5;#{color}m" + + setChar: (char, color, x, y) -> + return unless 0 <= x < @width/2 and 0 <= y < @height/4 + idx = x+y*@width/2 + @charBuffer[idx] = char + @colorBuffer[idx] = color + +buffer = new BrailleBuffer 100, 16 +for i in [0...100] + buffer.setPixel i, 8+8*Math.cos(i/10*Math.PI/2), i>>2 +console.log buffer.frame() diff --git a/src/Renderer.coffee b/src/Renderer.coffee index 36eb302..7768c6b 100644 --- a/src/Renderer.coffee +++ b/src/Renderer.coffee @@ -113,13 +113,13 @@ module.exports = class Renderer unless style = @styler.getStyleFor layer, feature, 14 return false - color = style.paint['line-color'] or style.paint['fill-color'] or style.paint['text-color'] - toDraw = for points in feature.points for point in points x: point.x/scale y: point.y/scale + color = style.paint['line-color'] or style.paint['fill-color'] or style.paint['text-color'] + # TODO: zoom calculation todo for perfect styling if color instanceof Object color = color.stops[0][1] diff --git a/src/Termap.coffee b/src/Termap.coffee index 561e818..e14cd3f 100644 --- a/src/Termap.coffee +++ b/src/Termap.coffee @@ -65,8 +65,8 @@ module.exports = class Termap @zoom = Math.log(4096/@width)/Math.LN2 _resizeRenderer: (cb) -> - @width = Math.floor((process.stdout.columns-1)/2)*2*2 - @height = Math.ceil(process.stdout.rows/4)*4*4 + @width = (process.stdout.columns-1) >> 1 << 2 + @height = process.stdout.rows >> 2 << 4 @renderer.setSize @width, @height