rockbox/apps/plugins/lua/include_lua/blit.lua
William Wilgus 2daec3d3c3 Rocklua -- Extend / Fix rliImage
Some devices(1-bit / 2-bit displays) have packed bit formats that
 need to be unpacked in order to work on them at a pixel level.

This caused a few issues on 1 & 2-bit devices:
 Greatly Oversized data arrays for bitmaps
 Improper handling of native image data
 Framebuffer data was near unusable without jumping through hoops

Conversion between native addressing and per pixel addressing
 incurs extra overhead but it is much faster to do it
 on the 'C' side rather than in lua.

Not to mention the advantage of a unified interface for the end programer

-------------------------------------------------------------------
Adds a sane way to access each pixel of image data
Adds:
--------------------------------------------------------------------
img:clear([color],[x1],[y1],[x2],[y2])
 (set whole image or a portion to a particular value)
--------------------------------------------------------------------
img:invert([x1],[y1],[x2],[y2])
 (inverts whole image or a portion)
--------------------------------------------------------------------
img:marshal([x1],[y1],[x2],[y2],[funct])
 (calls funct for each point defined by rect of x1,y1 x2,y2
  returns value and allows setting value of each point return
  nil to terminate early)
--------------------------------------------------------------------
img:points([x1],[y1],[x2],[y2],[dx],[dy])
 (returns iterator function that steps delta-x and delta-y pixels each call
  returns value of pixel each call but doesn't allow setting to a new value
  compare to lua pairs method)
--------------------------------------------------------------------
img:copy(src,[x1],[y1],[x2],[y2],[w],[h],[clip][operation][clr/funct])
 (copies all or part of an image -- straight copy or special ops
  optionally calls funct for each point defined by rect of
  x1, y1, w, h and  x2, y2, w, h for dest and src images
  returns value of dst and src and allows setting value of
  each point return nil to terminate early)
--------------------------------------------------------------------
img:line(x1, y1, x2, y2, color)
--------------------------------------------------------------------
img:ellipse(x1, y1, x2, y2, color, [fillcolor]
--------------------------------------------------------------------
Fixed handling of 2-bit vertical integrated screens

Added direct element access for saving / restoring native image etc.

Added more data to tostring() handler and a way to access individual items

Added equals method to see if two variables reference the same image address
(doesn't check if two separate images contain the same 'picture')

Optimized get and set routines

Fixed out of bound x coord access shifting to next line

Added lua include files to expose new functionality

Finished image saving routine

Static allocation of set_viewport struct faster + saves ram over dynamic

Cleaned up code

Fixed pixel get/set for 1/2 bit devices
-------------------------------------------------------------------------
Example lua script to follow on forums
-------------------------------------------------------------------------

Change-Id: I7b9c1fd699442fb683760f781021091786c18509
2018-07-22 18:05:02 +02:00

84 lines
4.1 KiB
Lua

--[[ Lua Blit Operations
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2017 William Wilgus
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
]]
--[[
copy(dst, src, [dx, dy, sx, sy, offset_x, offset_y, clip, _blit.OP, clr/customfunct])
blit allows you to copy a [portion of a] source image to a dest image applying
a transformation operation to the pixels as they are copied
offsets are auto calculated if left empty or out of range
blit will default to copy if operation is empty or out of range
it is slightly faster to use the number directly and you don't really
need to define all (any) of these if you don't use them but I put them
here for easier use of the blit function
]]
if not rb.lcd_framebuffer then rb.splash(rb.HZ, "No Support!") return nil end
local _blit ={} do
_blit.CUSTOM = 0xFF --user defined blit function func(dst_val, x, y, src_val, x, y)
_blit.BCOPY = 0x0 --copy (use :copy() instead it is slightly faster
_blit.BOR = 0x1 --OR source and dest pixels
_blit.BXOR = 0x2 --XOR source and dest pixels
_blit.BNOR = 0x3 --(NOT) (source OR dest pixels)
_blit.BSNOR = 0x4 --(NOT source) OR dest pixels
_blit.BAND = 0x5 --AND source and dest pixels
_blit.BNAND = 0x6 --(NOT) AND source and dest pixels
_blit.BNOT = 0x7 --NOT source and dest pixels
--blit functions for masks
_blit.BSAND = 0x8 --copy color to dest if source pixel <> 0
_blit.BSNOT = 0x9 --copy color to dest if source pixel == 0
--blit functions for masks with colors
_blit.BSORC = 0xA --copy source pixel or color
_blit.BSXORC = 0xB --copy source pixel xor color
_blit.BNSORC = 0xC --copy ~(src_val | clr)
_blit.BSORNC = 0xD --copy src_val | (~clr)
_blit.BSANDC = 0xE --copy src_val & clr;
_blit.BNSANDC = 0xF --copy (~src_val) & clr
_blit.BDORNSORC = 0x10 --copy dst | (~src_val) | clr
_blit.BXORSADXORC = 0x11 --copy dst ^ (src_val & (dst_val ^ clr))
_blit.BSNEC = 0x12 --copy source pixel if source <> color
_blit.BSEQC = 0x13 --copy source pixel if source == color
_blit.BSGTC = 0x14 --copy source pixel if source > color
_blit.BSLTC = 0x15 --copy source pixel if source < color
_blit.BDNEC = 0x16 --copy source pixel if dest <> color
_blit.BDEQC = 0x17 --copy source pixel if dest == color
_blit.BDGTC = 0x18 --copy source pixel if dest > color
_blit.BDLTC = 0x19 --copy source pixel if dest < color
_blit.BDNES = 0x1A --copy color to dest if dest <> source pixel
_blit.BDEQS = 0x1B --copy color to dest if dest == source pixel
_blit.BDGTS = 0x1C --copy color to dest if dest > source pixel
_blit.BDLTS = 0x1D --copy color to dest if dest < source pixel
--Source unused for these blits
_blit.BCOPYC = 0x1E --copy color
_blit.BORC = 0x1F --OR dest and color
_blit.BXORC = 0x20 --XOR dest and color
_blit.BNDORC = 0x21 --~(dst_val | clr)
_blit.BDORNC = 0x22 --dst_val | (~clr)
_blit.BANDC = 0x23 --AND dest and color
_blit.BNDANDC = 0x24 --copy (~dst_val) & clr
_blit.BDLTS = 0x25 --dest NOT color
end -- _blit operations
return _blit