# MaskTools v2

## Přehled

Autoři : Kurosu, Manao, mg262
Verze : 2.0 alfa 36
Stáhnout : http://manao4.free.fr/, http://www.avisynth.org/warpenterprises/
Kategorie : Různé pluginy
Požadavky : YV12 barevné prostředí

## Obsah

- Úvod
- Běžné parametry
- Seznam filtrů
- Popis filrtů
- Obrácený polský zápis (Reverse polish notation)
- Seznam změn

## I) Úvod

Soubor mt_masktools.dll obsahuje sadu filtrů navržených pro vytvoření masek, manipulaci a použití masek. Masky jsou ve zpracování videa cestou jak dát relativní význam každému pixelu. Můžete například vytvořit masku, která vybírá jen zelené části videa, a pak nahradí tyto části jiným videem.

Aby byla co největší kontrola nad zacházením s maskami, budou filtry využívat fakt, že každá jasová (luma) a barevnostní (chroma) plocha může být bez vzájemného vztahu (uncorrelated). To znamená, že jedno video bude vždy považováno filtry za 3 nezávislé plochy. To platí také pro masky, což znamená že maskovaný klip bude ve skutečnosti obsahovat 3 masky, jednu pro každou plochu.

Filtry mají sadu běžných parametrů, které se týkají hlavně toho jaké zpracování dělat na každé ploše. Všechny pracují jen v YV12 ( přestože v Avisynthu 2.6 bude k dispozici podpora všech planárních formátů ).

## II) Běžné parametry

Jak bylo řečeno dříve, všechny filtry - kromě pomocných (helpers) - sdílí sadu běžných parametrů. Tyto parametry jsou použity proto, aby se řeklo jaké zpracování provést na každé ploše / kanálu, a jakou oblast videa zpracovat.

- int "offx" (0), int "offy" (0)
  "offx" a "offy" jsou horní levé souřadnice obdélníku, kde by mělo nastat skutečné zpracování. Cokoli mimo obdélník bude odpadem.
- int "w" (-1), int "h" (-1)
  w a h jsou šířkou a výškou zpracovávaného obdélníku. -1 znamená, že obdélník se rozšíří do spodního pravého rohu videa. To také znamená, že výchozí nastavení jsou zamýšlena ke zpracování celého obrazu.
- int "y" (3), int "u" (1), int "v" (1)
  Tyto tři hodnoty popisují aktuální režim zpracování, který má být použit na každou plochu / kanál. Zde je, jak jsou režimy kódovány :
  - x=-255..0 : všechny pixely plochy budou nastaveny na -x.
  - x=1 : plocha nebude zpracována. To znamená, že obsah plochy po filtru je čistý nesmysl (odpad).
  - x=2 : plocha prvního vstupního klipu bude zkopírována.
  - x=3 : plocha bude zpracována filtrem který je zadán.
  - x=4 (pokud je použitelný) : plocha druhého klipu bude zkopírována.
  - x=5 (pokud je použitelný) : plocha třetího klipu bude zkopírována.
  Jak vidíte, výchozí parametry jsou voleny jen pro zpracování jasu (luma), a ne pro práci s barevností (chroma). Je to proto, že většina zpracování videa se při práci s 4:2:0 nedotýká barevnosti.
- string "chroma" ("")
  Když je zadán, hodnota obsažená v tomto řetězci přepíše režimy zpracování u & v . To je pěkný doplněk navržený mg262, který dělá filtr přátelštější k uživateli. Dovolené hodnoty pro chroma jsou :
  - "process" : nastaví u = v = 3.
  - "copy" nebo "copy first" : nastaví u = v = 2.
  - "copy second" : nastaví u = v = 4.
  - "copy third" : nastaví u = v = 5.
  - "xxx", kde xxx je číslo : nastaví u = v = -xxx.

## III) Seznam filtrů

Zde je vyčerpávající seznam filtrů obsažených v této dll :

- Tvorba masek :
  - mt_edge : vytváří masky hran (obrysů).
  - mt_motion : vytváří masky pohybu.
- Operace s maskami :
  - mt_invert : invertuje (obrací) masky.
  - mt_binarize : transformuje měkké masky na tvrdé masky.
  - mt_logic : kombinuje masky použitím logických operátorů.
  - mt_hysteresis : kombinuje masky tak, že první prorůstá do druhé.
