diff --git a/3party/3party.pro b/3party/3party.pro index f6ee73a984..8f4549939a 100644 --- a/3party/3party.pro +++ b/3party/3party.pro @@ -2,13 +2,12 @@ TEMPLATE = subdirs -SUBDIRS = expat +SUBDIRS = expat freetype !iphonesimulator-g++42 { !iphonedevice-g++42 { !bada-simulator { - SUBDIRS += freetype \ - gflags \ + SUBDIRS += gflags \ sgitess } } diff --git a/data/basic.skn b/data/basic.skn index 8aea91544f..e373b53816 100644 --- a/data/basic.skn +++ b/data/basic.skn @@ -401,20192 +401,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/basic_highres.skn b/data/basic_highres.skn index 13f7f9c9c3..e5d78f3ff5 100644 --- a/data/basic_highres.skn +++ b/data/basic_highres.skn @@ -401,20192 +401,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/dejavusans.ttf b/data/dejavusans.ttf new file mode 100644 index 0000000000..a36615b208 Binary files /dev/null and b/data/dejavusans.ttf differ diff --git a/data/dejavusans_10.png b/data/dejavusans_10.png deleted file mode 100644 index 0a32ff6f25..0000000000 Binary files a/data/dejavusans_10.png and /dev/null differ diff --git a/data/dejavusans_12.png b/data/dejavusans_12.png deleted file mode 100644 index 01275e5786..0000000000 Binary files a/data/dejavusans_12.png and /dev/null differ diff --git a/data/dejavusans_14.png b/data/dejavusans_14.png deleted file mode 100644 index e1410972c0..0000000000 Binary files a/data/dejavusans_14.png and /dev/null differ diff --git a/data/dejavusans_16.png b/data/dejavusans_16.png deleted file mode 100644 index ef88dccd90..0000000000 Binary files a/data/dejavusans_16.png and /dev/null differ diff --git a/data/dejavusans_20.png b/data/dejavusans_20.png deleted file mode 100644 index 88c3c21486..0000000000 Binary files a/data/dejavusans_20.png and /dev/null differ diff --git a/data/dejavusans_24.png b/data/dejavusans_24.png deleted file mode 100644 index 84458fd089..0000000000 Binary files a/data/dejavusans_24.png and /dev/null differ diff --git a/data/dejavusans_8.png b/data/dejavusans_8.png deleted file mode 100644 index 80c311a1f4..0000000000 Binary files a/data/dejavusans_8.png and /dev/null differ diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index c947078364..6582a10f2b 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -81,6 +81,8 @@ 15000 * sizeof(yg::gl::Vertex), 30000 * sizeof(unsigned short), 20, 1500 * sizeof(yg::gl::Vertex), 3000 * sizeof(unsigned short), 100, 512, 256, 10)); + + resourceManager->addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); drawer = shared_ptr(new DrawerYG(resourceManager, GetPlatform().SkinName(), !GetPlatform().IsMultiSampled())); drawer->setFrameBuffer(frameBuffer); diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 1bd9cc16f9..1a29c3f06f 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -31,17 +31,12 @@ EE7F29831219ECA300EB67A9 /* WindowHandle.mm in Sources */ = {isa = PBXBuildFile; fileRef = EE7F29801219ECA300EB67A9 /* WindowHandle.mm */; }; EEB7E22211E9079400080A68 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EEB7E22111E9079400080A68 /* CoreLocation.framework */; }; EEB7E30911E9094F00080A68 /* UserLocationController.mm in Sources */ = {isa = PBXBuildFile; fileRef = EEB7E30811E9094F00080A68 /* UserLocationController.mm */; }; - EECB31EB1281504600B01841 /* dejavusans_8.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E31281504600B01841 /* dejavusans_8.png */; }; - EECB31EC1281504600B01841 /* dejavusans_10.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E41281504600B01841 /* dejavusans_10.png */; }; - EECB31ED1281504600B01841 /* dejavusans_12.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E51281504600B01841 /* dejavusans_12.png */; }; - EECB31EE1281504600B01841 /* dejavusans_14.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E61281504600B01841 /* dejavusans_14.png */; }; - EECB31EF1281504600B01841 /* dejavusans_16.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E71281504600B01841 /* dejavusans_16.png */; }; - EECB31F01281504600B01841 /* dejavusans_20.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E81281504600B01841 /* dejavusans_20.png */; }; - EECB31F11281504600B01841 /* dejavusans_24.png in Resources */ = {isa = PBXBuildFile; fileRef = EECB31E91281504600B01841 /* dejavusans_24.png */; }; EED10A4511F78D120095FAD4 /* MapViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = EED10A4411F78D120095FAD4 /* MapViewController.mm */; }; EEE4C93E1298A2F3007231A9 /* symbols_24.png in Resources */ = {isa = PBXBuildFile; fileRef = EEE4C93D1298A2F3007231A9 /* symbols_24.png */; }; EEE4C9401298A303007231A9 /* symbols_48.png in Resources */ = {isa = PBXBuildFile; fileRef = EEE4C93F1298A303007231A9 /* symbols_48.png */; }; EEE4C9421298A31B007231A9 /* basic_highres.skn in Resources */ = {isa = PBXBuildFile; fileRef = EEE4C9411298A31B007231A9 /* basic_highres.skn */; }; + EEFC0A9612B561B7002914FF /* dejavusans.ttf in Resources */ = {isa = PBXBuildFile; fileRef = EEFC0A9512B561B7002914FF /* dejavusans.ttf */; }; + EEFC0BBF12B5656A002914FF /* libfreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EE12020311CD464100ABDD5D /* libfreetype.a */; }; FA065FED128614C400FEA989 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = FA065FEC128614C400FEA989 /* MainWindow-iPad.xib */; }; FA065FFF1286167A00FEA989 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FA065FFD1286167A00FEA989 /* Default@2x.png */; }; FA0660001286167A00FEA989 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = FA065FFE1286167A00FEA989 /* Default.png */; }; @@ -99,17 +94,11 @@ EEB7E22111E9079400080A68 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; EEB7E30711E9094F00080A68 /* UserLocationController.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = UserLocationController.hpp; sourceTree = ""; }; EEB7E30811E9094F00080A68 /* UserLocationController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = UserLocationController.mm; sourceTree = ""; }; - EECB31E31281504600B01841 /* dejavusans_8.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_8.png; path = ../../data/dejavusans_8.png; sourceTree = SOURCE_ROOT; }; - EECB31E41281504600B01841 /* dejavusans_10.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_10.png; path = ../../data/dejavusans_10.png; sourceTree = SOURCE_ROOT; }; - EECB31E51281504600B01841 /* dejavusans_12.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_12.png; path = ../../data/dejavusans_12.png; sourceTree = SOURCE_ROOT; }; - EECB31E61281504600B01841 /* dejavusans_14.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_14.png; path = ../../data/dejavusans_14.png; sourceTree = SOURCE_ROOT; }; - EECB31E71281504600B01841 /* dejavusans_16.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_16.png; path = ../../data/dejavusans_16.png; sourceTree = SOURCE_ROOT; }; - EECB31E81281504600B01841 /* dejavusans_20.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_20.png; path = ../../data/dejavusans_20.png; sourceTree = SOURCE_ROOT; }; - EECB31E91281504600B01841 /* dejavusans_24.png */ = {isa = PBXFileReference; explicitFileType = image.png; name = dejavusans_24.png; path = ../../data/dejavusans_24.png; sourceTree = SOURCE_ROOT; }; EED10A4411F78D120095FAD4 /* MapViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MapViewController.mm; sourceTree = ""; }; EEE4C93D1298A2F3007231A9 /* symbols_24.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = symbols_24.png; path = ../../data/symbols_24.png; sourceTree = SOURCE_ROOT; }; EEE4C93F1298A303007231A9 /* symbols_48.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = symbols_48.png; path = ../../data/symbols_48.png; sourceTree = SOURCE_ROOT; }; EEE4C9411298A31B007231A9 /* basic_highres.skn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = basic_highres.skn; path = ../../data/basic_highres.skn; sourceTree = SOURCE_ROOT; }; + EEFC0A9512B561B7002914FF /* dejavusans.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = dejavusans.ttf; path = ../../data/dejavusans.ttf; sourceTree = ""; }; FA065FEC128614C400FEA989 /* MainWindow-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainWindow-iPad.xib"; path = "Resources-iPad/MainWindow-iPad.xib"; sourceTree = SOURCE_ROOT; }; FA065FFD1286167A00FEA989 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = SOURCE_ROOT; }; FA065FFE1286167A00FEA989 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = SOURCE_ROOT; }; @@ -139,6 +128,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + EEFC0BBF12B5656A002914FF /* libfreetype.a in Frameworks */, 1D60589F0D05DD5A006BFB54 /* Foundation.framework in Frameworks */, 1DF5F4E00D08C38300B7A737 /* UIKit.framework in Frameworks */, 288765080DF74369002DB57D /* CoreGraphics.framework in Frameworks */, @@ -248,17 +238,11 @@ FA065FC61286143F00FEA989 /* External Resources */ = { isa = PBXGroup; children = ( + EEFC0A9512B561B7002914FF /* dejavusans.ttf */, EEE4C9411298A31B007231A9 /* basic_highres.skn */, EEE4C93F1298A303007231A9 /* symbols_48.png */, EEE4C93D1298A2F3007231A9 /* symbols_24.png */, FA500587128907F0002961F0 /* visibility.txt */, - EECB31E31281504600B01841 /* dejavusans_8.png */, - EECB31E41281504600B01841 /* dejavusans_10.png */, - EECB31E51281504600B01841 /* dejavusans_12.png */, - EECB31E61281504600B01841 /* dejavusans_14.png */, - EECB31E71281504600B01841 /* dejavusans_16.png */, - EECB31E81281504600B01841 /* dejavusans_20.png */, - EECB31E91281504600B01841 /* dejavusans_24.png */, EE026F0811D6AC2800645242 /* basic.skn */, EE026F0911D6AC2800645242 /* drawing_rules.bin */, EE026F0511D6AC0D00645242 /* classificator.txt */, @@ -371,13 +355,6 @@ EE026F0611D6AC0D00645242 /* classificator.txt in Resources */, EE026F0D11D6AC2800645242 /* basic.skn in Resources */, EE026F0E11D6AC2800645242 /* drawing_rules.bin in Resources */, - EECB31EB1281504600B01841 /* dejavusans_8.png in Resources */, - EECB31EC1281504600B01841 /* dejavusans_10.png in Resources */, - EECB31ED1281504600B01841 /* dejavusans_12.png in Resources */, - EECB31EE1281504600B01841 /* dejavusans_14.png in Resources */, - EECB31EF1281504600B01841 /* dejavusans_16.png in Resources */, - EECB31F01281504600B01841 /* dejavusans_20.png in Resources */, - EECB31F11281504600B01841 /* dejavusans_24.png in Resources */, FA065FED128614C400FEA989 /* MainWindow-iPad.xib in Resources */, FA065FFF1286167A00FEA989 /* Default@2x.png in Resources */, FA0660001286167A00FEA989 /* Default.png in Resources */, @@ -393,6 +370,7 @@ EEE4C93E1298A2F3007231A9 /* symbols_24.png in Resources */, EEE4C9401298A303007231A9 /* symbols_48.png in Resources */, EEE4C9421298A31B007231A9 /* basic_highres.skn in Resources */, + EEFC0A9612B561B7002914FF /* dejavusans.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -427,6 +405,11 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_PREPROCESSOR_DEFINITIONS = _DEBUG; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_DIR)/Projects/omim-iphone-build/out/release\"", + "\"$(DEVELOPER_DIR)/Projects/omim/iphone/Maps\"", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -517,6 +500,11 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_PREPROCESSOR_DEFINITIONS = _DEBUG; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_DIR)/Projects/omim-iphone-build/out/release\"", + "\"$(DEVELOPER_DIR)/Projects/omim/iphone/Maps\"", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -568,6 +556,11 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_PREPROCESSOR_DEFINITIONS = _DEBUG; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_DIR)/Projects/omim-iphone-build/out/release\"", + "\"$(DEVELOPER_DIR)/Projects/omim/iphone/Maps\"", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -619,6 +612,11 @@ buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; GCC_PREPROCESSOR_DEFINITIONS = _DEBUG; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "\"$(DEVELOPER_DIR)/Projects/omim-iphone-build/out/release\"", + "\"$(DEVELOPER_DIR)/Projects/omim/iphone/Maps\"", + ); SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; diff --git a/map/drawer_yg.cpp b/map/drawer_yg.cpp index bd2cd6c41f..3611916c9b 100644 --- a/map/drawer_yg.cpp +++ b/map/drawer_yg.cpp @@ -157,7 +157,7 @@ void DrawerYG::drawPathText(vector const & pts, double pathLength, s { uint8_t fontSize = get_font_size(pRule); if (fontSize > 3 * m_visualScale) - m_pScreen->drawPathText(&pts[0], pts.size(), fontSize, name, pathLength, yg::gl::Screen::middle_line, 10000); + m_pScreen->drawPathText(&pts[0], pts.size(), fontSize, name, pathLength, yg::gl::Screen::middle_line, true, 10000); } //render_target_t DrawerYG::renderTarget() const @@ -260,7 +260,7 @@ void DrawerYG::Draw(di::DrawInfo const * pInfo, rule_ptr_t pRule, int depth) void DrawerYG::drawStats(double duration, int scale, double lat, double lng) { - ostringstream out; +/* ostringstream out; out << "SPF: " << duration; if (duration == 0.0) out << " FPS: inf"; @@ -270,5 +270,5 @@ void DrawerYG::drawStats(double duration, int scale, double lat, double lng) out.str(""); out << "(" << lat << ", " << lng << ") Scale: " << scale; - m_pScreen->drawText(m2::PointD(10, 40), 0, 14, out.str().c_str(), 10000); + m_pScreen->drawText(m2::PointD(10, 40), 0, 14, out.str().c_str(), 10000);*/ } diff --git a/qt/qt.pro b/qt/qt.pro index c22ac621e2..71101417a3 100644 --- a/qt/qt.pro +++ b/qt/qt.pro @@ -2,6 +2,8 @@ ROOT_DIR = .. DEPENDENCIES = map indexer platform yg geometry coding base expat version +LIBS += -lfreetype + include($$ROOT_DIR/common.pri) TARGET = MapsWithMe @@ -28,9 +30,7 @@ macx { CLASSIFICATOR_RESOURCES.files = ../data/classificator.txt ../data/drawing_rules.bin ../data/visibility.txt CLASSIFICATOR_RESOURCES.path = Contents/Resources SKIN_RESOURCES.files = ../data/basic.skn ../data/symbols_24.png \ - ../data/dejavusans_8.png ../data/dejavusans_10.png ../data/dejavusans_12.png \ - ../data/dejavusans_14.png ../data/dejavusans_16.png ../data/dejavusans_20.png \ - ../data/dejavusans_24.png + ../data/dejavusans.ttf SKIN_RESOURCES.path = Contents/Resources QMAKE_BUNDLE_DATA += CLASSIFICATOR_RESOURCES SKIN_RESOURCES } diff --git a/qt/widgets.cpp b/qt/widgets.cpp index c492710c09..23c06d4957 100644 --- a/qt/widgets.cpp +++ b/qt/widgets.cpp @@ -42,6 +42,9 @@ namespace qt 100, 512, 256, 15)); + + m_resourceManager->addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); + m_p = shared_ptr(new DrawerYG(m_resourceManager, GetPlatform().SkinName(), !GetPlatform().IsMultiSampled())); m_p->setFrameBuffer(make_shared_ptr(new yg::gl::FrameBuffer(true))); } diff --git a/qt_tstfrm/tstwidgets.cpp b/qt_tstfrm/tstwidgets.cpp index 8cea4bea69..7525981e63 100644 --- a/qt_tstfrm/tstwidgets.cpp +++ b/qt_tstfrm/tstwidgets.cpp @@ -47,6 +47,8 @@ void GLDrawWidget::initializeGL() 5000 * sizeof(unsigned short), 100, 512, 256, 15)); + + m_resourceManager->addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); /* m_resourceManager = make_shared_ptr(new yg::ResourceManager( 5000 * sizeof(yg::gl::Vertex), 10000 * sizeof(unsigned short), diff --git a/skin_generator/main.cpp b/skin_generator/main.cpp index 825dc4f1e1..448a6d487a 100644 --- a/skin_generator/main.cpp +++ b/skin_generator/main.cpp @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) symbolScales.push_back(FLAGS_symbolScale); gen.processSymbols(FLAGS_symbolsDir, FLAGS_skinName, symbolSizes, symbolScales); - gen.processFont(FLAGS_fontFileName, FLAGS_skinName, FLAGS_symbolsFile, glyphSizes); +// gen.processFont(FLAGS_fontFileName, FLAGS_skinName, FLAGS_symbolsFile, glyphSizes); gen.writeToFile(FLAGS_skinName); diff --git a/skin_generator/skin_generator.cpp b/skin_generator/skin_generator.cpp index 5869773812..89a5d349a3 100644 --- a/skin_generator/skin_generator.cpp +++ b/skin_generator/skin_generator.cpp @@ -84,10 +84,11 @@ namespace tools FT_Stroker stroker; FTCHECK(FT_Stroker_New(lib, &stroker)); - size_t outlineWidth = 10; + size_t outlineWidth = 3; FT_Stroker_Set(stroker, outlineWidth * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); - FT_Glyph_Metrics glyphMetrics; + FT_Glyph_Metrics normalGlyphMetrics; + FT_Glyph_Metrics strokedGlyphMetrics; for (size_t i = 0; i < fontSizes.size(); ++i) { @@ -100,7 +101,7 @@ namespace tools fontInfo.m_size = fontSizes[i]; FTCHECK(FT_Set_Pixel_Sizes(face, 0, fontSizes[i])); -// FTCHECK(FT_Set_Pixel_Sizes(face, 0, 200)); +// FTCHECK(FT_Set_Pixel_Sizes(face, 0, 100)); for (size_t j = 0; j < ucs2Symbols.size(); ++j) { unsigned short symbol = ucs2Symbols[j]; @@ -111,53 +112,84 @@ namespace tools continue; FTCHECK(FT_Load_Glyph(face, symbolIdx, FT_LOAD_DEFAULT)); - glyphMetrics = face->glyph->metrics; +// FTCHECK(FT_Load_Glyph(face, FT_Get_Char_Index(face, '@'), FT_LOAD_DEFAULT)); - CharInfo charInfo; - charInfo.m_width = int(glyphMetrics.width >> 6); - charInfo.m_height = int(glyphMetrics.height >> 6); - charInfo.m_xOffset = int(glyphMetrics.horiBearingX >> 6); - charInfo.m_yOffset = int(glyphMetrics.horiBearingY >> 6) - charInfo.m_height; - charInfo.m_xAdvance = int(glyphMetrics.horiAdvance >> 6); + normalGlyphMetrics = face->glyph->metrics; - if ((charInfo.m_width != 0) && (charInfo.m_height != 0)) + CharInfo normalCharInfo; + + normalCharInfo.m_width = int(normalGlyphMetrics.width >> 6); + normalCharInfo.m_height = int(normalGlyphMetrics.height >> 6); + normalCharInfo.m_xOffset = int(normalGlyphMetrics.horiBearingX >> 6); + normalCharInfo.m_yOffset = int(normalGlyphMetrics.horiBearingY >> 6) - normalCharInfo.m_height; + normalCharInfo.m_xAdvance = int(normalGlyphMetrics.horiAdvance >> 6); + + CharInfo strokedCharInfo = normalCharInfo; + + if ((normalCharInfo.m_width != 0) && (normalCharInfo.m_height != 0)) { FT_GlyphSlot glyphSlot = face->glyph; - FTCHECK(FT_Render_Glyph(glyphSlot, FT_RENDER_MODE_NORMAL)); - -/* FT_Glyph strokedGlyph; + FT_Glyph strokedGlyph; FTCHECK(FT_Get_Glyph(face->glyph, &strokedGlyph)); FTCHECK(FT_Glyph_Stroke(&strokedGlyph, stroker, 1)); FTCHECK(FT_Glyph_To_Bitmap(&strokedGlyph, FT_RENDER_MODE_NORMAL, 0, 0)); -*/ + + FT_BitmapGlyph strokedBitmapGlyph = (FT_BitmapGlyph)strokedGlyph; + + strokedCharInfo.m_width = strokedBitmapGlyph->bitmap.width; + strokedCharInfo.m_height = strokedBitmapGlyph->bitmap.rows; + strokedCharInfo.m_xOffset = strokedBitmapGlyph->left; + strokedCharInfo.m_yOffset = int(strokedBitmapGlyph->top) - strokedCharInfo.m_height; + strokedCharInfo.m_xAdvance = int(strokedBitmapGlyph->root.advance.x >> 16); + typedef gil::gray8_pixel_t pixel_t; -/* gil::gray8c_view_t grayview = gil::interleaved_view( - charInfo.m_width, - charInfo.m_height, - (pixel_t*)((FT_BitmapGlyph)strokedGlyph)->bitmap.buffer, - sizeof(unsigned char) * ((FT_BitmapGlyph)strokedGlyph)->bitmap.width); -*/ gil::gray8c_view_t grayview = gil::interleaved_view( - charInfo.m_width, - charInfo.m_height, - (pixel_t*)glyphSlot->bitmap.buffer, - sizeof(unsigned char) * glyphSlot->bitmap.width); + strokedCharInfo.m_width, + strokedCharInfo.m_height, + (pixel_t*)strokedBitmapGlyph->bitmap.buffer, + strokedBitmapGlyph->bitmap.pitch); - charInfo.m_image.recreate(charInfo.m_width, charInfo.m_height); - gil::copy_pixels(grayview, gil::view(charInfo.m_image)); + strokedCharInfo.m_image.recreate(strokedCharInfo.m_width, + strokedCharInfo.m_height); - /* gil::lodepng_write_view( - "testchar.png", - gil::view(charInfo.m_image)); + gil::copy_pixels(grayview, gil::view(strokedCharInfo.m_image)); + +/* gil::lodepng_write_view( + "testchar_outline.png", + gil::view(strokedCharInfo.m_image)); +*/ FT_Done_Glyph(strokedGlyph); - */ + + FTCHECK(FT_Render_Glyph(glyphSlot, FT_RENDER_MODE_NORMAL)); + + FT_Glyph normalGlyph; + FTCHECK(FT_Get_Glyph(face->glyph, &normalGlyph)); + + FT_BitmapGlyph normalBitmapGlyph = (FT_BitmapGlyph)normalGlyph; + + grayview = gil::interleaved_view( + normalCharInfo.m_width, + normalCharInfo.m_height, + (pixel_t*)normalBitmapGlyph->bitmap.buffer, + sizeof(unsigned char) * normalBitmapGlyph->bitmap.width); + + normalCharInfo.m_image.recreate(normalCharInfo.m_width, normalCharInfo.m_height); + + gil::copy_pixels(grayview, gil::view(normalCharInfo.m_image)); + +/* gil::lodepng_write_view( + "testchar.png", + gil::view(normalCharInfo.m_image) + ); + */ + FT_Done_Glyph(normalGlyph); } - fontInfo.m_chars[symbol] = charInfo; + fontInfo.m_chars[symbol] = make_pair(normalCharInfo, strokedCharInfo); } std::stringstream out; @@ -178,7 +210,10 @@ namespace tools for (TChars::iterator it = fontInfo.m_chars.begin(); it != fontInfo.m_chars.end(); ++it) { - it->second.m_handle = page.m_packer.pack(it->second.m_width + 4, it->second.m_height + 4); + it->second.first.m_handle = page.m_packer.pack(it->second.first.m_width + 4, it->second.first.m_height + 4); + if (m_overflowDetected) + break; + it->second.second.m_handle = page.m_packer.pack(it->second.second.m_width + 4, it->second.second.m_height + 4); if (m_overflowDetected) break; } @@ -200,7 +235,8 @@ namespace tools for (TChars::const_iterator it = fontInfo.m_chars.begin(); it != fontInfo.m_chars.end(); ++it) { - m2::RectU dstRect(page.m_packer.find(it->second.m_handle).second); + /// Packing normal char + m2::RectU dstRect(page.m_packer.find(it->second.first.m_handle).second); gil::rgba8_pixel_t color(0, 0, 0, 0); @@ -213,7 +249,7 @@ namespace tools dstRect.SizeX() - 4, dstRect.SizeY() - 4); - gil::gray8c_view_t srcView = gil::const_view(it->second.m_image); + gil::gray8c_view_t srcView = gil::const_view(it->second.first.m_image); for (size_t x = 0; x < dstRect.SizeX() - 4; ++x) for (size_t y = 0; y < dstRect.SizeY() - 4; ++y) @@ -221,6 +257,31 @@ namespace tools color[3] = srcView(x, y); dstView(x, y) = color; } + + /// packing stroked version + + dstRect = m2::RectU(page.m_packer.find(it->second.second.m_handle).second); + + color = gil::rgba8_pixel_t(255, 255, 255, 0); + + dstView = gil::subimage_view(gil::view(skinImage), dstRect.minX(), dstRect.minY(), dstRect.SizeX(), dstRect.SizeY()); + gil::fill_pixels(dstView, color); + + dstView = gil::subimage_view(gil::view(skinImage), + dstRect.minX() + 2, + dstRect.minY() + 2, + dstRect.SizeX() - 4, + dstRect.SizeY() - 4); + + srcView = gil::const_view(it->second.second.m_image); + + for (size_t x = 0; x < dstRect.SizeX() - 4; ++x) + for (size_t y = 0; y < dstRect.SizeY() - 4; ++y) + { + color[3] = srcView(x, y); + dstView(x, y) = color; + } + } gil::lodepng_write_view( @@ -389,21 +450,43 @@ namespace tools for (TChars::const_iterator it = fontIt->m_chars.begin(); it != fontIt->m_chars.end(); ++it) { QDomElement charStyle = doc.createElement("charStyle"); + + charStyle.setAttribute("id", it->first); + + QDomElement glyphInfo = doc.createElement("glyphInfo"); + charStyle.appendChild(glyphInfo); + QDomElement resourceStyle = doc.createElement("resourceStyle"); - m2::RectU const & texRect = page.m_packer.find(it->second.m_handle).second; + m2::RectU texRect = page.m_packer.find(it->second.first.m_handle).second; resourceStyle.setAttribute("x", texRect.minX()); resourceStyle.setAttribute("y", texRect.minY()); resourceStyle.setAttribute("width", texRect.SizeX()); resourceStyle.setAttribute("height", texRect.SizeY()); - charStyle.appendChild(resourceStyle); + glyphInfo.appendChild(resourceStyle); - charStyle.setAttribute("xAdvance", it->second.m_xAdvance); - charStyle.setAttribute("xOffset", it->second.m_xOffset); - charStyle.setAttribute("yOffset", it->second.m_yOffset); - charStyle.setAttribute("id", it->first); + glyphInfo.setAttribute("xAdvance", it->second.first.m_xAdvance); + glyphInfo.setAttribute("xOffset", it->second.first.m_xOffset); + glyphInfo.setAttribute("yOffset", it->second.first.m_yOffset); + + QDomElement glyphMaskInfo = doc.createElement("glyphMaskInfo"); + resourceStyle = doc.createElement("resourceStyle"); + + texRect = page.m_packer.find(it->second.second.m_handle).second; + + resourceStyle.setAttribute("x", texRect.minX()); + resourceStyle.setAttribute("y", texRect.minY()); + resourceStyle.setAttribute("width", texRect.SizeX()); + resourceStyle.setAttribute("height", texRect.SizeY()); + + glyphMaskInfo.appendChild(resourceStyle); + glyphMaskInfo.setAttribute("xAdvance", it->second.second.m_xAdvance); + glyphMaskInfo.setAttribute("xOffset", it->second.second.m_xOffset); + glyphMaskInfo.setAttribute("yOffset", it->second.second.m_yOffset); + + charStyle.appendChild(glyphMaskInfo); fontInfo.appendChild(charStyle); diff --git a/skin_generator/skin_generator.hpp b/skin_generator/skin_generator.hpp index 3d6a80f585..a82c22a860 100644 --- a/skin_generator/skin_generator.hpp +++ b/skin_generator/skin_generator.hpp @@ -40,7 +40,7 @@ namespace tools m2::Packer::handle_t m_handle; }; - typedef map TChars; + typedef map > TChars; struct FontInfo { diff --git a/yg/data_formats.hpp b/yg/data_formats.hpp new file mode 100644 index 0000000000..427123dcab --- /dev/null +++ b/yg/data_formats.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include "internal/opengl.hpp" +#include +#include + +namespace gil = boost::gil; +namespace mpl = boost::mpl; + +namespace yg +{ + template + struct DownsampleImpl + { + template + void operator()(Ch1 const & ch1, Ch2 & ch2) const + { + ch2 = ch1 / Denom; + } + }; + + template + struct Downsample + { + static const int Denom = 1 << (FromBig - ToSmall); + + template + void operator()(SrcP const & src, DstP & dst) const + { + static_for_each(src, dst, DownsampleImpl()); + } + }; + + struct RGBA8Traits + { + typedef gil::rgba8_pixel_t pixel_t; + typedef gil::rgba8c_pixel_t const_pixel_t; + typedef gil::rgba8_view_t view_t; + typedef gil::rgba8c_view_t const_view_t; + typedef gil::rgba8_image_t image_t; + + static const int maxChannelVal = 255; + static const int channelScaleFactor = 1; + + static const int gl_pixel_data_type = GL_UNSIGNED_BYTE; + + typedef Downsample<8, 8> color_converter; + }; + + struct RGBA4Traits + { + typedef gil::packed_pixel_type< + unsigned short, + mpl::vector4_c, + gil::abgr_layout_t + >::type pixel_t; + + typedef gil::memory_based_step_iterator iterator_t; + typedef gil::memory_based_2d_locator locator_t; + typedef gil::image_view view_t; + + typedef pixel_t const const_pixel_t; + + typedef gil::memory_based_step_iterator const_iterator_t; + typedef gil::memory_based_2d_locator const_locator_t; + typedef gil::image_view const_view_t; + + typedef gil::image image_t; + + static const int maxChannelVal = 15; + static const int channelScaleFactor = 16; + + static const int gl_pixel_data_type = GL_UNSIGNED_SHORT_4_4_4_4; + + typedef Downsample<8, 4> color_converter; + }; +} + +/*#ifdef OMIM_GL_ES + #define DATA_TRAITS RGBA4Traits +#else*/ + #define DATA_TRAITS RGBA8Traits +//#endif diff --git a/yg/glyph_cache.cpp b/yg/glyph_cache.cpp new file mode 100644 index 0000000000..5cffe0a433 --- /dev/null +++ b/yg/glyph_cache.cpp @@ -0,0 +1,200 @@ +#include "../base/SRC_FIRST.hpp" +#include "../base/logging.hpp" +#include "../coding/lodepng_io.hpp" +#include "../std/vector.hpp" +#include "../std/map.hpp" +#include +#include "glyph_cache.hpp" +#include "data_formats.hpp" +#include "internal/opengl.hpp" + +#include + +#include FT_FREETYPE_H +#include FT_STROKER_H +#include FT_GLYPH_H + +#undef __FTERRORS_H__ +#define FT_ERRORDEF( e, v, s ) { e, s }, +#define FT_ERROR_START_LIST { +#define FT_ERROR_END_LIST { 0, 0 } }; + +const struct +{ + int err_code; + const char* err_msg; +} ft_errors[] = + +#include FT_ERRORS_H + +void CheckError(FT_Error error) +{ + if (error != 0) + { + int i = 0; + while (ft_errors[i].err_code != 0) + { + if (ft_errors[i].err_code == error) + { + LOG(LINFO, ("FT_Error : ", ft_errors[i].err_msg)); + break; + } + ++i; + } + } +} + +#define FTCHECK(x) do {FT_Error e = (x); CheckError(e);} while (false) + +namespace gil = boost::gil; + +namespace yg +{ + + GlyphKey::GlyphKey(unsigned short id, int fontSize, bool isMask) + : m_id(id), m_fontSize(fontSize), m_isMask(isMask) + {} + + bool operator<(GlyphKey const & l, GlyphKey const & r) + { + if (l.m_id != r.m_id) + return l.m_id < r.m_id; + if (l.m_fontSize != r.m_fontSize) + return l.m_fontSize < r.m_fontSize; + return l.m_isMask < r.m_isMask; + } + + struct GlyphCache::Impl + { + FT_Library m_lib; + FT_Stroker m_stroker; + + typedef vector TFontFaces; + TFontFaces m_faces; + + typedef map > TGlyphs; + TGlyphs m_glyphs; + }; + + GlyphCache::GlyphCache() : m_impl(new Impl()) + { + FTCHECK(FT_Init_FreeType(&m_impl->m_lib)); + FTCHECK(FT_Stroker_New(m_impl->m_lib, &m_impl->m_stroker)); + FT_Stroker_Set(m_impl->m_stroker, 3 * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); + } + + GlyphCache::~GlyphCache() + { + for (Impl::TFontFaces::iterator it = m_impl->m_faces.begin(); it != m_impl->m_faces.end(); ++it) + FT_Done_Face(*it); + FT_Stroker_Done(m_impl->m_stroker); + FT_Done_FreeType(m_impl->m_lib); + } + + void GlyphCache::addFont(char const * fileName) + { + FT_Face face; + FT_Error err = FT_New_Face(m_impl->m_lib, fileName, 0, &face); + m_impl->m_faces.push_back(face); + if (err == 0) + LOG(LINFO, ("Added font ", fileName)) + else + LOG(LINFO, ("Font wasn't added! Path: ", fileName, ", Error: ", err)); + } + + shared_ptr const GlyphCache::getGlyph(GlyphKey const & k) + { + GlyphKey key(k); + Impl::TGlyphs::const_iterator it = m_impl->m_glyphs.find(key); + if (it != m_impl->m_glyphs.end()) + return it->second; + else + { + FT_Face face = m_impl->m_faces.front(); + FTCHECK(FT_Set_Pixel_Sizes(face, 0, key.m_fontSize)); + + int symbolIdx = FT_Get_Char_Index(face, key.m_id); + if (symbolIdx == 0) + { + key = GlyphKey(65533, key.m_fontSize, key.m_isMask); + it = m_impl->m_glyphs.find(key); + if (it != m_impl->m_glyphs.end()) + return it->second; + else + { + symbolIdx = FT_Get_Char_Index(face, key.m_id); + if (symbolIdx == 0) + throw std::exception(); + } + } + + FTCHECK(FT_Load_Glyph(face, symbolIdx, FT_LOAD_DEFAULT)); + + FT_Glyph glyph; + FT_BitmapGlyph bitmapGlyph; + + if (key.m_isMask) + { + FTCHECK(FT_Get_Glyph(face->glyph, &glyph)); + FTCHECK(FT_Glyph_Stroke(&glyph, m_impl->m_stroker, 1)); + FTCHECK(FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 0)); + bitmapGlyph = (FT_BitmapGlyph)glyph; + } + else + { + FTCHECK(FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL)); + FTCHECK(FT_Get_Glyph(face->glyph, &glyph)); + bitmapGlyph = (FT_BitmapGlyph)glyph; + } + + shared_ptr info(new GlyphInfo()); + info->m_height = bitmapGlyph->bitmap.rows; + info->m_width = bitmapGlyph->bitmap.width; + info->m_xOffset = bitmapGlyph->left; + info->m_yOffset = bitmapGlyph->top - info->m_height; + info->m_xAdvance = int(bitmapGlyph->root.advance.x >> 16); + info->m_bitmap.resize(info->m_width * info->m_height * 4); + + DATA_TRAITS::view_t dstView = gil::interleaved_view( + info->m_width, + info->m_height, + (DATA_TRAITS::pixel_t*)&info->m_bitmap[0], + info->m_width * sizeof(DATA_TRAITS::pixel_t) + ); + + gil::gray8c_view_t srcView = gil::interleaved_view( + info->m_width, + info->m_height, + (gil::gray8_pixel_t*)bitmapGlyph->bitmap.buffer, + bitmapGlyph->bitmap.pitch + ); + + DATA_TRAITS::pixel_t c(key.m_isMask ? DATA_TRAITS::maxChannelVal : 0, + key.m_isMask ? DATA_TRAITS::maxChannelVal : 0, + key.m_isMask ? DATA_TRAITS::maxChannelVal : 0, + 0); + + for (size_t y = 0; y < srcView.height(); ++y) + for (size_t x = 0; x < srcView.width(); ++x) + { + gil::at_c<3>(c) = srcView(x, y) / DATA_TRAITS::channelScaleFactor; + dstView(x, y) = c; + } + + FT_Done_Glyph(glyph); + + m_impl->m_glyphs[key] = info; + } + + return m_impl->m_glyphs[key]; + } + + void GlyphInfo::dump(const char *fileName) + { +/* gil::lodepng_write_view(fileName, + gil::interleaved_view(m_width, + m_height, + (DATA_TRAITS::pixel_t*)&m_bitmap[0], + m_width * sizeof(DATA_TRAITS::pixel_t)));*/ + } +} diff --git a/yg/glyph_cache.hpp b/yg/glyph_cache.hpp new file mode 100644 index 0000000000..71fbdb6a34 --- /dev/null +++ b/yg/glyph_cache.hpp @@ -0,0 +1,46 @@ +#pragma once + +#include "../std/shared_ptr.hpp" + +namespace yg +{ + struct GlyphInfo + { + int m_xAdvance; + int m_xOffset; + int m_yOffset; + int m_width; + int m_height; + + vector m_bitmap; + + void dump(char const * fileName); + }; + + struct GlyphKey + { + unsigned short m_id; + int m_fontSize; + bool m_isMask; + GlyphKey(unsigned short id, int fontSize, bool isMask); + }; + + bool operator<(GlyphKey const & l, GlyphKey const & r); + + class GlyphCache + { + private: + + struct Impl; + shared_ptr m_impl; + + public: + + GlyphCache(); + ~GlyphCache(); + + void addFont(char const * fileName); + + shared_ptr const getGlyph(GlyphKey const & key); + }; +} diff --git a/yg/resource_manager.cpp b/yg/resource_manager.cpp index 5906150d41..1143675e69 100644 --- a/yg/resource_manager.cpp +++ b/yg/resource_manager.cpp @@ -1,6 +1,7 @@ #include "../base/SRC_FIRST.hpp" #include "internal/opengl.hpp" #include "base_texture.hpp" +#include "data_formats.hpp" #include "resource_manager.hpp" #include "skin_loader.hpp" #include "texture.hpp" @@ -12,15 +13,8 @@ namespace yg { - -#ifdef OMIM_GL_ES - typedef gl::Texture TDynamicTexture; - typedef gl::Texture TStaticTexture; - -#else - typedef gl::Texture TDynamicTexture; - typedef gl::Texture TStaticTexture; -#endif + typedef gl::Texture TDynamicTexture; + typedef gl::Texture TStaticTexture; ResourceManager::ResourceManager(size_t vbSize, size_t ibSize, size_t storagesCount, size_t smallVBSize, size_t smallIBSize, size_t smallStoragesCount, @@ -150,4 +144,14 @@ namespace yg /// somehow signal } } + + shared_ptr const ResourceManager::getGlyph(GlyphKey const & key) + { + return m_glyphCache.getGlyph(key); + } + + void ResourceManager::addFont(char const * fileName) + { + m_glyphCache.addFont(fileName); + } } diff --git a/yg/resource_manager.hpp b/yg/resource_manager.hpp index 99c052d9b6..f080b10b7d 100644 --- a/yg/resource_manager.hpp +++ b/yg/resource_manager.hpp @@ -8,6 +8,7 @@ #include "../base/mutex.hpp" #include "storage.hpp" +#include "glyph_cache.hpp" namespace yg { @@ -19,6 +20,8 @@ namespace yg class Storage; } + class GlyphInfo; + class ResourceManager { private: @@ -37,6 +40,8 @@ namespace yg gl::Storage const reserveStorageImpl(bool doWait, list & l); void freeStorageImpl(gl::Storage const & storage, bool doSignal, list & l); + GlyphCache m_glyphCache; + public: ResourceManager(size_t vbSize, size_t ibSize, size_t storagesCount, @@ -53,6 +58,9 @@ namespace yg shared_ptr const reserveTexture(bool doWait = false); void freeTexture(shared_ptr const & texture, bool doSignal = false); + + shared_ptr const getGlyph(GlyphKey const & key); + void addFont(char const * fileName); }; Skin * loadSkin(shared_ptr const & resourceManager, string const & fileName); diff --git a/yg/screen.cpp b/yg/screen.cpp index 5fa23ac890..b926a91344 100644 --- a/yg/screen.cpp +++ b/yg/screen.cpp @@ -540,13 +540,25 @@ namespace yg void Screen::drawText(m2::PointD const & pt, float angle, uint8_t fontSize, string const & utf8Text, double depth) { wstring text = FromUtf8(utf8Text); - m2::PointD currPt(0, 0); - FontInfo const & fontInfo = m_skin->getFont(translateFontSize(fontSize)); + m2::PointD currPt(0, 0); + for (size_t i = 0; i < text.size(); ++i) + { + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, true)); + CharStyle const * p = static_cast(m_skin->fromID(glyphID)); + if (p) + { + drawGlyph(pt, currPt, angle, 0, p, depth); + currPt = currPt.Move(p->m_xAdvance, 0); + } + } + + currPt = m2::PointD(0, 0); for (size_t i = 0; i < text.size(); ++i) { - CharStyle const * p = static_cast(fontInfo.fromID(text[i])); + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, false)); + CharStyle const * p = static_cast(m_skin->fromID(glyphID)); if (p) { drawGlyph(pt, currPt, angle, 0, p, depth); @@ -615,21 +627,31 @@ namespace yg } void Screen::drawPathText(m2::PointD const * path, size_t s, uint8_t fontSize, string const & utf8Text, - double pathLength, TextPos pos, double depth) + double pathLength, TextPos pos, bool isMasked, double depth) + { + if (isMasked) + drawPathTextImpl(path, s, fontSize, utf8Text, pathLength, pos, true, depth); + drawPathTextImpl(path, s, fontSize, utf8Text, pathLength, pos, false, depth); + } + + void Screen::drawPathTextImpl(m2::PointD const * path, size_t s, uint8_t fontSize, string const & utf8Text, + double pathLength, TextPos pos, bool fromMask, double depth) { pts_array arrPath(path, s); wstring const text = FromUtf8(utf8Text); // FontInfo const & fontInfo = fontSize > 0 ? m_skin->getBigFont() : m_skin->getSmallFont(); - FontInfo const & fontInfo = m_skin->getFont(translateFontSize(fontSize)); +// FontInfo const & fontInfo = m_skin->getFont(translateFontSize(fontSize)); + +// fontSize = translateFontSize(fontSize); // calc base line offset float blOffset = 2; switch (pos) { - case under_line: blOffset -= fontInfo.m_fontSize; break; - case middle_line: blOffset -= fontInfo.m_fontSize/2; break; + case under_line: blOffset -= fontSize; break; + case middle_line: blOffset -= fontSize / 2; break; case above_line: blOffset -= 0; break; } @@ -637,7 +659,8 @@ namespace yg double strLength = 0.0; for (size_t i = 0; i < text.size(); ++i) { - CharStyle const * p = static_cast(fontInfo.fromID(text[i])); + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, fromMask)); + CharStyle const * p = static_cast(m_skin->fromID(glyphID)); strLength += p->m_xAdvance; } @@ -654,7 +677,8 @@ namespace yg if (!CalcPointAndAngle(arrPath, offset, ind, ptOrg, angle)) break; - CharStyle const * p = static_cast(fontInfo.fromID(text[i])); + uint32_t glyphID = m_skin->mapGlyph(GlyphKey(text[i], fontSize, fromMask)); + CharStyle const * p = static_cast(m_skin->fromID(glyphID)); drawGlyph(ptOrg, m2::PointD(0.0, 0.0), angle, blOffset, p, depth); @@ -674,15 +698,5 @@ namespace yg base_t::setClipRect(rect); } - int Screen::translateFontSize(int fontSize) - { - return fontSize; -/* int lookUpTable [] = {8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 12, 16, 16, 16, 16}; - - if (fontSize < sizeof(lookUpTable) / sizeof(int)) - return lookUpTable[fontSize]; - else - return 16;*/ - } } // namespace gl } // namespace yg diff --git a/yg/screen.hpp b/yg/screen.hpp index af50e26265..d4940c8c2e 100644 --- a/yg/screen.hpp +++ b/yg/screen.hpp @@ -36,6 +36,8 @@ namespace yg typedef function onFlushFinishedFn; + enum TextPos { under_line, middle_line, above_line }; + private: typedef RenderStateUpdater base_t; @@ -79,6 +81,15 @@ namespace yg int m_aaShift; + void drawPathTextImpl(m2::PointD const * path, + size_t s, + uint8_t fontSize, + string const & utf8Text, + double pathLength, + TextPos pos, + bool fromMask, + double depth); + public: Screen(shared_ptr const & resourceManager, bool isAntiAliased = false); @@ -110,7 +121,6 @@ namespace yg string const & utf8Text, double depth); - enum TextPos { under_line, middle_line, above_line }; /// Drawing text in the middle of the path. void drawPathText(m2::PointD const * path, size_t s, @@ -118,6 +128,7 @@ namespace yg string const & utf8Text, double pathLength, TextPos pos, + bool isMasked, double depth); /// This functions hide the base_t functions with the same name and signature @@ -130,8 +141,6 @@ namespace yg /// @} - int translateFontSize(int fontSize); - private: void drawGlyph(m2::PointD const & ptOrg, diff --git a/yg/skin.cpp b/yg/skin.cpp index c69a71c12c..af11cd364d 100644 --- a/yg/skin.cpp +++ b/yg/skin.cpp @@ -72,7 +72,7 @@ namespace yg { for (uint8_t i = 0; i < m_pages.size(); ++i) { - uint32_t res = m_pages[i]->find(symbolName); + uint32_t res = m_pages[i]->findSymbol(symbolName); if (res != invalidPageHandle()) return packID(i, res); } @@ -85,7 +85,7 @@ namespace yg for (uint8_t i = 0; i < m_pages.size(); ++i) { - res = m_pages[i]->find(c); + res = m_pages[i]->findColor(c); if (res != invalidPageHandle()) return packID(i, res); } @@ -93,7 +93,7 @@ namespace yg if (!m_pages[m_currentDynamicPage]->hasRoom(c)) changeCurrentDynamicPage(); - return packID(m_currentDynamicPage, m_pages[m_currentDynamicPage]->Map(c)); + return packID(m_currentDynamicPage, m_pages[m_currentDynamicPage]->mapColor(c)); } uint32_t Skin::mapPenInfo(PenInfo const & penInfo) @@ -101,7 +101,7 @@ namespace yg uint32_t res = invalidPageHandle(); for (uint8_t i = 0; i < m_pages.size(); ++i) { - res = m_pages[i]->find(penInfo); + res = m_pages[i]->findPenInfo(penInfo); if (res != invalidPageHandle()) return packID(i, res); } @@ -109,27 +109,23 @@ namespace yg if (!m_pages[m_currentDynamicPage]->hasRoom(penInfo)) changeCurrentDynamicPage(); - return packID(m_currentDynamicPage, m_pages[m_currentDynamicPage]->Map(penInfo)); + return packID(m_currentDynamicPage, m_pages[m_currentDynamicPage]->mapPenInfo(penInfo)); } - FontInfo const & Skin::getFont(int size) const + uint32_t Skin::mapGlyph(GlyphKey const & gk) { - int lastFont = -1; - + uint32_t res = invalidPageHandle(); for (uint8_t i = 0; i < m_pages.size(); ++i) { - if (m_pages[i]->fonts().size() != 0) - { - if (lastFont == -1) - lastFont = i; - if (size >= m_pages[i]->fonts()[0].m_fontSize) - lastFont = i; - else - return m_pages[lastFont]->fonts()[0]; - } + res = m_pages[i]->findGlyph(gk); + if (res != invalidPageHandle()) + return packID(i, res); } - return m_pages[lastFont]->fonts()[0]; + if (!m_pages[m_currentDynamicPage]->hasRoom(gk)) + changeCurrentDynamicPage(); + + return packID(m_currentDynamicPage, m_pages[m_currentDynamicPage]->mapGlyph(gk)); } Skin::TSkinPages const & Skin::pages() const @@ -187,6 +183,9 @@ namespace yg callOverflowFns(m_currentDynamicPage); /// page should be frozen after flushing(activeCommands > 0) + /// 2. forget all fonts packed on previous page + m_pages[m_currentDynamicPage]->clearFontHandles(); + /// 2. choose next dynamic page if (m_currentDynamicPage == m_pages.size() - 1) m_currentDynamicPage = m_startDynamicPage; diff --git a/yg/skin.hpp b/yg/skin.hpp index 417c4340b7..545d7b2aa1 100644 --- a/yg/skin.hpp +++ b/yg/skin.hpp @@ -103,6 +103,10 @@ namespace yg /// if found - return id. /// if not - pack and return id. uint32_t mapColor(Color const & c); + /// find glyph identified by GlyphKey on texture + /// if found - return id + /// if not - pack and return id + uint32_t mapGlyph(GlyphKey const & gk); void addClearPageFn(clearPageFn fn, int priority); void addOverflowFn(overflowFn, int priority); diff --git a/yg/skin_loader.cpp b/yg/skin_loader.cpp index 8bcd597bf1..d5b3bd5381 100644 --- a/yg/skin_loader.cpp +++ b/yg/skin_loader.cpp @@ -35,7 +35,17 @@ namespace yg void SkinLoader::popCharStyle() { - m_chars[m_id] = shared_ptr(new CharStyle(m_texRect, m_pages.size(), m_xOffset, m_yOffset, m_xAdvance)); + m_chars[m_id] = make_pair(m_glyphInfo, m_glyphMaskInfo); + } + + void SkinLoader::popGlyphInfo() + { + m_glyphInfo = shared_ptr(new CharStyle(m_texRect, m_pages.size(), m_xOffset, m_yOffset, m_xAdvance)); + } + + void SkinLoader::popGlyphMaskInfo() + { + m_glyphMaskInfo = shared_ptr(new CharStyle(m_texRect, m_pages.size(), m_xOffset, m_yOffset, m_xAdvance)); } void SkinLoader::pushFontInfo() @@ -79,16 +89,6 @@ namespace yg m_stylesList.erase(prevIt); prevIt = it; } - - for (TFonts::const_iterator it = m_fonts.begin(); it != m_fonts.end(); ++it) - { - FontInfo fontInfo; - fontInfo.m_fontSize = it->first; - fontInfo.m_chars = it->second; - m_pages.back()->m_fonts.push_back(fontInfo); - } - - m_fonts.clear(); } void SkinLoader::popSkin() @@ -124,6 +124,8 @@ namespace yg PUSH_MODE(ESkin, "skin"); PUSH_MODE_EX(EPage, "page", pushPage); PUSH_MODE(ECharStyle, "charStyle"); + PUSH_MODE(EGlyphInfo, "glyphInfo"); + PUSH_MODE(EGlyphMaskInfo, "glyphMaskInfo"); PUSH_MODE_EX(EFontInfo, "fontInfo", pushFontInfo); PUSH_MODE(EPointStyle, "symbolStyle"); PUSH_MODE(ELineStyle, "lineStyle"); @@ -136,6 +138,8 @@ namespace yg POP_MODE_EX(ESkin, "skin", popSkin); POP_MODE_EX(EPage, "page", popPage); POP_MODE_EX(ECharStyle, "charStyle", popCharStyle); + POP_MODE_EX(EGlyphInfo, "glyphInfo", popGlyphInfo); + POP_MODE_EX(EGlyphMaskInfo, "glyphMaskInfo", popGlyphMaskInfo); POP_MODE_EX(EFontInfo, "fontInfo", popFontInfo); POP_MODE_EX(EPointStyle, "symbolStyle", popPointStyle); POP_MODE(ELineStyle, "lineStyle"); @@ -160,14 +164,15 @@ namespace yg m_fileName = value; break; case ECharStyle: + if (attr == "id") + m_id = StrToInt(value); + case EGlyphInfo: case EGlyphMaskInfo: if (attr == "xOffset") m_xOffset = StrToInt(value); else if (attr == "yOffset") m_yOffset = StrToInt(value); else if (attr == "xAdvance") m_xAdvance = StrToInt(value); - else if (attr == "id") - m_id = StrToInt(value); break; case EFontInfo: if (attr == "size") diff --git a/yg/skin_loader.hpp b/yg/skin_loader.hpp index c74bc590dc..77ada673a4 100644 --- a/yg/skin_loader.hpp +++ b/yg/skin_loader.hpp @@ -56,6 +56,8 @@ namespace yg ELineStyle, EResourceStyle, ECharStyle, + EGlyphInfo, + EGlyphMaskInfo, EFontInfo }; @@ -70,17 +72,23 @@ namespace yg m2::RectU m_texRect; /// fontInfo-specific parameters - typedef map > TChars; + typedef map, shared_ptr > > TChars; TChars m_chars; typedef map TFonts; TFonts m_fonts; int8_t m_fontSize; /// charStyle-specific parameters + + +/// glyphInfo and glyphMaskInfo specific parameters int8_t m_xOffset; int8_t m_yOffset; int8_t m_xAdvance; + shared_ptr m_glyphInfo; + shared_ptr m_glyphMaskInfo; + /// pointStyle-specific parameters string m_styleID; @@ -108,6 +116,8 @@ namespace yg void AddAttr(string const & attribute, string const & value); void popCharStyle(); + void popGlyphInfo(); + void popGlyphMaskInfo(); void popFontInfo(); void popPointStyle(); void popSkin(); diff --git a/yg/skin_page.cpp b/yg/skin_page.cpp index 78cc80caad..e481dd7154 100644 --- a/yg/skin_page.cpp +++ b/yg/skin_page.cpp @@ -1,5 +1,6 @@ #include "../base/SRC_FIRST.hpp" +#include "data_formats.hpp" #include "skin_page.hpp" #include "texture.hpp" #include "resource_style.hpp" @@ -13,11 +14,13 @@ namespace yg { -#ifdef OMIM_GL_ES - typedef gl::Texture TDynamicTexture; -#else - typedef gl::Texture TDynamicTexture; -#endif + typedef gl::Texture TDynamicTexture; + + GlyphUploadCmd::GlyphUploadCmd(){} + GlyphUploadCmd::GlyphUploadCmd(shared_ptr const & glyphInfo, + m2::RectU const & rect) + : m_glyphInfo(glyphInfo), + m_rect(rect){} ColorUploadCmd::ColorUploadCmd(){} ColorUploadCmd::ColorUploadCmd(yg::Color const & color, @@ -31,12 +34,12 @@ namespace yg : m_penInfo(penInfo), m_rect(rect){} - ResourceStyle * FontInfo::fromID(uint32_t id) const + ResourceStyle * FontInfo::fromID(uint32_t id, bool primaryGlyph) const { TChars::const_iterator it = m_chars.find(id); if (it == m_chars.end()) { - if (m_invalidChar == 0) + if (m_invalidChar.first == 0) { it = m_chars.find(65533); @@ -45,13 +48,19 @@ namespace yg else LOG(LINFO, ("initialized invalidChar from 65533")); - m_invalidChar = it->second.get(); + m_invalidChar = pair(it->second.first.get(), it->second.second.get()); } - return m_invalidChar; + if (primaryGlyph) + return m_invalidChar.first; + else + return m_invalidChar.second; } else - return it->second.get(); + if (primaryGlyph) + return it->second.first.get(); + else + return it->second.second.get(); } SkinPage::SkinPage(shared_ptr const & resourceManager, @@ -81,19 +90,38 @@ namespace yg void SkinPage::clearHandles() { - for (TPenInfoMap::const_iterator it = m_penInfoMap.begin(); it != m_penInfoMap.end(); ++it) - m_styles.erase(it->second); - - for (TColorMap::const_iterator it = m_colorMap.begin(); it != m_colorMap.end(); ++it) - m_styles.erase(it->second); - - m_penInfoMap.clear(); - m_colorMap.clear(); + clearPenInfoHandles(); + clearColorHandles(); + clearFontHandles(); m_packer.reset(); } - uint32_t SkinPage::find(yg::Color const & c) const + void SkinPage::clearColorHandles() + { + for (TColorMap::const_iterator it = m_colorMap.begin(); it != m_colorMap.end(); ++it) + m_styles.erase(it->second); + + m_colorMap.clear(); + } + + void SkinPage::clearPenInfoHandles() + { + for (TPenInfoMap::const_iterator it = m_penInfoMap.begin(); it != m_penInfoMap.end(); ++it) + m_styles.erase(it->second); + + m_penInfoMap.clear(); + } + + void SkinPage::clearFontHandles() + { + for (TGlyphMap::const_iterator it = m_glyphMap.begin(); it != m_glyphMap.end(); ++it) + m_styles.erase(it->second); + + m_glyphMap.clear(); + } + + uint32_t SkinPage::findColor(yg::Color const & c) const { TColorMap::const_iterator it = m_colorMap.find(c); if (it == m_colorMap.end()) @@ -102,9 +130,9 @@ namespace yg return it->second; } - uint32_t SkinPage::Map(yg::Color const & c) + uint32_t SkinPage::mapColor(yg::Color const & c) { - uint32_t foundHandle = find(c); + uint32_t foundHandle = findColor(c); if (foundHandle != m_packer.invalidHandle()) return foundHandle; @@ -125,7 +153,7 @@ namespace yg return m_packer.hasRoom(2, 2); } - uint32_t SkinPage::find(char const * symbolName) const + uint32_t SkinPage::findSymbol(char const * symbolName) const { TPointNameMap::const_iterator it = m_pointNameMap.find(symbolName); if (it == m_pointNameMap.end()) @@ -134,7 +162,48 @@ namespace yg return it->second; } - uint32_t SkinPage::find(PenInfo const & penInfo) const + uint32_t SkinPage::findGlyph(GlyphKey const & g) const + { + TGlyphMap::const_iterator it = m_glyphMap.find(g); + if (it == m_glyphMap.end()) + return m_packer.invalidHandle(); + else + return it->second; + } + + uint32_t SkinPage::mapGlyph(yg::GlyphKey const & g) + { + uint32_t foundHandle = findGlyph(g); + if (foundHandle != m_packer.invalidHandle()) + return foundHandle; + + shared_ptr gi = m_resourceManager->getGlyph(g); + + m2::Packer::handle_t handle = m_packer.pack(gi->m_width + 4, + gi->m_height + 4); + + m2::RectU texRect = m_packer.find(handle).second; + m_glyphUploadCommands.push_back(GlyphUploadCmd(gi, texRect)); + m_glyphMap[g] = handle; + + m_styles[handle] = boost::shared_ptr( + new CharStyle(texRect, + m_pageID, + gi->m_xOffset, + gi->m_yOffset, + gi->m_xAdvance)); + + return m_glyphMap[g]; + } + + bool SkinPage::hasRoom(GlyphKey const & gk) const + { + shared_ptr gi = m_resourceManager->getGlyph(gk); + return m_packer.hasRoom(gi->m_width + 4, gi->m_height + 4); + } + + + uint32_t SkinPage::findPenInfo(PenInfo const & penInfo) const { TPenInfoMap::const_iterator it = m_penInfoMap.find(penInfo); if (it == m_penInfoMap.end()) @@ -143,16 +212,16 @@ namespace yg return it->second; } - uint32_t SkinPage::Map(PenInfo const & penInfo) + uint32_t SkinPage::mapPenInfo(PenInfo const & penInfo) { - uint32_t foundHandle = find(penInfo); + uint32_t foundHandle = findPenInfo(penInfo); if (foundHandle != m_packer.invalidHandle()) return foundHandle; if (penInfo.m_isSolid) { - uint32_t colorHandle = Map(penInfo.m_color); + uint32_t colorHandle = mapColor(penInfo.m_color); m2::RectU texRect = m_packer.find(colorHandle).second; m_styles[colorHandle] = boost::shared_ptr( new LineStyle(false, @@ -209,15 +278,20 @@ namespace yg yg::Color penInfoColor = penInfo.m_color; -#ifdef OMIM_GL_ES - penInfoColor.r /= 16; - penInfoColor.g /= 16; - penInfoColor.b /= 16; - penInfoColor.a /= 16; -#endif + penInfoColor.r /= TDynamicTexture::channelScaleFactor; + penInfoColor.g /= TDynamicTexture::channelScaleFactor; + penInfoColor.b /= TDynamicTexture::channelScaleFactor; + penInfoColor.a /= TDynamicTexture::channelScaleFactor; - TDynamicTexture::pixel_t penColorTranslucent(gil::rgba8_pixel_t(penInfoColor.r, penInfoColor.g, penInfoColor.b, 0)); - TDynamicTexture::pixel_t penColor(gil::rgba8_pixel_t(penInfoColor.r, penInfoColor.g, penInfoColor.b, penInfoColor.a)); + TDynamicTexture::pixel_t penColorTranslucent; + + gil::get_color(penColorTranslucent, gil::red_t()) = penInfoColor.r; + gil::get_color(penColorTranslucent, gil::green_t()) = penInfoColor.g; + gil::get_color(penColorTranslucent, gil::blue_t()) = penInfoColor.b; + gil::get_color(penColorTranslucent, gil::alpha_t()) = 0; + + TDynamicTexture::pixel_t penColor = penColorTranslucent; + gil::get_color(penColor, gil::alpha_t()) = penInfoColor.a; /// First two and last two rows of a pattern are filled /// with a penColorTranslucent pixel for the antialiasing. @@ -273,6 +347,54 @@ namespace yg m_penUploadCommands.clear(); } + void SkinPage::uploadGlyphs() + { + for (size_t i = 0; i < m_glyphUploadCommands.size(); ++i) + { + shared_ptr const & gi = m_glyphUploadCommands[i].m_glyphInfo; + m2::RectU const & rect = m_glyphUploadCommands[i].m_rect; + + TDynamicTexture * dynTexture = static_cast(m_texture.get()); + + TDynamicTexture::view_t v = dynTexture->view(rect.SizeX(), rect.SizeY()); + + TDynamicTexture::const_view_t srcView = gil::interleaved_view( + gi->m_width, + gi->m_height, + (TDynamicTexture::pixel_t*)&gi->m_bitmap[0], + gi->m_width * sizeof(TDynamicTexture::pixel_t) + ); + + TDynamicTexture::pixel_t penColorTranslucent(0, 0, 0, 0); + + for (size_t y = 0; y < 2; ++y) + for (size_t x = 0; x < rect.SizeX(); ++x) + v(x, y) = penColorTranslucent; + + for (size_t y = rect.SizeY() - 2; y < rect.SizeY(); ++y) + for (size_t x = 0; x < rect.SizeX(); ++x) + v(x, y) = penColorTranslucent; + + for (size_t y = 2; y < rect.SizeY() - 2; ++y) + { + v(0, y) = penColorTranslucent; + v(1, y) = penColorTranslucent; + v(rect.SizeX() - 2, y) = penColorTranslucent; + v(rect.SizeX() - 1, y) = penColorTranslucent; + } + + for (size_t y = 2; y < rect.SizeY() - 2; ++y) + { + for (size_t x = 2; x < rect.SizeX() - 2; ++x) + v(x, y) = srcView(x - 2, y - 2); + } + + dynTexture->upload(&v(0, 0), rect); + } + + m_glyphUploadCommands.clear(); + } + void SkinPage::uploadColors() { for (size_t i = 0; i < m_colorUploadCommands.size(); ++i) @@ -280,12 +402,10 @@ namespace yg yg::Color c = m_colorUploadCommands[i].m_color; m2::RectU const & r = m_colorUploadCommands[i].m_rect; -#ifdef OMIM_GL_ES - c.r /= 16; - c.g /= 16; - c.b /= 16; - c.a /= 16; -#endif + c.r /= TDynamicTexture::channelScaleFactor; + c.g /= TDynamicTexture::channelScaleFactor; + c.b /= TDynamicTexture::channelScaleFactor; + c.a /= TDynamicTexture::channelScaleFactor; TDynamicTexture * dynTexture = static_cast(m_texture.get()); @@ -293,7 +413,7 @@ namespace yg for (size_t y = 0; y < r.SizeY(); ++y) for (size_t x = 0; x < r.SizeX(); ++x) - v(x, y) = TDynamicTexture::pixel_t(gil::rgba8_pixel_t(c.r, c.g, c.b, c.a)); + v(x, y) = TDynamicTexture::pixel_t(c.r, c.g, c.b, c.a); dynTexture->upload(&v(0, 0), r); } @@ -307,6 +427,7 @@ namespace yg static_cast(m_texture.get())->lock(); uploadColors(); uploadPenInfo(); + uploadGlyphs(); static_cast(m_texture.get())->unlock(); } } @@ -321,11 +442,6 @@ namespace yg return it->second.get(); } - vector const & SkinPage::fonts() const - { - return m_fonts; - } - void SkinPage::addOverflowFn(overflowFn fn, int priority) { m_packer.addOverflowFn(fn, priority); diff --git a/yg/skin_page.hpp b/yg/skin_page.hpp index 6e4e8f42d8..7df7371a55 100644 --- a/yg/skin_page.hpp +++ b/yg/skin_page.hpp @@ -10,6 +10,7 @@ #include "pen_info.hpp" #include "color.hpp" +#include "glyph_cache.hpp" namespace yg { @@ -22,6 +23,14 @@ namespace yg struct ResourceStyle; class ResourceManager; + struct GlyphUploadCmd + { + shared_ptr m_glyphInfo; + m2::RectU m_rect; + GlyphUploadCmd(shared_ptr const & glyphInfo, m2::RectU const & rect); + GlyphUploadCmd(); + }; + struct ColorUploadCmd { yg::Color m_color; @@ -41,13 +50,13 @@ namespace yg struct FontInfo { int8_t m_fontSize; - typedef map > TChars; + typedef map, shared_ptr > > TChars; TChars m_chars; - mutable ResourceStyle * m_invalidChar; - FontInfo() : m_invalidChar(0){} + mutable pair m_invalidChar; + FontInfo() : m_invalidChar(0, 0){} - ResourceStyle * fromID(uint32_t id) const; + ResourceStyle * fromID(uint32_t id, bool primaryGlyph = true) const; }; class SkinPage @@ -72,17 +81,20 @@ namespace yg typedef map TColorMap; TColorMap m_colorMap; + typedef map TGlyphMap; + TGlyphMap m_glyphMap; + m2::Packer m_packer; shared_ptr m_texture; shared_ptr m_resourceManager; vector m_colorUploadCommands; vector m_penUploadCommands; + vector m_glyphUploadCommands; void uploadPenInfo(); void uploadColors(); - - vector m_fonts; + void uploadGlyphs(); bool m_isDynamic; uint32_t m_pageID; @@ -95,6 +107,10 @@ namespace yg public: + void clearColorHandles(); + void clearPenInfoHandles(); + void clearFontHandles(); + void clearHandles(); void uploadData(); @@ -113,20 +129,22 @@ namespace yg void reserveTexture(); void freeTexture(); - uint32_t find(Color const & c) const; - uint32_t Map(Color const & c); + uint32_t findColor(Color const & c) const; + uint32_t mapColor(Color const & c); bool hasRoom(Color const & c) const; - uint32_t find(PenInfo const & penInfo) const; - uint32_t Map(PenInfo const & penInfo); + uint32_t findPenInfo(PenInfo const & penInfo) const; + uint32_t mapPenInfo(PenInfo const & penInfo); bool hasRoom(PenInfo const & penInfo) const; - uint32_t find(char const * symbolName) const; + uint32_t findGlyph(GlyphKey const & g) const; + uint32_t mapGlyph(GlyphKey const & g); + bool hasRoom(GlyphKey const & g) const; + + uint32_t findSymbol(char const * symbolName) const; ResourceStyle * fromID(uint32_t idx) const; - vector const & fonts() const; - bool isDynamic() const; void addOverflowFn(overflowFn fn, int priority); diff --git a/yg/texture.hpp b/yg/texture.hpp index 04a8eb7a71..12684ff546 100644 --- a/yg/texture.hpp +++ b/yg/texture.hpp @@ -3,6 +3,7 @@ #include "internal/opengl.hpp" #include "color.hpp" #include "managed_texture.hpp" +#include "data_formats.hpp" #include "../geometry/point2d.hpp" #include "../geometry/rect2d.hpp" #include "../std/vector.hpp" @@ -18,69 +19,6 @@ namespace yg { namespace gl { - template - struct DownsampleImpl - { - template - void operator()(Ch1 const & ch1, Ch2 & ch2) const - { - ch2 = ch1 / Denom; - } - }; - - template - struct Downsample - { - static const int Denom = 1 << (FromBig - ToSmall); - - template - void operator()(SrcP const & src, DstP & dst) const - { - static_for_each(src, dst, DownsampleImpl()); - } - }; - - struct RGBA8Traits - { - typedef gil::rgba8_pixel_t pixel_t; - typedef gil::rgba8c_pixel_t const_pixel_t; - typedef gil::rgba8_view_t view_t; - typedef gil::rgba8c_view_t const_view_t; - typedef gil::rgba8_image_t image_t; - - static const int maxChannelVal = 255; - - static const int gl_pixel_data_type = GL_UNSIGNED_BYTE; - - typedef Downsample<8, 8> color_converter; - }; - - struct RGBA4Traits - { - typedef gil::packed_pixel_type< - unsigned short, - mpl::vector4_c, - gil::abgr_layout_t - >::type pixel_t; - - typedef gil::memory_based_step_iterator iterator_t; - typedef gil::memory_based_2d_locator locator_t; - typedef gil::image_view view_t; - - typedef pixel_t const const_pixel_t; - - typedef gil::memory_based_step_iterator const_iterator_t; - typedef gil::memory_based_2d_locator const_locator_t; - typedef gil::image_view const_view_t; - - typedef gil::image image_t; - - static const int maxChannelVal = 15; - - static const int gl_pixel_data_type = GL_UNSIGNED_SHORT_4_4_4_4; - - typedef Downsample<8, 4> color_converter; - }; template class Texture{}; @@ -142,6 +80,7 @@ namespace yg typedef typename Traits::image_t image_t; static const int maxChannelVal = Traits::maxChannelVal; + static const int channelScaleFactor = Traits::channelScaleFactor; static const int gl_pixel_data_type = Traits::gl_pixel_data_type; private: diff --git a/yg/yg.pro b/yg/yg.pro index cf1689b69f..05b48935f1 100644 --- a/yg/yg.pro +++ b/yg/yg.pro @@ -6,7 +6,11 @@ CONFIG += staticlib DEFINES += YG_LIBRARY ROOT_DIR = .. -DEPENDENCIES = expat geometry coding base +DEPENDENCIES = expat geometry coding base freetype + +INCLUDEPATH += $$ROOT_DIR/3party/freetype/include + +LIBS += lfreetype include($$ROOT_DIR/common.pri) @@ -49,7 +53,8 @@ SOURCES += \ geometry_renderer.cpp \ skin_page.cpp \ storage.cpp \ - render_state_updater.cpp + render_state_updater.cpp \ + glyph_cache.cpp HEADERS += \ internal/opengl.hpp \ @@ -84,7 +89,9 @@ HEADERS += \ skin_page.hpp \ storage.hpp \ render_state_updater.hpp \ - render_target.hpp + render_target.hpp \ + glyph_cache.hpp \ + data_formats.hpp !iphonesimulator-g++42 { !iphonedevice-g++42 { diff --git a/yg/yg_tests/glyph_cache_test.cpp b/yg/yg_tests/glyph_cache_test.cpp new file mode 100644 index 0000000000..9e79084f6b --- /dev/null +++ b/yg/yg_tests/glyph_cache_test.cpp @@ -0,0 +1,14 @@ +#include "../../testing/testing.hpp" +#include "../../qt_tstfrm/macros.hpp" + +#include "../glyph_cache.hpp" + +UNIT_TEST(GlyphCacheTest_Main) +{ + yg::GlyphCache cache; + cache.addFont(GetPlatform().ReadPathForFile("dejavusans.ttf").c_str()); + shared_ptr g1 = cache.getGlyph(yg::GlyphKey('#', 40, true)); + g1->dump(GetPlatform().WritablePathForFile("#_mask.png").c_str()); + shared_ptr g2 = cache.getGlyph(yg::GlyphKey('#', 40, false)); + g2->dump(GetPlatform().WritablePathForFile("#.png").c_str()); +} diff --git a/yg/yg_tests/screengl_test.cpp b/yg/yg_tests/screengl_test.cpp index ca7175ad29..0f85cdc426 100644 --- a/yg/yg_tests/screengl_test.cpp +++ b/yg/yg_tests/screengl_test.cpp @@ -420,12 +420,12 @@ namespace double pat[2] = {2, 2}; p->drawPath(path, sizeof(path) / sizeof(m2::PointD), p->skin()->mapPenInfo(yg::PenInfo(yg::Color(0, 0, 0, 0xFF), 2, pat, 2, 0)), 0); - p->drawText(m2::PointD(200, 200), 0 , 0, "0", 0); - p->drawText(m2::PointD(240, 200), math::pi / 2 , 0, "0", 0); - p->drawText(m2::PointD(280, 200), math::pi , 0, "0", 0); - p->drawText(m2::PointD(320, 200), math::pi * 3 / 2 , 0, "0", 0); - p->drawText(m2::PointD(360, 200), math::pi / 18, 0, "0", 0); - p->drawText(m2::PointD(40, 50), math::pi / 18, 0, "Simplicity is the ultimate sophistication", 0); + p->drawText(m2::PointD(200, 200), 0 , 20, "0", 0); + p->drawText(m2::PointD(240, 200), math::pi / 2 , 20, "0", 0); + p->drawText(m2::PointD(280, 200), math::pi , 20, "0", 0); + p->drawText(m2::PointD(320, 200), math::pi * 3 / 2 , 20, "0", 0); + p->drawText(m2::PointD(360, 200), math::pi / 18, 20, "0", 0); + p->drawText(m2::PointD(40, 50), math::pi / 18, 20, "Simplicity is the ultimate sophistication", 0); } }; @@ -433,7 +433,7 @@ namespace { void DoDraw(shared_ptr p) { - p->drawText(m2::PointD(40, 50), 0, 0, "X", 1); + p->drawText(m2::PointD(40, 50), 0, 20, "X", 1); } }; @@ -446,7 +446,7 @@ namespace for (size_t i = 0; i < maxTimes; ++i) for (size_t j = 1; j <= i+1; ++j) - p->drawText(m2::PointD(40, 10 + yStep * i), math::pi / 6, 10, "Simplicity is the ultimate sophistication", 0); + p->drawText(m2::PointD(40, 10 + yStep * i), math::pi / 6, 20, "Simplicity is the ultimate sophistication", 0); } }; @@ -462,7 +462,7 @@ namespace yg::PenInfo penInfo = yg::PenInfo(yg::Color(0, 0, 0, 0xFF), 2, &pat[0], ARRAY_SIZE(pat), 0); yg::PenInfo solidPenInfo = yg::PenInfo(yg::Color(0xFF, 0, 0, 0xFF), 4, 0, 0, 0); - p->drawText(m2::PointD(40, 50), 0, 1, "S", 0); + p->drawText(m2::PointD(40, 50), 0, 20, "S", 0); p->drawPath(&path[0], path.size(), p->skin()->mapPenInfo(solidPenInfo), 0); } @@ -472,7 +472,7 @@ namespace { void DoDraw(shared_ptr p) { - p->drawText(m2::PointD(40, 50), 0/*, math::pi / 18*/, 1, "Simplicity is the ultimate sophistication", 0); + p->drawText(m2::PointD(40, 50), 0/*, math::pi / 18*/, 20, "Simplicity is the ultimate sophistication", 0); } }; @@ -505,7 +505,7 @@ namespace void DoDraw(shared_ptr p) { p->drawPath(&m_path[0], m_path.size(), p->skin()->mapPenInfo(m_penInfo), 0); - p->drawPathText(&m_path[0], m_path.size(), 1, m_text, calc_length(m_path), yg::gl::Screen::middle_line, 0); + p->drawPathText(&m_path[0], m_path.size(), 10, m_text, calc_length(m_path), yg::gl::Screen::middle_line, true, 0); } }; @@ -516,8 +516,8 @@ namespace p->drawPath(&m_path[0], m_path.size(), p->skin()->mapPenInfo(m_penInfo), 0); double const len = calc_length(m_path); - p->drawPathText(&m_path[0], m_path.size(), 1, m_text, len, yg::gl::Screen::above_line, 0); - p->drawPathText(&m_path[0], m_path.size(), 1, m_text, len, yg::gl::Screen::under_line, 0); + p->drawPathText(&m_path[0], m_path.size(), 10, m_text, len, yg::gl::Screen::above_line, true, 0); + p->drawPathText(&m_path[0], m_path.size(), 10, m_text, len, yg::gl::Screen::under_line, true, 0); } }; @@ -690,22 +690,22 @@ namespace }; // UNIT_TEST_GL(TestDrawPolyOverflow); -// UNIT_TEST_GL(TestDrawFont); -// UNIT_TEST_GL(TestDrawSingleSymbol); + UNIT_TEST_GL(TestDrawFont); +// UNIT_TEST_GL(TestDrawSingleSymbol); // UNIT_TEST_GL(TestDrawSingleSymbolAndSolidPath); -// UNIT_TEST_GL(TestDrawString); -// UNIT_TEST_GL(TestDrawStringOnString); -// UNIT_TEST_GL(TestDrawFontOnPath); -// UNIT_TEST_GL(TestDrawFontOnPathWithOffset); + UNIT_TEST_GL(TestDrawString); + UNIT_TEST_GL(TestDrawStringOnString); + UNIT_TEST_GL(TestDrawFontOnPath); + UNIT_TEST_GL(TestDrawFontOnPathWithOffset); // UNIT_TEST_GL(TestDrawSGIConvex); // UNIT_TEST_GL(TestDrawPoly); // UNIT_TEST_GL(TestDrawSolidRect); - UNIT_TEST_GL(TestDrawPathWithSkinPageMiss); +// UNIT_TEST_GL(TestDrawPathWithSkinPageMiss); // UNIT_TEST_GL(TestDrawPathWithOffset); // UNIT_TEST_GL(TestDrawPathJoin); // UNIT_TEST_GL(TestDrawPathSolid); // UNIT_TEST_GL(TestDrawPathSolidWithZ); - UNIT_TEST_GL(TestDrawPathSolidWithClipRect); +// UNIT_TEST_GL(TestDrawPathSolidWithClipRect); // UNIT_TEST_GL(TestDrawUtilsRect); // UNIT_TEST_GL(TestDrawUtilsRectFilledTexture); } diff --git a/yg/yg_tests/yg_tests.pro b/yg/yg_tests/yg_tests.pro index 508075c9c5..0e88599702 100644 --- a/yg/yg_tests/yg_tests.pro +++ b/yg/yg_tests/yg_tests.pro @@ -14,6 +14,8 @@ win32-g++ { LIBS += -lpthread -lopengl32 } +LIBS += -lfreetype + SOURCES += \ ../../testing/testingmain.cpp \ texture_test.cpp \ @@ -24,4 +26,5 @@ SOURCES += \ formats_loading_test.cpp \ thread_render.cpp \ opengl_test.cpp \ - screenglglobal_test.cpp + screenglglobal_test.cpp \ + glyph_cache_test.cpp