Linear transformed texture sampling for (d)bitmap

This commit is contained in:
Ilari Liusvaara 2017-07-13 15:44:52 +03:00
parent dd18168993
commit f85cdab6c5
4 changed files with 290 additions and 12 deletions

View file

@ -61,6 +61,7 @@ struct lua_bitmap
template<bool scaled> int blit_priority(lua::state& L, lua::parameters& P);
int save_png(lua::state& L, lua::parameters& P);
int _save_png(lua::state& L, lua::parameters& P, bool is_method);
int sample_texture(lua::state& L, lua::parameters& P);
};
struct lua_dbitmap
@ -85,6 +86,7 @@ struct lua_dbitmap
int save_png(lua::state& L, lua::parameters& P);
int adjust_transparency(lua::state& L, lua::parameters& P);
int _save_png(lua::state& L, lua::parameters& P, bool is_method);
int sample_texture(lua::state& L, lua::parameters& P);
};
struct lua_loaded_bitmap

228
lua.lyx
View file

@ -1,7 +1,9 @@
#LyX 2.1 created this file. For more info see http://www.lyx.org/
\lyxformat 474
#LyX 2.2 created this file. For more info see http://www.lyx.org/
\lyxformat 508
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass article
\use_default_options true
\maintain_unincluded_children false
@ -9,16 +11,16 @@
\language_package default
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_math auto
\font_roman "default" "default"
\font_sans "default" "default"
\font_typewriter "default" "default"
\font_math "auto" "auto"
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\font_sf_scale 100 100
\font_tt_scale 100 100
\graphics default
\default_output_format default
\output_sync 0
@ -133,6 +135,10 @@ Drawing and contexts
Methods that draw something (unless stated otherwise) require a valid rendering
context.
This context can come in three ways:
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -175,6 +181,10 @@ Non-negative numbers less than
\end_inset
)
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -195,6 +205,10 @@ Non-negative numbers less than
\end_inset
would be fully transparent.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -316,6 +330,10 @@ n4 steelblue steelblue1 steelblue2 steelblue3 steelblue4 tan tan1 tan2 tan3
\begin_layout Itemize
The HSL base color names: hsl-<hue><saturation><lightness>.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -339,6 +357,10 @@ The color names can have a modifier after space (multiple modifiers are
allowed, separated by spaces): opaque10, opaque20, opaque25, opaque30,
opaque40, opaque50, opaque60, opaque70, opaque75, opaque80, opaque90, opaque,
hue{+,-}{1-23}, {saturation,lightness}{+,-}{1-16}.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -451,6 +473,10 @@ addrobj: ADDRESS: The memory address.
\begin_layout Itemize
type: String: The type of data to map.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -1373,6 +1399,10 @@ Load a palette from file <file> (resolved relative to <base>).
\begin_layout Itemize
The file format is a series of lines, each with following format:
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -1887,6 +1917,10 @@ h: number: The height of area to blit.
\begin_layout Itemize
ck: number: The color key.
Pixels with this index are not copied.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -1961,6 +1995,10 @@ vscl: number: Vertical scale factor (integer).
\begin_layout Itemize
ck: number: The color key.
Pixels with this index are not copied.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -2024,6 +2062,10 @@ h: number: The height of area to blit.
\begin_layout Itemize
operator: string: The operator to use.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -2104,6 +2146,10 @@ vscl: number: Vertical scale factor (integer).
\begin_layout Itemize
operator: string: The operator to use.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -2321,6 +2367,61 @@ Hashes bitmap <bitmap> and returns crypto-strong hash.
Color order in bitmap is significant.
\end_layout
\begin_layout Subsubsection
Method sample_texture: Sample a texture
\end_layout
\begin_layout Itemize
Syntax: none bitmap:sample_texture(BITMAP source, number xx, number xy,
number x0, number yx, number yy, number y0, number scale, boolean wrap)
\end_layout
\begin_layout Standard
Parameters:
\end_layout
\begin_layout Itemize
source: BITMAP: The bitmap to sample
\end_layout
\begin_layout Itemize
xx: number: s times the source x coefficient of target x axis.
\end_layout
\begin_layout Itemize
xy: number: s times the source y coefficient of target x axis.
\end_layout
\begin_layout Itemize
x0: number: s times the target x axis offset.
\end_layout
\begin_layout Itemize
yx: number: s times the source x coefficient of target y axis.
\end_layout
\begin_layout Itemize
yy: number: s times the source y coefficient of target y axis.
\end_layout
\begin_layout Itemize
y0: number: s times the target y axis offset.
\end_layout
\begin_layout Itemize
s: number: Scale of coordinates
\end_layout
\begin_layout Itemize
wrap: boolean: If true, wrap the texture.
If false, read outside the texture as color 0.
\end_layout
\begin_layout Standard
Samples the source as texture, performing linear transform (with nearest-neighbo
r sampling) and writes the result to this bitmap.
\end_layout
\begin_layout Standard
\begin_inset Newpage pagebreak
\end_inset
@ -2652,6 +2753,10 @@ h: number: The height of area to blit.
\begin_layout Itemize
ck: number: The color key.
Pixels with this index are not copied.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -2739,6 +2844,10 @@ vscl: number: Vertical scale factor (integer).
\begin_layout Itemize
ck: number: The color key.
Pixels with this index are not copied.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -2814,6 +2923,10 @@ h: number: The height of area to blit.
\begin_layout Itemize
operator: string: The operator to use.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -2905,6 +3018,10 @@ vscl: number: Vertical scale factor (integer).
\begin_layout Itemize
operator: string: The operator to use.
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -3024,6 +3141,65 @@ hash: string: 64-hex digit hash
\begin_layout Standard
Hashes bitmap <bitmap> and returns crypto-strong hash.
\end_layout
\begin_layout Subsubsection
Method sample_texture: Sample a texture
\end_layout
\begin_layout Itemize
Syntax: none bitmap:sample_texture(BITMAP source, number xx, number xy,
number x0, number yx, number yy, number y0, number scale, boolean wrap)
\end_layout
\begin_layout Standard
Parameters:
\end_layout
\begin_layout Itemize
source: BITMAP: The bitmap to sample
\end_layout
\begin_layout Itemize
xx: number: s times the source x coefficient of target x axis.
\end_layout
\begin_layout Itemize
xy: number: s times the source y coefficient of target x axis.
\end_layout
\begin_layout Itemize
x0: number: s times the target x axis offset.
\end_layout
\begin_layout Itemize
yx: number: s times the source x coefficient of target y axis.
\end_layout
\begin_layout Itemize
yy: number: s times the source y coefficient of target y axis.
\end_layout
\begin_layout Itemize
y0: number: s times the target y axis offset.
\end_layout
\begin_layout Itemize
s: number: Scale of coordinates
\end_layout
\begin_layout Itemize
wrap: boolean: If true, wrap the texture.
If false, read outside the texture as color 0.
\end_layout
\begin_layout Standard
Samples the source as texture, performing linear transform (with nearest-neighbo
r sampling) and writes the result to this bitmap.
\begin_inset Newpage pagebreak
\end_inset
\end_layout
\begin_layout Subsection
@ -3504,6 +3680,10 @@ unconvered: number: Number of bytes that were not converted (only if <success>
\begin_layout Itemize
error: string: Error that caused conversion to stop (only if <success> is
false).
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -4121,11 +4301,19 @@ Calls function <fun> with function and specified arguments.
\begin_layout LyX-Code
on_paint = loopwrapper(function(wait)
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
\begin_layout LyX-Code
while true do
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -4884,6 +5072,10 @@ Set v' to <v>.
\begin_layout Enumerate
For each <q> q:
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -5839,6 +6031,10 @@ button_count (number): Number of buttons on controller
\begin_layout Itemize
buttons (array): Array of following info about each button:
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -5995,6 +6191,10 @@ Returns table of tables of all available keys and axes.
\begin_layout Itemize
value: Last reported value for control
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper
@ -8378,7 +8578,7 @@ Various callback-related functions.
\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "sub:callback.register:-Register-a"
name "subsec:callback.register:-Register-a"
\end_inset
@ -8415,7 +8615,7 @@ paint
\begin_layout Subsection
\begin_inset CommandInset label
LatexCommand label
name "sub:callback.unregister:-Unregister-"
name "subsec:callback.unregister:-Unregister-"
\end_inset
@ -8443,7 +8643,7 @@ Syntax: function callback.<cbname>:register(function cbfun)
Synonym for callback.register (section
\begin_inset CommandInset ref
LatexCommand ref
reference "sub:callback.register:-Register-a"
reference "subsec:callback.register:-Register-a"
\end_inset
@ -8462,7 +8662,7 @@ Syntax: function callback.<cbname>:unregister(function cbfun)
Synonym for callback.unregister (section
\begin_inset CommandInset ref
LatexCommand ref
reference "sub:callback.unregister:-Unregister-"
reference "subsec:callback.unregister:-Unregister-"
\end_inset
@ -9049,6 +9249,10 @@ index: Index of button.
\begin_layout Itemize
type: Type of event, one of:
\begin_inset Separator latexpar
\end_inset
\end_layout
\begin_deeper

BIN
lua.pdf

Binary file not shown.

View file

@ -536,6 +536,48 @@ namespace
}
}
template<typename pixel>
inline void _sample_texture(pixel* dest, uint32_t dwidth, uint32_t dheight, pixel* source, uint32_t swidth,
uint32_t sheight, int32_t xx, int32_t xy, int32_t x0, int32_t yx, int32_t yy, int32_t y0, uint32_t s,
bool wrap, pixel transparent)
{
int32_t th = s / 2;
size_t didx = 0;
for(int32_t i = 0; i < (int32_t)dheight; i++) {
int64_t ssx = (int64_t)xy * i + (int64_t)x0;
int64_t ssy = (int64_t)yy * i + (int64_t)y0;
for(int32_t j = 0; j < (int32_t)dwidth; j++) {
//Compute whole and fractional parts.
int64_t isx = ssx / (int32_t)s;
int32_t fsx = ssx % (int32_t)s;
int64_t isy = ssy / (int32_t)s;
int32_t fsy = ssy % (int32_t)s;
//Make the fractional parts always positive.
if(fsx < 0) { fsx += s; isx--; }
if(fsy < 0) { fsy += s; isy--; }
//Round the whole parts.
isx += fsx > th;
isy += fsy > th;
//Compute color.
pixel p = transparent;
if(wrap) {
isx = isx % swidth;
if(isx < 0) isx += swidth;
isy = isy % sheight;
if(isy < 0) isy += sheight;
p = source[isy * swidth + isx];
} else if(isx >= 0 && isx < swidth && isy >= 0 && isy < sheight) {
p = source[isy * swidth + isx];
}
dest[didx] = p;
//Update values for next pixel.
ssx += (int64_t)xx;
ssy += (int64_t)yx;
didx++;
}
}
}
inline int64_t mangle_color(uint32_t c)
{
if(c < 0x1000000)
@ -739,6 +781,7 @@ namespace
{"blit_porterduff", &lua_bitmap::blit<false, true>},
{"blit_scaled_porterduff", &lua_bitmap::blit<true, true>},
{"save_png", &lua_bitmap::save_png},
{"sample_texture", &lua_bitmap::sample_texture},
}, &lua_bitmap::print);
lua::_class<lua_dbitmap> LUA_class_dbitmap(lua_class_gui, "DBITMAP", {
@ -758,6 +801,7 @@ namespace
{"blit_scaled_porterduff", &lua_dbitmap::blit<true, true>},
{"save_png", &lua_dbitmap::save_png},
{"adjust_transparency", &lua_dbitmap::adjust_transparency},
{"sample_texture", &lua_dbitmap::sample_texture},
}, &lua_dbitmap::print);
}
@ -1088,6 +1132,21 @@ int lua_bitmap::save_png(lua::state& L, lua::parameters& P)
}
}
int lua_bitmap::sample_texture(lua::state& L, lua::parameters& P)
{
lua_bitmap* src_p;
int32_t xx, xy, yx, yy, x0, y0;
uint32_t s;
bool wrap;
uint16_t trans = 0;
P(P.skipped(), src_p, xx, xy, x0, yx, yy, y0, s, wrap);
_sample_texture(pixels, width, height, src_p->pixels, src_p->width, src_p->height, xx, xy, x0, yx, yy, y0,
s, wrap, trans);
return 0;
}
/** DBITMAP **/
lua_dbitmap::lua_dbitmap(lua::state& L, uint32_t w, uint32_t h)
{
@ -1288,6 +1347,19 @@ int lua_dbitmap::adjust_transparency(lua::state& L, lua::parameters& P)
return 0;
}
int lua_dbitmap::sample_texture(lua::state& L, lua::parameters& P)
{
lua_dbitmap* src_p;
int32_t xx, xy, yx, yy, x0, y0;
uint32_t s;
bool wrap;
P(P.skipped(), src_p, xx, xy, x0, yx, yy, y0, s, wrap);
_sample_texture(pixels, width, height, src_p->pixels, src_p->width, src_p->height, xx, xy, x0, yx, yy, y0,
s, wrap, framebuffer::color());
return 0;
}
template<bool png> int lua_loaded_bitmap::load(lua::state& L, lua::parameters& P)
{