- Slučování masek :
  - mt_merge : slučuje dva klipy v souladu s maskou.
- Morphologický operátor :
  - mt_expand : rozšiřuje (expands) masku / video.
  - mt_inpand : smršťuje (inpands) masku / video.
  - mt_inflate : nafukuje (inflates) masku / video.
  - mt_deflate : vyfukuje (deflates) masku / video.
- Lut operátor :
  - mt_lut : aplikuje výraz na všechny pixely masky / videa.
  - mt_lutxy : aplikuje výraz na všechny pixely dvou masek / videí.
  - mt_lutxyz : aplikuje výraz na všechny pixely tří masek / videí.
  - mt_lutf : vytváří jednolitý obraz z kolekce výpočtu na pixelech dvou klipů.
  - mt_luts : aplikuje výraz zahrnutím sousedních pixelů.
  - mt_lutsx : aplikuje výraz zahrnutím sousedních pixelů jiným způsobem.
  - mt_lutspa : počítá hodnotu pixelu v souladu s jeho prostorovou pozicí.
- Operátor podpory :
  - mt_makediff : odečítá dva klipy.
  - mt_adddiff : přidává zpět rozdíl dvou klipů.
  - mt_clamp : sevře (ořízne) klip mezi dva jiné klipy.
  - mt_average : zprůměruje dva klipy.
- Konvoluce :
  - mt_convolution : aplikuje oddělitelnou konvoluci na obraz.
  - mt_mappedblur : aplikuje speciální 3x3 konvoluci na obraz.
- Pomocníci :
  - mt_square : vytváří řetězec popisující čtverec.
  - mt_rectange : vytváří řetězec popisující obdélník.
  - mt_freerectangle : vytváří řetězec popisující obdélník.
  - mt_diamond : vytváří řetězec popisující diamant.
  - mt_losange : vytváří řetězec popisující kosočtverec.
  - mt_freelosange : vytváří řetězec popisující kosočtverec.
  - mt_circle : vytváří řetězec popisující kružnici.
  - mt_ellipse : vytváří řetězec popisující elipsu.
  - mt_freeellipse : vytváří řetězec popisující elipsu.
  - mt_polish : vytváří obrácený polský výraz (expresion) z infix.

## IV) Popis filtrů

### mt_edge

`mt_edge` : string mode("sobel"), int thY1(10), int thY2(10), int thC1(10), int thC2(10)

- mode volí 3x3 convoluční jádro použité pro výpočet masky. Jsou tři předdefinovaná jádra, "sobel", "roberts" a "laplace", a můžete zadat také 3x3 uživatelské jádro. "sobel" používá jádro "0 -1 0 -1 0 1 0 1 0", "roberts": "0 0 0 0 2 -1 0 -1 0" a "laplace": "1 1 1 1 -8 1 1 1 1". Normalizační součinitel jádra je automaticky vypočten a nahrazen nejbližší mocninou 2, pro umožnění rychlejšího zpracování. Můžete zadat váš vlastní normalizační faktor, jeho přidáním do seznamu koeficientů ( například "1 1 1 1 -8 1 1 1 1 8" ).
- thX1 je nízká prahová hodnota a thX2 je vysoká prahová hodnota. Pod thX1, je pixel nastaven na nulu, nad thX2, na 255, a když je mezi zůstane nedotčený.
- Později byly uvedeny tři nová jádra : "prewitt", "cartoon" a "min/max". "prewitt" je robustnější jádro, zatímco "cartoon" se chová jako "roberts", ale zahrnuje jen záporné hrany. Nakonec, "min/max" počítá lokální kontrast ( local max - local min ).

### mt_motion

`mt_motion` : int thY1(10), int thY2(10), int thC1(10), int thC2(10), int thT(10)

- thT rozhoduje zda je snímek změnou scény nebo ne. Maska je prázdná, pokud je detekována změna scény, jinak je maska vypočítána.
- thX1, thX2 pracují jako u mt_edge.

### mt_expand, mt_inpand

`mt_xxpand` : int thY(255), int thC(255), string mode("square")

- Nahrazuje pixel lokálním maximem/minimem.
- thX umožňuje omezit maximální změnu.
- mode vybírá lokální okolí. Může brát hodnoty :
  - "square" : 3x3 čtvercové okolí - isse optimalizace.
  - "horizontal" : 3x1 horizontální okolí.
  - "vertical" : 1x3 horizontální okolí.
  - "both" : 3-délky napříč ( "horizontální" + "vertikální" ) okolí.
  - uživatelský režim, kde udáváte seznam souřadnic. "0 0 -1 0 1 0" je například ekvivalentní k "horizontal".

### mt_inflate, mt_deflate

`mt_xxflate` : int thY(255), int thC(255)

- Vypočte lokální průměr zahrnutím jen těch sousedů, jejichž hodnota je vyšší/nižší než hodnota pixelu.

### mt_merge

`mt_merge` : clip clip1, clip clip2, clip mask, bool "luma"(false)

- Je to páteří konstrukce (framework). Slučuje klipy v souladu s maskou. Čím větší je hodnota masky, tím více se bude brát druhý klip ( aktuální formule je y = ((256 - m) * x1 + m * x2 + 128) / 256 )
- luma je speciální režim, kde je ke zpracování všech tří kanálů použita jen jasová plocha masky.
- u a v jsou nastaveny na výchozí 2 (tak výsledný klip obsahuje barevnost klipu clip1, a vypadá správně).

### mt_lut

`mt_lut` : string expr("x"), string yexpr("x"), string uexpr("x"), string vexpr("x")

- Aplikuje funkci definovanou parametrem expr na všechny pixely. Funkce je napsána v obráceném polském zápisu (reverse polish notation).
- Pokud yexpr, uexpr nebo vexpr není definován, použije se místo něj expr .

### mt_lutxy

`mt_lutxy` : clip clip1, clip clip2, string expr("x"), string yexpr("x"), string uexpr("x"), string vexpr("x")

- Aplikuje dvouparametrovou funkci definovanou parametrem expr na všechny pixely. Funkce je napsána v obráceném polském zápisu.
- Pokud yexpr, uexpr nebo vexpr není definován, použije se místo něj expr .

### mt_lutxyz

`mt_lutxyz` : clip clip1, clip clip2, clip clip3, string expr("x"), string yexpr("x"), string uexpr("x"), string vexpr("x")

- Aplikuje tříparametrovou funkci definovanou parametrem expr na všechny pixely. Funkce je napsána v obráceném polském zápisu.
- Pokud yexpr, uexpr nebo vexpr není definován, použije se místo něj expr .

### mt_lutf

`mt_lutf` : clip clip1, clip clip2, string mode("avg"), string expr("y"), string yexpr("y", string uexpr("y"), string vexpr("y")

- Vypočítá hodnotu shromážděním hodnot pixelů klipu clip1, v souladu s mode. Pak použije funkci definovanou výrazy na všechny pixely klipu clip2 ( které jsou mapovány do proměnné y , zatímco je x shromážděnou hodnotou ).
- mode může být :
  - "avg" nebo "average" : počítá průměr hodnot.
  - "std" nebo "standard deviation" : počítá standardní odchylku hodnot.
  - "min" : počítá minimum z hodnot.
  - "max" : počítá maximum z hodnot.
  - "range" : počítá "max" - "min".
  - "med" nebo "median" : počítá střed (median) z hodnot.
- Možné použití je pro umožnění zvýšení dynamické adaptivity : `mt_lutf(c, c, mode = "range", expr = "y 128 - 256 * range / 128 +")`

### mt_luts

`mt_luts` : clip clip1, clip clip2, string mode("avg"), string pixels(""), string expr("x"), string yexpr("x"), string uexpr("x"), string vexpr("x")

- Počítá operaci mode na výsledku funkce definované parametrem expr, kde x je pixel z clip1, a y je pixel z okolí v klipu clip2, definované parametrem pixels.
- mode může brát stejné hodnoty jako pro `mt_lutf`.
- pixels je seznam souřadnic, relativních k aktuálním pixelům. Může být vytvořen jednou z forem pomocníků (helpers).
- Podívejme se na některá použití :
  - `mt_luts( c, c, mode = "avg", pixels = mt_square( 1 ), expr = "y" )` provádí konvoluci s 3x3 jádrem.
  - `mt_luts( c, c, mode = "min", pixels = mt_square( 1 ), expr = "y" )` provádí smrštění (inpand).
  - `mt_luts( c, c, mode = "range", pixels = mt_square( 1 ), expr = "y" )` provádí `mt_edge( mode = "min/max" )`.
  - `mt_luts( c, c, mode = "std", pixels = mt_square( 1 ), expr = "y" )` dává lokální standardní odchylku klipu.
  - `mt_luts( c, c, mode = "max", pixels = mt_square( 1 ), expr = "x y - abs" )` dává maximální rozdíl mezi okolními pixely a středovým.
  - `mt_luts( c, c, mode = "med", pixels = mt_square( 1 ), expr = "y" )` dává střed (median) pixelů okolí.

### mt_lutsx

`mt_lutsx` : clip clip, clip clip1, clip clip2, string mode("avg"), string mode2("none"), string pixels(""), string expr("x"), string yexpr("x"), string uexpr("x"), string vexpr("x")

- Počítá mode na sousedních pixelech v clip1, a mode2 na sousedních pixelech v clip2, pak použije funkci definovanou parametrem expr s y = mode a z = mode2.
- mode a mode2 mohou brát stejné hodnoty jako pro `mt_lutf`.
- pixels pracuje jako v `mt_luts`.
- Podívejme se na nějaké příklady :
  - `mt_lutsx( c, c, c, mode = "min", mode2 = "max", pixels = mt_square( 1 ), expr = "z y -" )` počítá lokální max - min hodnotu.
  - `mt_lutsx( c, c, c, mode = "min", mode2 = "max", pixels = mt_square( 1 ), expr = "x y - 256 * z y - /" )` mění lokální jasnost a konstrast tak, že lokální minimum je černé a lokální maximum je bílé.

### mt_lutspa

`mt_lutspa` : clip clip, bool("relative"), string expr("x"), string yexpr("x"), string uexpr("x"), string vexpr("x")

- Počítá hodnotu každého pixelu v souladu s jeho souřadnicemi a danou lut. Proměnné x a y v lut odpovídají příslušným souřadnicím pixelu. relative, je výchozí true, indikuje zda x & y by měly být absolutní (x v rozsahu 0 až šířka klipu, y od 0 až do výšky klipu), nebo relativní (x & y v rozsahu od 0 do 1). Klip je použit jako šablona (pro výpočet snímku, šířky, výšky a barevného prostředí).
- Podívejme se na nějaké příklady :
  - `mt_lutspa( c, relative = true, "x y + 256 * 2 /", chroma = "128" )` vytváří diagonální gradient.

### mt_average

`mt_average` : clip clip1, clip clip2

- Ekvivalent k `mt_lutxy("x y + 2 /")`, ale rychlejší.

### mt_makediff

`mt_makediff` : clip clip1, clip clip2

- Ekvivalent k `mt_lutxy("x y - 128 +")`, ale rychlejší.

### mt_adddiff

`mt_adddiff` : clip clip1, clip clip2

- Ekvivalent k `mt_lutxy("x y + 128 -")`, ale rychlejší.

### mt_clamp

`mt_clamp` : clip c, clip bright_limit, clip dark_limit, int overshoot(0), int undershoot(0)

- Vynutí, aby byla hodnota prvního klipu mezi bright_limit + overshoot a dark_limit - undershoot.
- Dává nežádoucí výsledky pokud je bright_limit + overshoot < dark_limit - undershoot.

### mt_invert

`mt_invert` : clip c

- Invertuje (obrací) hodnoty pixelů.
- Ekvivalent k `mt_lut("255 x -")`, ale rychlejší.

### mt_binarize

`mt_binarize` : clip c, int threshold(128), bool upper(false)

- Pokud je upper false, vynutí, aby všechny hodnoty, které jsou zjevně nad threshold byly 0, a všechny ostatní 255.
- Jinak vynutí, aby všechny hodnoty, které jsou zjevně nad threshold byly 255, a jinak 0.
- upper = true je ekvivalent pro `mt_lut("x threshold > 0 255 ?")`, ale rychlejší.
- upper = false je ekvivalent pro `mt_lut("x threshold > 255 0 ?")`, ale rychlejší.

### mt_logic

`mt_logic` : clip clip1, clip clip2, string mode("and")

- Aplikuje funkci definovanou parametrem mode na clip1 a clip2.
- Možné hodnoty pro mode jsou :
  - "and" : provádí binární "and" na každém páru pixelů ( 11 & 5 je počítáno jejich převedním na binární číslo, a logickým součinem (and) všech bitů : 11 = 1011, 5 = 101, 11 & 5 = 1 ).
  - "or" : provádí binární "or" na každém páru pixelů ( 11 | 5 = 1011 | 101 = 1111 = 15 ).
  - "xor" : provádí binární "xor" na každém páru pixelů ( 11 ^ 5 = 1011 ^ 101 = 1110 = 14 ).
  - "andn" : provádí binární "and not" na každém páru pixelů ( 11 & ~5 = 1011 & ~101 = 1011 & 11111010 = 1010 = 10 ).
  - "min" : dává minimum každého páru pixelů.
  - "max" : dává maximum každého páru pixelů.

### mt_hysteresis

`mt_hysteresis` : clip small_mask, clip big_mask

- Prorůstá malou masku do velké masky spojovacími komponentami. To umožňuje sestavovat robustnější masky hran (obrysů).

### mt_convolution

`mt_convolution` : clip c, string horizontal("1 1 1"), string vertical("1 1 1"), bool saturate(true), float total(1.0f)

- Aplikuje na video konvoluci definovanou jádrem horizontalT x vertical.
- Jak horizontal tak vertical musí mít lichou délku.
- Výchozí normalizační hodnota je suma absolutních hodnot koeficientů jádra.
- Pokud je saturate true, výsledek konvoluce je oříznut do [0..255], jinak je oříznuta jeho absolutní hodnota do [0..255].
- Pokud je definováno total přepíše výchozí normalizační hodnotu.
- Výpočty se provádí jako desetinné jakmile je jeden element z horizontal nebo vertical desetinný (float).

### mt_mappedblur

`mt_mappedblur` : clip c, clip map, string kernel("1 1 1 1 1 1 1 1 1"), string mode("replace")

- Aplikuje konvoluční jádro na klip, ale zvláštním způsobem, v souladu s mode :
  - "replace" : pokud se pixel liší o více než map od středového pixelu konvoluce, je nahrazen středovou hodnotou.
  - "dump" : pokud se pixel liší o více než map od středového pixelu konvoluce, není zahrnut.

### mt_square, mt_circle, mt_diamond

`mt_square` : int radius(1), bool zero(true)
`mt_circle` : int radius(1), bool zero(true)
`mt_diamond` : int radius(1), bool zero(true)

- Vytváří seznam relativních souřadnic, který může být použit v `luts`, `mt_expand` a `mt_inpand`
- zero rozhoduje zda střed formy je zahrnut nebo ne.

### mt_rectangle, mt_ellipse, mt_losange

`mt_rectangle` : int hor_radius(1), int ver_radius(1), bool zero(true)
`mt_ellipse` : int hor_radius(1), int ver_radius(1), bool zero(true)
`mt_losange` : int hor_radius(1), int ver_radius(1), bool zero(true)

- Vytváří seznam relativních souřadnic, který může být použit v `luts`, `mt_expand` a `mt_inpand`
- zero rozhoduje zda střed formy je zahrnut nebo ne.

### mt_freerectangle, mt_freeellipse, mt_freelosange

`mt_freerectangle` : int top_x(-1), int top_y(-1), int bottom_x(1), int bottom_y(1), bool zero(true)
`mt_freeellipse` : int top_x(-1), int top_y(-1), int bottom_x(1), int bottom_y(1), bool zero(true)
`mt_freelosange` : int top_x(-1), int top_y(-1), int bottom_x(1), int bottom_y(1), bool zero(true)

- Vytváří seznam relativních souřadnic, který může být použit v `luts`, `mt_expand` a `mt_inpand`
- zero rozhoduje zda (0,0) pixel je zahrnut nebo ne.

### mt_polish

`mt_polish` : string expr("x")

- Vytváří obrácený polský výraz (reverse polish expression) z běžného (infix).

## V) Obrácený polský zápis (Reverse polish notation).

Hodně filtrů přijímá uživatelské funkce definované výrazem zapsaným v obráceném polském zápisu. Nemusíte být zvyklí na tento zápis, takže zde je několik vodítek :

- Základní koncept zápisu je zapsat operátor / funkci za argumenty. Takže, "x + y" v běžném zápisu se stane v obráceném polském "x y +". "(3 + 5) * x" by se stalo "3 5 + x *".

- Jak jste si všimli v posledním příkladu, velkou výhodou tohoto zápisu je, že nepotřebuje závorky. Výraz, který by byl uzavřen v závorkách ( "3 + 5" ) je správně vypočítán, protože čteme vyraz zleva doprava, a proto když se setkáme s "+" , jeho dva operandy jsou neomylně známy.
- Podporované operátory jsou : "+", "-", "*", "/", "%" ( modulo ) a "^" ( power )
- Podporované funkce jsou : "sin", "cos", "tan", "asin", "acos", "atan", "exp", "log", "abs", "round", "clip", "min", "max".
- Když budeme předpokládat, že kladné desetinné (float) číslo je "true", a záporné je "false", můžeme také definovat logické operátory : "&", "|", "&!" ( a not ), "Â" ( xor ).
- Můžeme vytvořit logické hodnoty s následujícími operátory srovnávání: "<", ">", "<=", ">=", "!=", "==", "=".
- Proměnné "x" a "y" ( když je použitelná ) obsahují hodnotu pixelu. Je to celé číslo v rozsahu od 0 do 255.
- Může být použita konstanta "pi" .
- Nakonec, existuje trojitý (ternary) operátor : "?", který pracuje jako "if .. then .. else .." ("jestliže .. pak .. jinak ..")
- Všechny výpočty jsou prováděny v desetinných číslech (floats), a konečný výsledek je zaokrouhlen na nejbližší celé číslo v rozsahu [0..255].
- V celé dokumentaci najdete mnoho příkladů.

## VI) Seznam změn

Alpha 36 :

- fixed : "pi" wasn't properly defined for all luts

Alpha 35 :

- added : mt_lutspa

Alpha 34 :

- added : support for interleaved2planar hack, enabling 422 support
- changed : both avisynth 2.5 and 2.6 version are built

Alpha 32 :

- added : mt_lutxyz
- added : mt_lutsx
- fixed : small memory leak in mt_luts

Alpha 31 :

- fixed : mt_hysteresis was randomly crashing.
- fixed : mt_polish is back.
- added : round, clip, min, max and = for lut.
- adapted : to msvc8 / yasm.

Alpha 30 :

- fixed : luts was crashing if some pixels didn't have any neighbours in the pixels list.
- added : mt_freerectangle, mt_freeellipse and mt_freelosange helpers.

Alpha 29 :

- fixed : intern float to integer conversion that were badly rounding negative number. That resulted in -1.0 been rounded into 0 (!). Most notably affected was mt_convolution. Thanks redfordxx for pointing that out.

Alpha 28 :

- fixed : mt_expand / mt_inpand / mt_convolution / mt_edge optimizations ( were borked when width-16 was mod 64, and that could be noticed only with avs 2.5.7 )

Alpha 27 :

- fixed : mt_binarize asm optimizations that borked with some thresholds

Alpha 26 :

- fixed : avs closing issue.

Alpha 25 :

- added : new html documentation.
- fixed : wrong frame issue.
- fixed : mt_merge with luma=true.

Alpha 24 :

- fixed : issues with MT.dll ( thanks tsp, Boulder, vanessam and all those who suffered the bug ).
- fixed : check for YV12 colorspace, and report an error if it isn't ( thanks Boulder ).
- speed up : median mode for luts ( once again, thanks to tsp ).

Alpha 23 :

- fix & speed up : median mode, thanks to tsp's insightfull remark. Note to self : think less like a mathematician, and more like a programmer. Simpler, faster & not bugged.

Alpha 22 :

- added : "med"/"median" mode to luts/lutf.
- changed : luts doesn't necessarily consider the center pixel.
- changed back : forms helpers prepends (0, 0).
- changed : forms helpers now have a bool "zero" parameter, defaulted to true.
- added : bool "luma" parameter to mt_merge, which makes it use the luma mask for all three planes, and which forces chroma modes to "process" ( u=v=3 ).

Alpha 21 :

- fixed : two & three input clips filters where requesting wrong frames leading to ghost artefacts.

Alpha 20 :

- fixed : huge bug preventing most filters from working.

Alpha 19 :

- code refactoring.
- fixed : bug with asm and width lower than 64.
- fixed : doesn't prepend (0, 0) pixel to the forms helpers.
- added : "min/max" mode to mt_edge. The edge value is local max - local min ( taken on a 3x3 square ).
- added : mt_lutf : a frame lut, see the description above.
- added : mt_luts : a spatial lut, see the description above.

Alpha 18 :

- added : mt_makediff, mt_adddiff, mt_average and mt_clamp, ported from mg262's limitedsupport plugin. The asm code is his, though it has been ported to nasm. They respectively amount to MakeDiff, AddDiff, SimpleAverage and Clamp.
- added : mt_edge : "prewitt" kernel, taken from mg262's Prewitt filter. Unlike mg262's filter, there's no multiplier ( it's always 1 ), but mt_edge's thresholds still apply. Results, and speed, are identical except for the borders, which are now filtered.
- added : "chroma" parameter, taken from mg262's excellent idea. It's a string that, if used, overrides U and V values. It can be either "process", "copy", "copy first", "copy second" or a number. "copy" and "copy second" work alike.
- added : vmToon-0.74, adapted to masktools 2.0.
- added : LimitedSharpenFaster, with LimitedSupport functions imported into the masktools.

Alpha 17 :

- changed : behavior of mt_edge with a custom kernel : the automatic normalization factor is now the sum of the absolute value of the coefficients, ceiled to the next power of two if that power is <= 128 ( else, it isn't ceiled ).
- added : cartoon mode for mt_edge.
- added : modified mfToon script, for masktools v2. mfToonLite's speed goes from 30 fps to 70 fps, mfToon from 4.5 to 6.5.

Alpha 16 :

- fixed : some asm code used in invert, binarize and memset to a particular value. Bug made the first 8 pixels of the picture to be incorrect. Also, avoid another nasty issue that arise when cropping ( not my fault this time, though ).

Alpha 15 :

- fixed : bugs from inflate & deflate ( thx you know you ).
- reversed : inflate and deflate now match their masktools' v1 counterparts' behavior. ( if anybody used the new buggy one, let him speak quickly ).

Alpha 14 :

- fixed : random crashes with some width and asm functions ( thx Didee ).

Alpha 13 :

- fixed : mt_merge order swapped for mask operation ( no comment... ).

Alpha 12 :

- fixed : bug with some width ( mod4 ) for the non processing mode ( != 1 or 3 ).
- changed : mt_merge order swapped for mask operation.

Alpha 11 :

- fixed : mt_convolution's multiple instanciation bug.

Alpha 10 :

- fixed : offY was always set to offX.
- fixed : offset quirk.
- fixed : mt_convolution was crashing with floats.
- changed : luts' equal operator is now equivalent to abs(x-y) < 0.000001.
- added : bool saturate(true) parameter to mt_convolution.
- added : float total(1.0) parameter to mt_convolution.

Alpha 9 :

- fixed : mt_lut, mt_lutxy : even faster loading.
- fixed : mt_convolution : negative coefficients were offseted by 1.
- fixed : mt_convolution : division by zero if the sum of the coefficients was 0.

Alpha 8 :

- fixed : mt_edge in custom mode wasn't working properly.
- fixed : mt_edge in custom mode, optimized wasn't working properly either.
- fixed : mt_lutxy was slow to load, it's better now.

Alpha 7 :

- fixed : forgot to add functions to the parser. Thanks Didee for pointing that out.

Alpha 6 :

- fixed : mt_polish was having some trouble with functions.

Alpha 5 :

- added : helpers for creating string for inpand / expand custom modes :
  - mt_circle
  - mt_square
  - mt_diamond
  - mt_ellipse
  - mt_rectangle
  - mt_losange
- added : helper for lut : consersion from infix to reverse polish notation :
  - mt_polish

Alpha 4 :

- added : custom modes for inpand / expand.

Alpha 3 :

- Fixed : mt_invert, mt_binarize, mt_lutxy, which weren't working properly anymore.
- Fixed : offset created by incorrect rounding in mt_convolution.
- Fixed : mmx version of edges filters ( soft thresholding, and roberts ).
- Fixed : mmx version of motion edge ( soft thresholding ).
- added : mt_mappedblur.

Alpha 2 :

- added functions to luts : sin, abs, cos, tan, exp, log, acos, atan, asin.
- added "vertical", "horizontal" and "both" mode to mt_inpand / mt_expand.
- added mt_convolution.
- fixed mt_merge behavior for y, u, v = 2.
- added y, u, v = 4, for masked merge : copy the second clip channel. It's worth for any two clips input filters.
- internal changes ( code reorganization ).

Alpha 1 :

- Original release.

`Český překlad:22.5.2009`