Merge pull request #112 from enduro2d/feature/input_event_system

Feature/input event system
This commit is contained in:
2020-02-06 16:36:36 +07:00
committed by GitHub
133 changed files with 11876 additions and 994 deletions
+6
View File
@@ -49,3 +49,9 @@
[submodule "modules/enum.hpp"]
path = modules/enum.hpp
url = https://github.com/BlackMATov/enum.hpp
[submodule "modules/pnpoly.h"]
path = modules/pnpoly.h
url = https://github.com/BlackMATov/pnpoly.h
[submodule "modules/IconFontCppHeaders"]
path = modules/IconFontCppHeaders
url = https://github.com/juliettef/IconFontCppHeaders
+2 -1
View File
@@ -244,7 +244,8 @@ target_include_directories(${PROJECT_NAME}
PUBLIC headers
PUBLIC headers/3rdparty
PUBLIC headers/3rdparty/lua
PRIVATE sources)
PRIVATE sources
PRIVATE sources/3rdparty)
target_compile_options(${PROJECT_NAME}
PRIVATE
+975
View File
@@ -0,0 +1,975 @@
// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for language C++11
// from https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/metadata/icons.yml
// for use with https://github.com/FortAwesome/Font-Awesome/blob/master/webfonts/fa-solid-900.ttf, https://github.com/FortAwesome/Font-Awesome/blob/master/webfonts/fa-regular-400.ttf,
#pragma once
#define FONT_ICON_FILE_NAME_FAR "fa-regular-400.ttf"
#define FONT_ICON_FILE_NAME_FAS "fa-solid-900.ttf"
#define ICON_MIN_FA 0xf000
#define ICON_MAX_FA 0xf941
#define ICON_FA_AD u8"\uf641"
#define ICON_FA_ADDRESS_BOOK u8"\uf2b9"
#define ICON_FA_ADDRESS_CARD u8"\uf2bb"
#define ICON_FA_ADJUST u8"\uf042"
#define ICON_FA_AIR_FRESHENER u8"\uf5d0"
#define ICON_FA_ALIGN_CENTER u8"\uf037"
#define ICON_FA_ALIGN_JUSTIFY u8"\uf039"
#define ICON_FA_ALIGN_LEFT u8"\uf036"
#define ICON_FA_ALIGN_RIGHT u8"\uf038"
#define ICON_FA_ALLERGIES u8"\uf461"
#define ICON_FA_AMBULANCE u8"\uf0f9"
#define ICON_FA_AMERICAN_SIGN_LANGUAGE_INTERPRETING u8"\uf2a3"
#define ICON_FA_ANCHOR u8"\uf13d"
#define ICON_FA_ANGLE_DOUBLE_DOWN u8"\uf103"
#define ICON_FA_ANGLE_DOUBLE_LEFT u8"\uf100"
#define ICON_FA_ANGLE_DOUBLE_RIGHT u8"\uf101"
#define ICON_FA_ANGLE_DOUBLE_UP u8"\uf102"
#define ICON_FA_ANGLE_DOWN u8"\uf107"
#define ICON_FA_ANGLE_LEFT u8"\uf104"
#define ICON_FA_ANGLE_RIGHT u8"\uf105"
#define ICON_FA_ANGLE_UP u8"\uf106"
#define ICON_FA_ANGRY u8"\uf556"
#define ICON_FA_ANKH u8"\uf644"
#define ICON_FA_APPLE_ALT u8"\uf5d1"
#define ICON_FA_ARCHIVE u8"\uf187"
#define ICON_FA_ARCHWAY u8"\uf557"
#define ICON_FA_ARROW_ALT_CIRCLE_DOWN u8"\uf358"
#define ICON_FA_ARROW_ALT_CIRCLE_LEFT u8"\uf359"
#define ICON_FA_ARROW_ALT_CIRCLE_RIGHT u8"\uf35a"
#define ICON_FA_ARROW_ALT_CIRCLE_UP u8"\uf35b"
#define ICON_FA_ARROW_CIRCLE_DOWN u8"\uf0ab"
#define ICON_FA_ARROW_CIRCLE_LEFT u8"\uf0a8"
#define ICON_FA_ARROW_CIRCLE_RIGHT u8"\uf0a9"
#define ICON_FA_ARROW_CIRCLE_UP u8"\uf0aa"
#define ICON_FA_ARROW_DOWN u8"\uf063"
#define ICON_FA_ARROW_LEFT u8"\uf060"
#define ICON_FA_ARROW_RIGHT u8"\uf061"
#define ICON_FA_ARROW_UP u8"\uf062"
#define ICON_FA_ARROWS_ALT u8"\uf0b2"
#define ICON_FA_ARROWS_ALT_H u8"\uf337"
#define ICON_FA_ARROWS_ALT_V u8"\uf338"
#define ICON_FA_ASSISTIVE_LISTENING_SYSTEMS u8"\uf2a2"
#define ICON_FA_ASTERISK u8"\uf069"
#define ICON_FA_AT u8"\uf1fa"
#define ICON_FA_ATLAS u8"\uf558"
#define ICON_FA_ATOM u8"\uf5d2"
#define ICON_FA_AUDIO_DESCRIPTION u8"\uf29e"
#define ICON_FA_AWARD u8"\uf559"
#define ICON_FA_BABY u8"\uf77c"
#define ICON_FA_BABY_CARRIAGE u8"\uf77d"
#define ICON_FA_BACKSPACE u8"\uf55a"
#define ICON_FA_BACKWARD u8"\uf04a"
#define ICON_FA_BACON u8"\uf7e5"
#define ICON_FA_BAHAI u8"\uf666"
#define ICON_FA_BALANCE_SCALE u8"\uf24e"
#define ICON_FA_BALANCE_SCALE_LEFT u8"\uf515"
#define ICON_FA_BALANCE_SCALE_RIGHT u8"\uf516"
#define ICON_FA_BAN u8"\uf05e"
#define ICON_FA_BAND_AID u8"\uf462"
#define ICON_FA_BARCODE u8"\uf02a"
#define ICON_FA_BARS u8"\uf0c9"
#define ICON_FA_BASEBALL_BALL u8"\uf433"
#define ICON_FA_BASKETBALL_BALL u8"\uf434"
#define ICON_FA_BATH u8"\uf2cd"
#define ICON_FA_BATTERY_EMPTY u8"\uf244"
#define ICON_FA_BATTERY_FULL u8"\uf240"
#define ICON_FA_BATTERY_HALF u8"\uf242"
#define ICON_FA_BATTERY_QUARTER u8"\uf243"
#define ICON_FA_BATTERY_THREE_QUARTERS u8"\uf241"
#define ICON_FA_BED u8"\uf236"
#define ICON_FA_BEER u8"\uf0fc"
#define ICON_FA_BELL u8"\uf0f3"
#define ICON_FA_BELL_SLASH u8"\uf1f6"
#define ICON_FA_BEZIER_CURVE u8"\uf55b"
#define ICON_FA_BIBLE u8"\uf647"
#define ICON_FA_BICYCLE u8"\uf206"
#define ICON_FA_BIKING u8"\uf84a"
#define ICON_FA_BINOCULARS u8"\uf1e5"
#define ICON_FA_BIOHAZARD u8"\uf780"
#define ICON_FA_BIRTHDAY_CAKE u8"\uf1fd"
#define ICON_FA_BLENDER u8"\uf517"
#define ICON_FA_BLENDER_PHONE u8"\uf6b6"
#define ICON_FA_BLIND u8"\uf29d"
#define ICON_FA_BLOG u8"\uf781"
#define ICON_FA_BOLD u8"\uf032"
#define ICON_FA_BOLT u8"\uf0e7"
#define ICON_FA_BOMB u8"\uf1e2"
#define ICON_FA_BONE u8"\uf5d7"
#define ICON_FA_BONG u8"\uf55c"
#define ICON_FA_BOOK u8"\uf02d"
#define ICON_FA_BOOK_DEAD u8"\uf6b7"
#define ICON_FA_BOOK_MEDICAL u8"\uf7e6"
#define ICON_FA_BOOK_OPEN u8"\uf518"
#define ICON_FA_BOOK_READER u8"\uf5da"
#define ICON_FA_BOOKMARK u8"\uf02e"
#define ICON_FA_BORDER_ALL u8"\uf84c"
#define ICON_FA_BORDER_NONE u8"\uf850"
#define ICON_FA_BORDER_STYLE u8"\uf853"
#define ICON_FA_BOWLING_BALL u8"\uf436"
#define ICON_FA_BOX u8"\uf466"
#define ICON_FA_BOX_OPEN u8"\uf49e"
#define ICON_FA_BOXES u8"\uf468"
#define ICON_FA_BRAILLE u8"\uf2a1"
#define ICON_FA_BRAIN u8"\uf5dc"
#define ICON_FA_BREAD_SLICE u8"\uf7ec"
#define ICON_FA_BRIEFCASE u8"\uf0b1"
#define ICON_FA_BRIEFCASE_MEDICAL u8"\uf469"
#define ICON_FA_BROADCAST_TOWER u8"\uf519"
#define ICON_FA_BROOM u8"\uf51a"
#define ICON_FA_BRUSH u8"\uf55d"
#define ICON_FA_BUG u8"\uf188"
#define ICON_FA_BUILDING u8"\uf1ad"
#define ICON_FA_BULLHORN u8"\uf0a1"
#define ICON_FA_BULLSEYE u8"\uf140"
#define ICON_FA_BURN u8"\uf46a"
#define ICON_FA_BUS u8"\uf207"
#define ICON_FA_BUS_ALT u8"\uf55e"
#define ICON_FA_BUSINESS_TIME u8"\uf64a"
#define ICON_FA_CALCULATOR u8"\uf1ec"
#define ICON_FA_CALENDAR u8"\uf133"
#define ICON_FA_CALENDAR_ALT u8"\uf073"
#define ICON_FA_CALENDAR_CHECK u8"\uf274"
#define ICON_FA_CALENDAR_DAY u8"\uf783"
#define ICON_FA_CALENDAR_MINUS u8"\uf272"
#define ICON_FA_CALENDAR_PLUS u8"\uf271"
#define ICON_FA_CALENDAR_TIMES u8"\uf273"
#define ICON_FA_CALENDAR_WEEK u8"\uf784"
#define ICON_FA_CAMERA u8"\uf030"
#define ICON_FA_CAMERA_RETRO u8"\uf083"
#define ICON_FA_CAMPGROUND u8"\uf6bb"
#define ICON_FA_CANDY_CANE u8"\uf786"
#define ICON_FA_CANNABIS u8"\uf55f"
#define ICON_FA_CAPSULES u8"\uf46b"
#define ICON_FA_CAR u8"\uf1b9"
#define ICON_FA_CAR_ALT u8"\uf5de"
#define ICON_FA_CAR_BATTERY u8"\uf5df"
#define ICON_FA_CAR_CRASH u8"\uf5e1"
#define ICON_FA_CAR_SIDE u8"\uf5e4"
#define ICON_FA_CARAVAN u8"\uf8ff"
#define ICON_FA_CARET_DOWN u8"\uf0d7"
#define ICON_FA_CARET_LEFT u8"\uf0d9"
#define ICON_FA_CARET_RIGHT u8"\uf0da"
#define ICON_FA_CARET_SQUARE_DOWN u8"\uf150"
#define ICON_FA_CARET_SQUARE_LEFT u8"\uf191"
#define ICON_FA_CARET_SQUARE_RIGHT u8"\uf152"
#define ICON_FA_CARET_SQUARE_UP u8"\uf151"
#define ICON_FA_CARET_UP u8"\uf0d8"
#define ICON_FA_CARROT u8"\uf787"
#define ICON_FA_CART_ARROW_DOWN u8"\uf218"
#define ICON_FA_CART_PLUS u8"\uf217"
#define ICON_FA_CASH_REGISTER u8"\uf788"
#define ICON_FA_CAT u8"\uf6be"
#define ICON_FA_CERTIFICATE u8"\uf0a3"
#define ICON_FA_CHAIR u8"\uf6c0"
#define ICON_FA_CHALKBOARD u8"\uf51b"
#define ICON_FA_CHALKBOARD_TEACHER u8"\uf51c"
#define ICON_FA_CHARGING_STATION u8"\uf5e7"
#define ICON_FA_CHART_AREA u8"\uf1fe"
#define ICON_FA_CHART_BAR u8"\uf080"
#define ICON_FA_CHART_LINE u8"\uf201"
#define ICON_FA_CHART_PIE u8"\uf200"
#define ICON_FA_CHECK u8"\uf00c"
#define ICON_FA_CHECK_CIRCLE u8"\uf058"
#define ICON_FA_CHECK_DOUBLE u8"\uf560"
#define ICON_FA_CHECK_SQUARE u8"\uf14a"
#define ICON_FA_CHEESE u8"\uf7ef"
#define ICON_FA_CHESS u8"\uf439"
#define ICON_FA_CHESS_BISHOP u8"\uf43a"
#define ICON_FA_CHESS_BOARD u8"\uf43c"
#define ICON_FA_CHESS_KING u8"\uf43f"
#define ICON_FA_CHESS_KNIGHT u8"\uf441"
#define ICON_FA_CHESS_PAWN u8"\uf443"
#define ICON_FA_CHESS_QUEEN u8"\uf445"
#define ICON_FA_CHESS_ROOK u8"\uf447"
#define ICON_FA_CHEVRON_CIRCLE_DOWN u8"\uf13a"
#define ICON_FA_CHEVRON_CIRCLE_LEFT u8"\uf137"
#define ICON_FA_CHEVRON_CIRCLE_RIGHT u8"\uf138"
#define ICON_FA_CHEVRON_CIRCLE_UP u8"\uf139"
#define ICON_FA_CHEVRON_DOWN u8"\uf078"
#define ICON_FA_CHEVRON_LEFT u8"\uf053"
#define ICON_FA_CHEVRON_RIGHT u8"\uf054"
#define ICON_FA_CHEVRON_UP u8"\uf077"
#define ICON_FA_CHILD u8"\uf1ae"
#define ICON_FA_CHURCH u8"\uf51d"
#define ICON_FA_CIRCLE u8"\uf111"
#define ICON_FA_CIRCLE_NOTCH u8"\uf1ce"
#define ICON_FA_CITY u8"\uf64f"
#define ICON_FA_CLINIC_MEDICAL u8"\uf7f2"
#define ICON_FA_CLIPBOARD u8"\uf328"
#define ICON_FA_CLIPBOARD_CHECK u8"\uf46c"
#define ICON_FA_CLIPBOARD_LIST u8"\uf46d"
#define ICON_FA_CLOCK u8"\uf017"
#define ICON_FA_CLONE u8"\uf24d"
#define ICON_FA_CLOSED_CAPTIONING u8"\uf20a"
#define ICON_FA_CLOUD u8"\uf0c2"
#define ICON_FA_CLOUD_DOWNLOAD_ALT u8"\uf381"
#define ICON_FA_CLOUD_MEATBALL u8"\uf73b"
#define ICON_FA_CLOUD_MOON u8"\uf6c3"
#define ICON_FA_CLOUD_MOON_RAIN u8"\uf73c"
#define ICON_FA_CLOUD_RAIN u8"\uf73d"
#define ICON_FA_CLOUD_SHOWERS_HEAVY u8"\uf740"
#define ICON_FA_CLOUD_SUN u8"\uf6c4"
#define ICON_FA_CLOUD_SUN_RAIN u8"\uf743"
#define ICON_FA_CLOUD_UPLOAD_ALT u8"\uf382"
#define ICON_FA_COCKTAIL u8"\uf561"
#define ICON_FA_CODE u8"\uf121"
#define ICON_FA_CODE_BRANCH u8"\uf126"
#define ICON_FA_COFFEE u8"\uf0f4"
#define ICON_FA_COG u8"\uf013"
#define ICON_FA_COGS u8"\uf085"
#define ICON_FA_COINS u8"\uf51e"
#define ICON_FA_COLUMNS u8"\uf0db"
#define ICON_FA_COMMENT u8"\uf075"
#define ICON_FA_COMMENT_ALT u8"\uf27a"
#define ICON_FA_COMMENT_DOLLAR u8"\uf651"
#define ICON_FA_COMMENT_DOTS u8"\uf4ad"
#define ICON_FA_COMMENT_MEDICAL u8"\uf7f5"
#define ICON_FA_COMMENT_SLASH u8"\uf4b3"
#define ICON_FA_COMMENTS u8"\uf086"
#define ICON_FA_COMMENTS_DOLLAR u8"\uf653"
#define ICON_FA_COMPACT_DISC u8"\uf51f"
#define ICON_FA_COMPASS u8"\uf14e"
#define ICON_FA_COMPRESS u8"\uf066"
#define ICON_FA_COMPRESS_ALT u8"\uf422"
#define ICON_FA_COMPRESS_ARROWS_ALT u8"\uf78c"
#define ICON_FA_CONCIERGE_BELL u8"\uf562"
#define ICON_FA_COOKIE u8"\uf563"
#define ICON_FA_COOKIE_BITE u8"\uf564"
#define ICON_FA_COPY u8"\uf0c5"
#define ICON_FA_COPYRIGHT u8"\uf1f9"
#define ICON_FA_COUCH u8"\uf4b8"
#define ICON_FA_CREDIT_CARD u8"\uf09d"
#define ICON_FA_CROP u8"\uf125"
#define ICON_FA_CROP_ALT u8"\uf565"
#define ICON_FA_CROSS u8"\uf654"
#define ICON_FA_CROSSHAIRS u8"\uf05b"
#define ICON_FA_CROW u8"\uf520"
#define ICON_FA_CROWN u8"\uf521"
#define ICON_FA_CRUTCH u8"\uf7f7"
#define ICON_FA_CUBE u8"\uf1b2"
#define ICON_FA_CUBES u8"\uf1b3"
#define ICON_FA_CUT u8"\uf0c4"
#define ICON_FA_DATABASE u8"\uf1c0"
#define ICON_FA_DEAF u8"\uf2a4"
#define ICON_FA_DEMOCRAT u8"\uf747"
#define ICON_FA_DESKTOP u8"\uf108"
#define ICON_FA_DHARMACHAKRA u8"\uf655"
#define ICON_FA_DIAGNOSES u8"\uf470"
#define ICON_FA_DICE u8"\uf522"
#define ICON_FA_DICE_D20 u8"\uf6cf"
#define ICON_FA_DICE_D6 u8"\uf6d1"
#define ICON_FA_DICE_FIVE u8"\uf523"
#define ICON_FA_DICE_FOUR u8"\uf524"
#define ICON_FA_DICE_ONE u8"\uf525"
#define ICON_FA_DICE_SIX u8"\uf526"
#define ICON_FA_DICE_THREE u8"\uf527"
#define ICON_FA_DICE_TWO u8"\uf528"
#define ICON_FA_DIGITAL_TACHOGRAPH u8"\uf566"
#define ICON_FA_DIRECTIONS u8"\uf5eb"
#define ICON_FA_DIVIDE u8"\uf529"
#define ICON_FA_DIZZY u8"\uf567"
#define ICON_FA_DNA u8"\uf471"
#define ICON_FA_DOG u8"\uf6d3"
#define ICON_FA_DOLLAR_SIGN u8"\uf155"
#define ICON_FA_DOLLY u8"\uf472"
#define ICON_FA_DOLLY_FLATBED u8"\uf474"
#define ICON_FA_DONATE u8"\uf4b9"
#define ICON_FA_DOOR_CLOSED u8"\uf52a"
#define ICON_FA_DOOR_OPEN u8"\uf52b"
#define ICON_FA_DOT_CIRCLE u8"\uf192"
#define ICON_FA_DOVE u8"\uf4ba"
#define ICON_FA_DOWNLOAD u8"\uf019"
#define ICON_FA_DRAFTING_COMPASS u8"\uf568"
#define ICON_FA_DRAGON u8"\uf6d5"
#define ICON_FA_DRAW_POLYGON u8"\uf5ee"
#define ICON_FA_DRUM u8"\uf569"
#define ICON_FA_DRUM_STEELPAN u8"\uf56a"
#define ICON_FA_DRUMSTICK_BITE u8"\uf6d7"
#define ICON_FA_DUMBBELL u8"\uf44b"
#define ICON_FA_DUMPSTER u8"\uf793"
#define ICON_FA_DUMPSTER_FIRE u8"\uf794"
#define ICON_FA_DUNGEON u8"\uf6d9"
#define ICON_FA_EDIT u8"\uf044"
#define ICON_FA_EGG u8"\uf7fb"
#define ICON_FA_EJECT u8"\uf052"
#define ICON_FA_ELLIPSIS_H u8"\uf141"
#define ICON_FA_ELLIPSIS_V u8"\uf142"
#define ICON_FA_ENVELOPE u8"\uf0e0"
#define ICON_FA_ENVELOPE_OPEN u8"\uf2b6"
#define ICON_FA_ENVELOPE_OPEN_TEXT u8"\uf658"
#define ICON_FA_ENVELOPE_SQUARE u8"\uf199"
#define ICON_FA_EQUALS u8"\uf52c"
#define ICON_FA_ERASER u8"\uf12d"
#define ICON_FA_ETHERNET u8"\uf796"
#define ICON_FA_EURO_SIGN u8"\uf153"
#define ICON_FA_EXCHANGE_ALT u8"\uf362"
#define ICON_FA_EXCLAMATION u8"\uf12a"
#define ICON_FA_EXCLAMATION_CIRCLE u8"\uf06a"
#define ICON_FA_EXCLAMATION_TRIANGLE u8"\uf071"
#define ICON_FA_EXPAND u8"\uf065"
#define ICON_FA_EXPAND_ALT u8"\uf424"
#define ICON_FA_EXPAND_ARROWS_ALT u8"\uf31e"
#define ICON_FA_EXTERNAL_LINK_ALT u8"\uf35d"
#define ICON_FA_EXTERNAL_LINK_SQUARE_ALT u8"\uf360"
#define ICON_FA_EYE u8"\uf06e"
#define ICON_FA_EYE_DROPPER u8"\uf1fb"
#define ICON_FA_EYE_SLASH u8"\uf070"
#define ICON_FA_FAN u8"\uf863"
#define ICON_FA_FAST_BACKWARD u8"\uf049"
#define ICON_FA_FAST_FORWARD u8"\uf050"
#define ICON_FA_FAX u8"\uf1ac"
#define ICON_FA_FEATHER u8"\uf52d"
#define ICON_FA_FEATHER_ALT u8"\uf56b"
#define ICON_FA_FEMALE u8"\uf182"
#define ICON_FA_FIGHTER_JET u8"\uf0fb"
#define ICON_FA_FILE u8"\uf15b"
#define ICON_FA_FILE_ALT u8"\uf15c"
#define ICON_FA_FILE_ARCHIVE u8"\uf1c6"
#define ICON_FA_FILE_AUDIO u8"\uf1c7"
#define ICON_FA_FILE_CODE u8"\uf1c9"
#define ICON_FA_FILE_CONTRACT u8"\uf56c"
#define ICON_FA_FILE_CSV u8"\uf6dd"
#define ICON_FA_FILE_DOWNLOAD u8"\uf56d"
#define ICON_FA_FILE_EXCEL u8"\uf1c3"
#define ICON_FA_FILE_EXPORT u8"\uf56e"
#define ICON_FA_FILE_IMAGE u8"\uf1c5"
#define ICON_FA_FILE_IMPORT u8"\uf56f"
#define ICON_FA_FILE_INVOICE u8"\uf570"
#define ICON_FA_FILE_INVOICE_DOLLAR u8"\uf571"
#define ICON_FA_FILE_MEDICAL u8"\uf477"
#define ICON_FA_FILE_MEDICAL_ALT u8"\uf478"
#define ICON_FA_FILE_PDF u8"\uf1c1"
#define ICON_FA_FILE_POWERPOINT u8"\uf1c4"
#define ICON_FA_FILE_PRESCRIPTION u8"\uf572"
#define ICON_FA_FILE_SIGNATURE u8"\uf573"
#define ICON_FA_FILE_UPLOAD u8"\uf574"
#define ICON_FA_FILE_VIDEO u8"\uf1c8"
#define ICON_FA_FILE_WORD u8"\uf1c2"
#define ICON_FA_FILL u8"\uf575"
#define ICON_FA_FILL_DRIP u8"\uf576"
#define ICON_FA_FILM u8"\uf008"
#define ICON_FA_FILTER u8"\uf0b0"
#define ICON_FA_FINGERPRINT u8"\uf577"
#define ICON_FA_FIRE u8"\uf06d"
#define ICON_FA_FIRE_ALT u8"\uf7e4"
#define ICON_FA_FIRE_EXTINGUISHER u8"\uf134"
#define ICON_FA_FIRST_AID u8"\uf479"
#define ICON_FA_FISH u8"\uf578"
#define ICON_FA_FIST_RAISED u8"\uf6de"
#define ICON_FA_FLAG u8"\uf024"
#define ICON_FA_FLAG_CHECKERED u8"\uf11e"
#define ICON_FA_FLAG_USA u8"\uf74d"
#define ICON_FA_FLASK u8"\uf0c3"
#define ICON_FA_FLUSHED u8"\uf579"
#define ICON_FA_FOLDER u8"\uf07b"
#define ICON_FA_FOLDER_MINUS u8"\uf65d"
#define ICON_FA_FOLDER_OPEN u8"\uf07c"
#define ICON_FA_FOLDER_PLUS u8"\uf65e"
#define ICON_FA_FONT u8"\uf031"
#define ICON_FA_FONT_AWESOME_LOGO_FULL u8"\uf4e6"
#define ICON_FA_FOOTBALL_BALL u8"\uf44e"
#define ICON_FA_FORWARD u8"\uf04e"
#define ICON_FA_FROG u8"\uf52e"
#define ICON_FA_FROWN u8"\uf119"
#define ICON_FA_FROWN_OPEN u8"\uf57a"
#define ICON_FA_FUNNEL_DOLLAR u8"\uf662"
#define ICON_FA_FUTBOL u8"\uf1e3"
#define ICON_FA_GAMEPAD u8"\uf11b"
#define ICON_FA_GAS_PUMP u8"\uf52f"
#define ICON_FA_GAVEL u8"\uf0e3"
#define ICON_FA_GEM u8"\uf3a5"
#define ICON_FA_GENDERLESS u8"\uf22d"
#define ICON_FA_GHOST u8"\uf6e2"
#define ICON_FA_GIFT u8"\uf06b"
#define ICON_FA_GIFTS u8"\uf79c"
#define ICON_FA_GLASS_CHEERS u8"\uf79f"
#define ICON_FA_GLASS_MARTINI u8"\uf000"
#define ICON_FA_GLASS_MARTINI_ALT u8"\uf57b"
#define ICON_FA_GLASS_WHISKEY u8"\uf7a0"
#define ICON_FA_GLASSES u8"\uf530"
#define ICON_FA_GLOBE u8"\uf0ac"
#define ICON_FA_GLOBE_AFRICA u8"\uf57c"
#define ICON_FA_GLOBE_AMERICAS u8"\uf57d"
#define ICON_FA_GLOBE_ASIA u8"\uf57e"
#define ICON_FA_GLOBE_EUROPE u8"\uf7a2"
#define ICON_FA_GOLF_BALL u8"\uf450"
#define ICON_FA_GOPURAM u8"\uf664"
#define ICON_FA_GRADUATION_CAP u8"\uf19d"
#define ICON_FA_GREATER_THAN u8"\uf531"
#define ICON_FA_GREATER_THAN_EQUAL u8"\uf532"
#define ICON_FA_GRIMACE u8"\uf57f"
#define ICON_FA_GRIN u8"\uf580"
#define ICON_FA_GRIN_ALT u8"\uf581"
#define ICON_FA_GRIN_BEAM u8"\uf582"
#define ICON_FA_GRIN_BEAM_SWEAT u8"\uf583"
#define ICON_FA_GRIN_HEARTS u8"\uf584"
#define ICON_FA_GRIN_SQUINT u8"\uf585"
#define ICON_FA_GRIN_SQUINT_TEARS u8"\uf586"
#define ICON_FA_GRIN_STARS u8"\uf587"
#define ICON_FA_GRIN_TEARS u8"\uf588"
#define ICON_FA_GRIN_TONGUE u8"\uf589"
#define ICON_FA_GRIN_TONGUE_SQUINT u8"\uf58a"
#define ICON_FA_GRIN_TONGUE_WINK u8"\uf58b"
#define ICON_FA_GRIN_WINK u8"\uf58c"
#define ICON_FA_GRIP_HORIZONTAL u8"\uf58d"
#define ICON_FA_GRIP_LINES u8"\uf7a4"
#define ICON_FA_GRIP_LINES_VERTICAL u8"\uf7a5"
#define ICON_FA_GRIP_VERTICAL u8"\uf58e"
#define ICON_FA_GUITAR u8"\uf7a6"
#define ICON_FA_H_SQUARE u8"\uf0fd"
#define ICON_FA_HAMBURGER u8"\uf805"
#define ICON_FA_HAMMER u8"\uf6e3"
#define ICON_FA_HAMSA u8"\uf665"
#define ICON_FA_HAND_HOLDING u8"\uf4bd"
#define ICON_FA_HAND_HOLDING_HEART u8"\uf4be"
#define ICON_FA_HAND_HOLDING_USD u8"\uf4c0"
#define ICON_FA_HAND_LIZARD u8"\uf258"
#define ICON_FA_HAND_MIDDLE_FINGER u8"\uf806"
#define ICON_FA_HAND_PAPER u8"\uf256"
#define ICON_FA_HAND_PEACE u8"\uf25b"
#define ICON_FA_HAND_POINT_DOWN u8"\uf0a7"
#define ICON_FA_HAND_POINT_LEFT u8"\uf0a5"
#define ICON_FA_HAND_POINT_RIGHT u8"\uf0a4"
#define ICON_FA_HAND_POINT_UP u8"\uf0a6"
#define ICON_FA_HAND_POINTER u8"\uf25a"
#define ICON_FA_HAND_ROCK u8"\uf255"
#define ICON_FA_HAND_SCISSORS u8"\uf257"
#define ICON_FA_HAND_SPOCK u8"\uf259"
#define ICON_FA_HANDS u8"\uf4c2"
#define ICON_FA_HANDS_HELPING u8"\uf4c4"
#define ICON_FA_HANDSHAKE u8"\uf2b5"
#define ICON_FA_HANUKIAH u8"\uf6e6"
#define ICON_FA_HARD_HAT u8"\uf807"
#define ICON_FA_HASHTAG u8"\uf292"
#define ICON_FA_HAT_COWBOY u8"\uf8c0"
#define ICON_FA_HAT_COWBOY_SIDE u8"\uf8c1"
#define ICON_FA_HAT_WIZARD u8"\uf6e8"
#define ICON_FA_HDD u8"\uf0a0"
#define ICON_FA_HEADING u8"\uf1dc"
#define ICON_FA_HEADPHONES u8"\uf025"
#define ICON_FA_HEADPHONES_ALT u8"\uf58f"
#define ICON_FA_HEADSET u8"\uf590"
#define ICON_FA_HEART u8"\uf004"
#define ICON_FA_HEART_BROKEN u8"\uf7a9"
#define ICON_FA_HEARTBEAT u8"\uf21e"
#define ICON_FA_HELICOPTER u8"\uf533"
#define ICON_FA_HIGHLIGHTER u8"\uf591"
#define ICON_FA_HIKING u8"\uf6ec"
#define ICON_FA_HIPPO u8"\uf6ed"
#define ICON_FA_HISTORY u8"\uf1da"
#define ICON_FA_HOCKEY_PUCK u8"\uf453"
#define ICON_FA_HOLLY_BERRY u8"\uf7aa"
#define ICON_FA_HOME u8"\uf015"
#define ICON_FA_HORSE u8"\uf6f0"
#define ICON_FA_HORSE_HEAD u8"\uf7ab"
#define ICON_FA_HOSPITAL u8"\uf0f8"
#define ICON_FA_HOSPITAL_ALT u8"\uf47d"
#define ICON_FA_HOSPITAL_SYMBOL u8"\uf47e"
#define ICON_FA_HOT_TUB u8"\uf593"
#define ICON_FA_HOTDOG u8"\uf80f"
#define ICON_FA_HOTEL u8"\uf594"
#define ICON_FA_HOURGLASS u8"\uf254"
#define ICON_FA_HOURGLASS_END u8"\uf253"
#define ICON_FA_HOURGLASS_HALF u8"\uf252"
#define ICON_FA_HOURGLASS_START u8"\uf251"
#define ICON_FA_HOUSE_DAMAGE u8"\uf6f1"
#define ICON_FA_HRYVNIA u8"\uf6f2"
#define ICON_FA_I_CURSOR u8"\uf246"
#define ICON_FA_ICE_CREAM u8"\uf810"
#define ICON_FA_ICICLES u8"\uf7ad"
#define ICON_FA_ICONS u8"\uf86d"
#define ICON_FA_ID_BADGE u8"\uf2c1"
#define ICON_FA_ID_CARD u8"\uf2c2"
#define ICON_FA_ID_CARD_ALT u8"\uf47f"
#define ICON_FA_IGLOO u8"\uf7ae"
#define ICON_FA_IMAGE u8"\uf03e"
#define ICON_FA_IMAGES u8"\uf302"
#define ICON_FA_INBOX u8"\uf01c"
#define ICON_FA_INDENT u8"\uf03c"
#define ICON_FA_INDUSTRY u8"\uf275"
#define ICON_FA_INFINITY u8"\uf534"
#define ICON_FA_INFO u8"\uf129"
#define ICON_FA_INFO_CIRCLE u8"\uf05a"
#define ICON_FA_ITALIC u8"\uf033"
#define ICON_FA_JEDI u8"\uf669"
#define ICON_FA_JOINT u8"\uf595"
#define ICON_FA_JOURNAL_WHILLS u8"\uf66a"
#define ICON_FA_KAABA u8"\uf66b"
#define ICON_FA_KEY u8"\uf084"
#define ICON_FA_KEYBOARD u8"\uf11c"
#define ICON_FA_KHANDA u8"\uf66d"
#define ICON_FA_KISS u8"\uf596"
#define ICON_FA_KISS_BEAM u8"\uf597"
#define ICON_FA_KISS_WINK_HEART u8"\uf598"
#define ICON_FA_KIWI_BIRD u8"\uf535"
#define ICON_FA_LANDMARK u8"\uf66f"
#define ICON_FA_LANGUAGE u8"\uf1ab"
#define ICON_FA_LAPTOP u8"\uf109"
#define ICON_FA_LAPTOP_CODE u8"\uf5fc"
#define ICON_FA_LAPTOP_MEDICAL u8"\uf812"
#define ICON_FA_LAUGH u8"\uf599"
#define ICON_FA_LAUGH_BEAM u8"\uf59a"
#define ICON_FA_LAUGH_SQUINT u8"\uf59b"
#define ICON_FA_LAUGH_WINK u8"\uf59c"
#define ICON_FA_LAYER_GROUP u8"\uf5fd"
#define ICON_FA_LEAF u8"\uf06c"
#define ICON_FA_LEMON u8"\uf094"
#define ICON_FA_LESS_THAN u8"\uf536"
#define ICON_FA_LESS_THAN_EQUAL u8"\uf537"
#define ICON_FA_LEVEL_DOWN_ALT u8"\uf3be"
#define ICON_FA_LEVEL_UP_ALT u8"\uf3bf"
#define ICON_FA_LIFE_RING u8"\uf1cd"
#define ICON_FA_LIGHTBULB u8"\uf0eb"
#define ICON_FA_LINK u8"\uf0c1"
#define ICON_FA_LIRA_SIGN u8"\uf195"
#define ICON_FA_LIST u8"\uf03a"
#define ICON_FA_LIST_ALT u8"\uf022"
#define ICON_FA_LIST_OL u8"\uf0cb"
#define ICON_FA_LIST_UL u8"\uf0ca"
#define ICON_FA_LOCATION_ARROW u8"\uf124"
#define ICON_FA_LOCK u8"\uf023"
#define ICON_FA_LOCK_OPEN u8"\uf3c1"
#define ICON_FA_LONG_ARROW_ALT_DOWN u8"\uf309"
#define ICON_FA_LONG_ARROW_ALT_LEFT u8"\uf30a"
#define ICON_FA_LONG_ARROW_ALT_RIGHT u8"\uf30b"
#define ICON_FA_LONG_ARROW_ALT_UP u8"\uf30c"
#define ICON_FA_LOW_VISION u8"\uf2a8"
#define ICON_FA_LUGGAGE_CART u8"\uf59d"
#define ICON_FA_MAGIC u8"\uf0d0"
#define ICON_FA_MAGNET u8"\uf076"
#define ICON_FA_MAIL_BULK u8"\uf674"
#define ICON_FA_MALE u8"\uf183"
#define ICON_FA_MAP u8"\uf279"
#define ICON_FA_MAP_MARKED u8"\uf59f"
#define ICON_FA_MAP_MARKED_ALT u8"\uf5a0"
#define ICON_FA_MAP_MARKER u8"\uf041"
#define ICON_FA_MAP_MARKER_ALT u8"\uf3c5"
#define ICON_FA_MAP_PIN u8"\uf276"
#define ICON_FA_MAP_SIGNS u8"\uf277"
#define ICON_FA_MARKER u8"\uf5a1"
#define ICON_FA_MARS u8"\uf222"
#define ICON_FA_MARS_DOUBLE u8"\uf227"
#define ICON_FA_MARS_STROKE u8"\uf229"
#define ICON_FA_MARS_STROKE_H u8"\uf22b"
#define ICON_FA_MARS_STROKE_V u8"\uf22a"
#define ICON_FA_MASK u8"\uf6fa"
#define ICON_FA_MEDAL u8"\uf5a2"
#define ICON_FA_MEDKIT u8"\uf0fa"
#define ICON_FA_MEH u8"\uf11a"
#define ICON_FA_MEH_BLANK u8"\uf5a4"
#define ICON_FA_MEH_ROLLING_EYES u8"\uf5a5"
#define ICON_FA_MEMORY u8"\uf538"
#define ICON_FA_MENORAH u8"\uf676"
#define ICON_FA_MERCURY u8"\uf223"
#define ICON_FA_METEOR u8"\uf753"
#define ICON_FA_MICROCHIP u8"\uf2db"
#define ICON_FA_MICROPHONE u8"\uf130"
#define ICON_FA_MICROPHONE_ALT u8"\uf3c9"
#define ICON_FA_MICROPHONE_ALT_SLASH u8"\uf539"
#define ICON_FA_MICROPHONE_SLASH u8"\uf131"
#define ICON_FA_MICROSCOPE u8"\uf610"
#define ICON_FA_MINUS u8"\uf068"
#define ICON_FA_MINUS_CIRCLE u8"\uf056"
#define ICON_FA_MINUS_SQUARE u8"\uf146"
#define ICON_FA_MITTEN u8"\uf7b5"
#define ICON_FA_MOBILE u8"\uf10b"
#define ICON_FA_MOBILE_ALT u8"\uf3cd"
#define ICON_FA_MONEY_BILL u8"\uf0d6"
#define ICON_FA_MONEY_BILL_ALT u8"\uf3d1"
#define ICON_FA_MONEY_BILL_WAVE u8"\uf53a"
#define ICON_FA_MONEY_BILL_WAVE_ALT u8"\uf53b"
#define ICON_FA_MONEY_CHECK u8"\uf53c"
#define ICON_FA_MONEY_CHECK_ALT u8"\uf53d"
#define ICON_FA_MONUMENT u8"\uf5a6"
#define ICON_FA_MOON u8"\uf186"
#define ICON_FA_MORTAR_PESTLE u8"\uf5a7"
#define ICON_FA_MOSQUE u8"\uf678"
#define ICON_FA_MOTORCYCLE u8"\uf21c"
#define ICON_FA_MOUNTAIN u8"\uf6fc"
#define ICON_FA_MOUSE u8"\uf8cc"
#define ICON_FA_MOUSE_POINTER u8"\uf245"
#define ICON_FA_MUG_HOT u8"\uf7b6"
#define ICON_FA_MUSIC u8"\uf001"
#define ICON_FA_NETWORK_WIRED u8"\uf6ff"
#define ICON_FA_NEUTER u8"\uf22c"
#define ICON_FA_NEWSPAPER u8"\uf1ea"
#define ICON_FA_NOT_EQUAL u8"\uf53e"
#define ICON_FA_NOTES_MEDICAL u8"\uf481"
#define ICON_FA_OBJECT_GROUP u8"\uf247"
#define ICON_FA_OBJECT_UNGROUP u8"\uf248"
#define ICON_FA_OIL_CAN u8"\uf613"
#define ICON_FA_OM u8"\uf679"
#define ICON_FA_OTTER u8"\uf700"
#define ICON_FA_OUTDENT u8"\uf03b"
#define ICON_FA_PAGER u8"\uf815"
#define ICON_FA_PAINT_BRUSH u8"\uf1fc"
#define ICON_FA_PAINT_ROLLER u8"\uf5aa"
#define ICON_FA_PALETTE u8"\uf53f"
#define ICON_FA_PALLET u8"\uf482"
#define ICON_FA_PAPER_PLANE u8"\uf1d8"
#define ICON_FA_PAPERCLIP u8"\uf0c6"
#define ICON_FA_PARACHUTE_BOX u8"\uf4cd"
#define ICON_FA_PARAGRAPH u8"\uf1dd"
#define ICON_FA_PARKING u8"\uf540"
#define ICON_FA_PASSPORT u8"\uf5ab"
#define ICON_FA_PASTAFARIANISM u8"\uf67b"
#define ICON_FA_PASTE u8"\uf0ea"
#define ICON_FA_PAUSE u8"\uf04c"
#define ICON_FA_PAUSE_CIRCLE u8"\uf28b"
#define ICON_FA_PAW u8"\uf1b0"
#define ICON_FA_PEACE u8"\uf67c"
#define ICON_FA_PEN u8"\uf304"
#define ICON_FA_PEN_ALT u8"\uf305"
#define ICON_FA_PEN_FANCY u8"\uf5ac"
#define ICON_FA_PEN_NIB u8"\uf5ad"
#define ICON_FA_PEN_SQUARE u8"\uf14b"
#define ICON_FA_PENCIL_ALT u8"\uf303"
#define ICON_FA_PENCIL_RULER u8"\uf5ae"
#define ICON_FA_PEOPLE_CARRY u8"\uf4ce"
#define ICON_FA_PEPPER_HOT u8"\uf816"
#define ICON_FA_PERCENT u8"\uf295"
#define ICON_FA_PERCENTAGE u8"\uf541"
#define ICON_FA_PERSON_BOOTH u8"\uf756"
#define ICON_FA_PHONE u8"\uf095"
#define ICON_FA_PHONE_ALT u8"\uf879"
#define ICON_FA_PHONE_SLASH u8"\uf3dd"
#define ICON_FA_PHONE_SQUARE u8"\uf098"
#define ICON_FA_PHONE_SQUARE_ALT u8"\uf87b"
#define ICON_FA_PHONE_VOLUME u8"\uf2a0"
#define ICON_FA_PHOTO_VIDEO u8"\uf87c"
#define ICON_FA_PIGGY_BANK u8"\uf4d3"
#define ICON_FA_PILLS u8"\uf484"
#define ICON_FA_PIZZA_SLICE u8"\uf818"
#define ICON_FA_PLACE_OF_WORSHIP u8"\uf67f"
#define ICON_FA_PLANE u8"\uf072"
#define ICON_FA_PLANE_ARRIVAL u8"\uf5af"
#define ICON_FA_PLANE_DEPARTURE u8"\uf5b0"
#define ICON_FA_PLAY u8"\uf04b"
#define ICON_FA_PLAY_CIRCLE u8"\uf144"
#define ICON_FA_PLUG u8"\uf1e6"
#define ICON_FA_PLUS u8"\uf067"
#define ICON_FA_PLUS_CIRCLE u8"\uf055"
#define ICON_FA_PLUS_SQUARE u8"\uf0fe"
#define ICON_FA_PODCAST u8"\uf2ce"
#define ICON_FA_POLL u8"\uf681"
#define ICON_FA_POLL_H u8"\uf682"
#define ICON_FA_POO u8"\uf2fe"
#define ICON_FA_POO_STORM u8"\uf75a"
#define ICON_FA_POOP u8"\uf619"
#define ICON_FA_PORTRAIT u8"\uf3e0"
#define ICON_FA_POUND_SIGN u8"\uf154"
#define ICON_FA_POWER_OFF u8"\uf011"
#define ICON_FA_PRAY u8"\uf683"
#define ICON_FA_PRAYING_HANDS u8"\uf684"
#define ICON_FA_PRESCRIPTION u8"\uf5b1"
#define ICON_FA_PRESCRIPTION_BOTTLE u8"\uf485"
#define ICON_FA_PRESCRIPTION_BOTTLE_ALT u8"\uf486"
#define ICON_FA_PRINT u8"\uf02f"
#define ICON_FA_PROCEDURES u8"\uf487"
#define ICON_FA_PROJECT_DIAGRAM u8"\uf542"
#define ICON_FA_PUZZLE_PIECE u8"\uf12e"
#define ICON_FA_QRCODE u8"\uf029"
#define ICON_FA_QUESTION u8"\uf128"
#define ICON_FA_QUESTION_CIRCLE u8"\uf059"
#define ICON_FA_QUIDDITCH u8"\uf458"
#define ICON_FA_QUOTE_LEFT u8"\uf10d"
#define ICON_FA_QUOTE_RIGHT u8"\uf10e"
#define ICON_FA_QURAN u8"\uf687"
#define ICON_FA_RADIATION u8"\uf7b9"
#define ICON_FA_RADIATION_ALT u8"\uf7ba"
#define ICON_FA_RAINBOW u8"\uf75b"
#define ICON_FA_RANDOM u8"\uf074"
#define ICON_FA_RECEIPT u8"\uf543"
#define ICON_FA_RECORD_VINYL u8"\uf8d9"
#define ICON_FA_RECYCLE u8"\uf1b8"
#define ICON_FA_REDO u8"\uf01e"
#define ICON_FA_REDO_ALT u8"\uf2f9"
#define ICON_FA_REGISTERED u8"\uf25d"
#define ICON_FA_REMOVE_FORMAT u8"\uf87d"
#define ICON_FA_REPLY u8"\uf3e5"
#define ICON_FA_REPLY_ALL u8"\uf122"
#define ICON_FA_REPUBLICAN u8"\uf75e"
#define ICON_FA_RESTROOM u8"\uf7bd"
#define ICON_FA_RETWEET u8"\uf079"
#define ICON_FA_RIBBON u8"\uf4d6"
#define ICON_FA_RING u8"\uf70b"
#define ICON_FA_ROAD u8"\uf018"
#define ICON_FA_ROBOT u8"\uf544"
#define ICON_FA_ROCKET u8"\uf135"
#define ICON_FA_ROUTE u8"\uf4d7"
#define ICON_FA_RSS u8"\uf09e"
#define ICON_FA_RSS_SQUARE u8"\uf143"
#define ICON_FA_RUBLE_SIGN u8"\uf158"
#define ICON_FA_RULER u8"\uf545"
#define ICON_FA_RULER_COMBINED u8"\uf546"
#define ICON_FA_RULER_HORIZONTAL u8"\uf547"
#define ICON_FA_RULER_VERTICAL u8"\uf548"
#define ICON_FA_RUNNING u8"\uf70c"
#define ICON_FA_RUPEE_SIGN u8"\uf156"
#define ICON_FA_SAD_CRY u8"\uf5b3"
#define ICON_FA_SAD_TEAR u8"\uf5b4"
#define ICON_FA_SATELLITE u8"\uf7bf"
#define ICON_FA_SATELLITE_DISH u8"\uf7c0"
#define ICON_FA_SAVE u8"\uf0c7"
#define ICON_FA_SCHOOL u8"\uf549"
#define ICON_FA_SCREWDRIVER u8"\uf54a"
#define ICON_FA_SCROLL u8"\uf70e"
#define ICON_FA_SD_CARD u8"\uf7c2"
#define ICON_FA_SEARCH u8"\uf002"
#define ICON_FA_SEARCH_DOLLAR u8"\uf688"
#define ICON_FA_SEARCH_LOCATION u8"\uf689"
#define ICON_FA_SEARCH_MINUS u8"\uf010"
#define ICON_FA_SEARCH_PLUS u8"\uf00e"
#define ICON_FA_SEEDLING u8"\uf4d8"
#define ICON_FA_SERVER u8"\uf233"
#define ICON_FA_SHAPES u8"\uf61f"
#define ICON_FA_SHARE u8"\uf064"
#define ICON_FA_SHARE_ALT u8"\uf1e0"
#define ICON_FA_SHARE_ALT_SQUARE u8"\uf1e1"
#define ICON_FA_SHARE_SQUARE u8"\uf14d"
#define ICON_FA_SHEKEL_SIGN u8"\uf20b"
#define ICON_FA_SHIELD_ALT u8"\uf3ed"
#define ICON_FA_SHIP u8"\uf21a"
#define ICON_FA_SHIPPING_FAST u8"\uf48b"
#define ICON_FA_SHOE_PRINTS u8"\uf54b"
#define ICON_FA_SHOPPING_BAG u8"\uf290"
#define ICON_FA_SHOPPING_BASKET u8"\uf291"
#define ICON_FA_SHOPPING_CART u8"\uf07a"
#define ICON_FA_SHOWER u8"\uf2cc"
#define ICON_FA_SHUTTLE_VAN u8"\uf5b6"
#define ICON_FA_SIGN u8"\uf4d9"
#define ICON_FA_SIGN_IN_ALT u8"\uf2f6"
#define ICON_FA_SIGN_LANGUAGE u8"\uf2a7"
#define ICON_FA_SIGN_OUT_ALT u8"\uf2f5"
#define ICON_FA_SIGNAL u8"\uf012"
#define ICON_FA_SIGNATURE u8"\uf5b7"
#define ICON_FA_SIM_CARD u8"\uf7c4"
#define ICON_FA_SITEMAP u8"\uf0e8"
#define ICON_FA_SKATING u8"\uf7c5"
#define ICON_FA_SKIING u8"\uf7c9"
#define ICON_FA_SKIING_NORDIC u8"\uf7ca"
#define ICON_FA_SKULL u8"\uf54c"
#define ICON_FA_SKULL_CROSSBONES u8"\uf714"
#define ICON_FA_SLASH u8"\uf715"
#define ICON_FA_SLEIGH u8"\uf7cc"
#define ICON_FA_SLIDERS_H u8"\uf1de"
#define ICON_FA_SMILE u8"\uf118"
#define ICON_FA_SMILE_BEAM u8"\uf5b8"
#define ICON_FA_SMILE_WINK u8"\uf4da"
#define ICON_FA_SMOG u8"\uf75f"
#define ICON_FA_SMOKING u8"\uf48d"
#define ICON_FA_SMOKING_BAN u8"\uf54d"
#define ICON_FA_SMS u8"\uf7cd"
#define ICON_FA_SNOWBOARDING u8"\uf7ce"
#define ICON_FA_SNOWFLAKE u8"\uf2dc"
#define ICON_FA_SNOWMAN u8"\uf7d0"
#define ICON_FA_SNOWPLOW u8"\uf7d2"
#define ICON_FA_SOCKS u8"\uf696"
#define ICON_FA_SOLAR_PANEL u8"\uf5ba"
#define ICON_FA_SORT u8"\uf0dc"
#define ICON_FA_SORT_ALPHA_DOWN u8"\uf15d"
#define ICON_FA_SORT_ALPHA_DOWN_ALT u8"\uf881"
#define ICON_FA_SORT_ALPHA_UP u8"\uf15e"
#define ICON_FA_SORT_ALPHA_UP_ALT u8"\uf882"
#define ICON_FA_SORT_AMOUNT_DOWN u8"\uf160"
#define ICON_FA_SORT_AMOUNT_DOWN_ALT u8"\uf884"
#define ICON_FA_SORT_AMOUNT_UP u8"\uf161"
#define ICON_FA_SORT_AMOUNT_UP_ALT u8"\uf885"
#define ICON_FA_SORT_DOWN u8"\uf0dd"
#define ICON_FA_SORT_NUMERIC_DOWN u8"\uf162"
#define ICON_FA_SORT_NUMERIC_DOWN_ALT u8"\uf886"
#define ICON_FA_SORT_NUMERIC_UP u8"\uf163"
#define ICON_FA_SORT_NUMERIC_UP_ALT u8"\uf887"
#define ICON_FA_SORT_UP u8"\uf0de"
#define ICON_FA_SPA u8"\uf5bb"
#define ICON_FA_SPACE_SHUTTLE u8"\uf197"
#define ICON_FA_SPELL_CHECK u8"\uf891"
#define ICON_FA_SPIDER u8"\uf717"
#define ICON_FA_SPINNER u8"\uf110"
#define ICON_FA_SPLOTCH u8"\uf5bc"
#define ICON_FA_SPRAY_CAN u8"\uf5bd"
#define ICON_FA_SQUARE u8"\uf0c8"
#define ICON_FA_SQUARE_FULL u8"\uf45c"
#define ICON_FA_SQUARE_ROOT_ALT u8"\uf698"
#define ICON_FA_STAMP u8"\uf5bf"
#define ICON_FA_STAR u8"\uf005"
#define ICON_FA_STAR_AND_CRESCENT u8"\uf699"
#define ICON_FA_STAR_HALF u8"\uf089"
#define ICON_FA_STAR_HALF_ALT u8"\uf5c0"
#define ICON_FA_STAR_OF_DAVID u8"\uf69a"
#define ICON_FA_STAR_OF_LIFE u8"\uf621"
#define ICON_FA_STEP_BACKWARD u8"\uf048"
#define ICON_FA_STEP_FORWARD u8"\uf051"
#define ICON_FA_STETHOSCOPE u8"\uf0f1"
#define ICON_FA_STICKY_NOTE u8"\uf249"
#define ICON_FA_STOP u8"\uf04d"
#define ICON_FA_STOP_CIRCLE u8"\uf28d"
#define ICON_FA_STOPWATCH u8"\uf2f2"
#define ICON_FA_STORE u8"\uf54e"
#define ICON_FA_STORE_ALT u8"\uf54f"
#define ICON_FA_STREAM u8"\uf550"
#define ICON_FA_STREET_VIEW u8"\uf21d"
#define ICON_FA_STRIKETHROUGH u8"\uf0cc"
#define ICON_FA_STROOPWAFEL u8"\uf551"
#define ICON_FA_SUBSCRIPT u8"\uf12c"
#define ICON_FA_SUBWAY u8"\uf239"
#define ICON_FA_SUITCASE u8"\uf0f2"
#define ICON_FA_SUITCASE_ROLLING u8"\uf5c1"
#define ICON_FA_SUN u8"\uf185"
#define ICON_FA_SUPERSCRIPT u8"\uf12b"
#define ICON_FA_SURPRISE u8"\uf5c2"
#define ICON_FA_SWATCHBOOK u8"\uf5c3"
#define ICON_FA_SWIMMER u8"\uf5c4"
#define ICON_FA_SWIMMING_POOL u8"\uf5c5"
#define ICON_FA_SYNAGOGUE u8"\uf69b"
#define ICON_FA_SYNC u8"\uf021"
#define ICON_FA_SYNC_ALT u8"\uf2f1"
#define ICON_FA_SYRINGE u8"\uf48e"
#define ICON_FA_TABLE u8"\uf0ce"
#define ICON_FA_TABLE_TENNIS u8"\uf45d"
#define ICON_FA_TABLET u8"\uf10a"
#define ICON_FA_TABLET_ALT u8"\uf3fa"
#define ICON_FA_TABLETS u8"\uf490"
#define ICON_FA_TACHOMETER_ALT u8"\uf3fd"
#define ICON_FA_TAG u8"\uf02b"
#define ICON_FA_TAGS u8"\uf02c"
#define ICON_FA_TAPE u8"\uf4db"
#define ICON_FA_TASKS u8"\uf0ae"
#define ICON_FA_TAXI u8"\uf1ba"
#define ICON_FA_TEETH u8"\uf62e"
#define ICON_FA_TEETH_OPEN u8"\uf62f"
#define ICON_FA_TEMPERATURE_HIGH u8"\uf769"
#define ICON_FA_TEMPERATURE_LOW u8"\uf76b"
#define ICON_FA_TENGE u8"\uf7d7"
#define ICON_FA_TERMINAL u8"\uf120"
#define ICON_FA_TEXT_HEIGHT u8"\uf034"
#define ICON_FA_TEXT_WIDTH u8"\uf035"
#define ICON_FA_TH u8"\uf00a"
#define ICON_FA_TH_LARGE u8"\uf009"
#define ICON_FA_TH_LIST u8"\uf00b"
#define ICON_FA_THEATER_MASKS u8"\uf630"
#define ICON_FA_THERMOMETER u8"\uf491"
#define ICON_FA_THERMOMETER_EMPTY u8"\uf2cb"
#define ICON_FA_THERMOMETER_FULL u8"\uf2c7"
#define ICON_FA_THERMOMETER_HALF u8"\uf2c9"
#define ICON_FA_THERMOMETER_QUARTER u8"\uf2ca"
#define ICON_FA_THERMOMETER_THREE_QUARTERS u8"\uf2c8"
#define ICON_FA_THUMBS_DOWN u8"\uf165"
#define ICON_FA_THUMBS_UP u8"\uf164"
#define ICON_FA_THUMBTACK u8"\uf08d"
#define ICON_FA_TICKET_ALT u8"\uf3ff"
#define ICON_FA_TIMES u8"\uf00d"
#define ICON_FA_TIMES_CIRCLE u8"\uf057"
#define ICON_FA_TINT u8"\uf043"
#define ICON_FA_TINT_SLASH u8"\uf5c7"
#define ICON_FA_TIRED u8"\uf5c8"
#define ICON_FA_TOGGLE_OFF u8"\uf204"
#define ICON_FA_TOGGLE_ON u8"\uf205"
#define ICON_FA_TOILET u8"\uf7d8"
#define ICON_FA_TOILET_PAPER u8"\uf71e"
#define ICON_FA_TOOLBOX u8"\uf552"
#define ICON_FA_TOOLS u8"\uf7d9"
#define ICON_FA_TOOTH u8"\uf5c9"
#define ICON_FA_TORAH u8"\uf6a0"
#define ICON_FA_TORII_GATE u8"\uf6a1"
#define ICON_FA_TRACTOR u8"\uf722"
#define ICON_FA_TRADEMARK u8"\uf25c"
#define ICON_FA_TRAFFIC_LIGHT u8"\uf637"
#define ICON_FA_TRAILER u8"\uf941"
#define ICON_FA_TRAIN u8"\uf238"
#define ICON_FA_TRAM u8"\uf7da"
#define ICON_FA_TRANSGENDER u8"\uf224"
#define ICON_FA_TRANSGENDER_ALT u8"\uf225"
#define ICON_FA_TRASH u8"\uf1f8"
#define ICON_FA_TRASH_ALT u8"\uf2ed"
#define ICON_FA_TRASH_RESTORE u8"\uf829"
#define ICON_FA_TRASH_RESTORE_ALT u8"\uf82a"
#define ICON_FA_TREE u8"\uf1bb"
#define ICON_FA_TROPHY u8"\uf091"
#define ICON_FA_TRUCK u8"\uf0d1"
#define ICON_FA_TRUCK_LOADING u8"\uf4de"
#define ICON_FA_TRUCK_MONSTER u8"\uf63b"
#define ICON_FA_TRUCK_MOVING u8"\uf4df"
#define ICON_FA_TRUCK_PICKUP u8"\uf63c"
#define ICON_FA_TSHIRT u8"\uf553"
#define ICON_FA_TTY u8"\uf1e4"
#define ICON_FA_TV u8"\uf26c"
#define ICON_FA_UMBRELLA u8"\uf0e9"
#define ICON_FA_UMBRELLA_BEACH u8"\uf5ca"
#define ICON_FA_UNDERLINE u8"\uf0cd"
#define ICON_FA_UNDO u8"\uf0e2"
#define ICON_FA_UNDO_ALT u8"\uf2ea"
#define ICON_FA_UNIVERSAL_ACCESS u8"\uf29a"
#define ICON_FA_UNIVERSITY u8"\uf19c"
#define ICON_FA_UNLINK u8"\uf127"
#define ICON_FA_UNLOCK u8"\uf09c"
#define ICON_FA_UNLOCK_ALT u8"\uf13e"
#define ICON_FA_UPLOAD u8"\uf093"
#define ICON_FA_USER u8"\uf007"
#define ICON_FA_USER_ALT u8"\uf406"
#define ICON_FA_USER_ALT_SLASH u8"\uf4fa"
#define ICON_FA_USER_ASTRONAUT u8"\uf4fb"
#define ICON_FA_USER_CHECK u8"\uf4fc"
#define ICON_FA_USER_CIRCLE u8"\uf2bd"
#define ICON_FA_USER_CLOCK u8"\uf4fd"
#define ICON_FA_USER_COG u8"\uf4fe"
#define ICON_FA_USER_EDIT u8"\uf4ff"
#define ICON_FA_USER_FRIENDS u8"\uf500"
#define ICON_FA_USER_GRADUATE u8"\uf501"
#define ICON_FA_USER_INJURED u8"\uf728"
#define ICON_FA_USER_LOCK u8"\uf502"
#define ICON_FA_USER_MD u8"\uf0f0"
#define ICON_FA_USER_MINUS u8"\uf503"
#define ICON_FA_USER_NINJA u8"\uf504"
#define ICON_FA_USER_NURSE u8"\uf82f"
#define ICON_FA_USER_PLUS u8"\uf234"
#define ICON_FA_USER_SECRET u8"\uf21b"
#define ICON_FA_USER_SHIELD u8"\uf505"
#define ICON_FA_USER_SLASH u8"\uf506"
#define ICON_FA_USER_TAG u8"\uf507"
#define ICON_FA_USER_TIE u8"\uf508"
#define ICON_FA_USER_TIMES u8"\uf235"
#define ICON_FA_USERS u8"\uf0c0"
#define ICON_FA_USERS_COG u8"\uf509"
#define ICON_FA_UTENSIL_SPOON u8"\uf2e5"
#define ICON_FA_UTENSILS u8"\uf2e7"
#define ICON_FA_VECTOR_SQUARE u8"\uf5cb"
#define ICON_FA_VENUS u8"\uf221"
#define ICON_FA_VENUS_DOUBLE u8"\uf226"
#define ICON_FA_VENUS_MARS u8"\uf228"
#define ICON_FA_VIAL u8"\uf492"
#define ICON_FA_VIALS u8"\uf493"
#define ICON_FA_VIDEO u8"\uf03d"
#define ICON_FA_VIDEO_SLASH u8"\uf4e2"
#define ICON_FA_VIHARA u8"\uf6a7"
#define ICON_FA_VOICEMAIL u8"\uf897"
#define ICON_FA_VOLLEYBALL_BALL u8"\uf45f"
#define ICON_FA_VOLUME_DOWN u8"\uf027"
#define ICON_FA_VOLUME_MUTE u8"\uf6a9"
#define ICON_FA_VOLUME_OFF u8"\uf026"
#define ICON_FA_VOLUME_UP u8"\uf028"
#define ICON_FA_VOTE_YEA u8"\uf772"
#define ICON_FA_VR_CARDBOARD u8"\uf729"
#define ICON_FA_WALKING u8"\uf554"
#define ICON_FA_WALLET u8"\uf555"
#define ICON_FA_WAREHOUSE u8"\uf494"
#define ICON_FA_WATER u8"\uf773"
#define ICON_FA_WAVE_SQUARE u8"\uf83e"
#define ICON_FA_WEIGHT u8"\uf496"
#define ICON_FA_WEIGHT_HANGING u8"\uf5cd"
#define ICON_FA_WHEELCHAIR u8"\uf193"
#define ICON_FA_WIFI u8"\uf1eb"
#define ICON_FA_WIND u8"\uf72e"
#define ICON_FA_WINDOW_CLOSE u8"\uf410"
#define ICON_FA_WINDOW_MAXIMIZE u8"\uf2d0"
#define ICON_FA_WINDOW_MINIMIZE u8"\uf2d1"
#define ICON_FA_WINDOW_RESTORE u8"\uf2d2"
#define ICON_FA_WINE_BOTTLE u8"\uf72f"
#define ICON_FA_WINE_GLASS u8"\uf4e3"
#define ICON_FA_WINE_GLASS_ALT u8"\uf5ce"
#define ICON_FA_WON_SIGN u8"\uf159"
#define ICON_FA_WRENCH u8"\uf0ad"
#define ICON_FA_X_RAY u8"\uf497"
#define ICON_FA_YEN_SIGN u8"\uf157"
#define ICON_FA_YIN_YANG u8"\uf6ad"
+941
View File
@@ -0,0 +1,941 @@
// Generated by https://github.com/juliettef/IconFontCppHeaders script GenerateIconFontCppHeaders.py for language C++11
// from https://raw.githubusercontent.com/google/material-design-icons/master/iconfont/codepoints
// for use with https://github.com/google/material-design-icons/blob/master/iconfont/MaterialIcons-Regular.ttf
#pragma once
#define FONT_ICON_FILE_NAME_MD "MaterialIcons-Regular.ttf"
#define ICON_MIN_MD 0xe000
#define ICON_MAX_MD 0xeb4c
#define ICON_MD_3D_ROTATION u8"\ue84d"
#define ICON_MD_AC_UNIT u8"\ueb3b"
#define ICON_MD_ACCESS_ALARM u8"\ue190"
#define ICON_MD_ACCESS_ALARMS u8"\ue191"
#define ICON_MD_ACCESS_TIME u8"\ue192"
#define ICON_MD_ACCESSIBILITY u8"\ue84e"
#define ICON_MD_ACCESSIBLE u8"\ue914"
#define ICON_MD_ACCOUNT_BALANCE u8"\ue84f"
#define ICON_MD_ACCOUNT_BALANCE_WALLET u8"\ue850"
#define ICON_MD_ACCOUNT_BOX u8"\ue851"
#define ICON_MD_ACCOUNT_CIRCLE u8"\ue853"
#define ICON_MD_ADB u8"\ue60e"
#define ICON_MD_ADD u8"\ue145"
#define ICON_MD_ADD_A_PHOTO u8"\ue439"
#define ICON_MD_ADD_ALARM u8"\ue193"
#define ICON_MD_ADD_ALERT u8"\ue003"
#define ICON_MD_ADD_BOX u8"\ue146"
#define ICON_MD_ADD_CIRCLE u8"\ue147"
#define ICON_MD_ADD_CIRCLE_OUTLINE u8"\ue148"
#define ICON_MD_ADD_LOCATION u8"\ue567"
#define ICON_MD_ADD_SHOPPING_CART u8"\ue854"
#define ICON_MD_ADD_TO_PHOTOS u8"\ue39d"
#define ICON_MD_ADD_TO_QUEUE u8"\ue05c"
#define ICON_MD_ADJUST u8"\ue39e"
#define ICON_MD_AIRLINE_SEAT_FLAT u8"\ue630"
#define ICON_MD_AIRLINE_SEAT_FLAT_ANGLED u8"\ue631"
#define ICON_MD_AIRLINE_SEAT_INDIVIDUAL_SUITE u8"\ue632"
#define ICON_MD_AIRLINE_SEAT_LEGROOM_EXTRA u8"\ue633"
#define ICON_MD_AIRLINE_SEAT_LEGROOM_NORMAL u8"\ue634"
#define ICON_MD_AIRLINE_SEAT_LEGROOM_REDUCED u8"\ue635"
#define ICON_MD_AIRLINE_SEAT_RECLINE_EXTRA u8"\ue636"
#define ICON_MD_AIRLINE_SEAT_RECLINE_NORMAL u8"\ue637"
#define ICON_MD_AIRPLANEMODE_ACTIVE u8"\ue195"
#define ICON_MD_AIRPLANEMODE_INACTIVE u8"\ue194"
#define ICON_MD_AIRPLAY u8"\ue055"
#define ICON_MD_AIRPORT_SHUTTLE u8"\ueb3c"
#define ICON_MD_ALARM u8"\ue855"
#define ICON_MD_ALARM_ADD u8"\ue856"
#define ICON_MD_ALARM_OFF u8"\ue857"
#define ICON_MD_ALARM_ON u8"\ue858"
#define ICON_MD_ALBUM u8"\ue019"
#define ICON_MD_ALL_INCLUSIVE u8"\ueb3d"
#define ICON_MD_ALL_OUT u8"\ue90b"
#define ICON_MD_ANDROID u8"\ue859"
#define ICON_MD_ANNOUNCEMENT u8"\ue85a"
#define ICON_MD_APPS u8"\ue5c3"
#define ICON_MD_ARCHIVE u8"\ue149"
#define ICON_MD_ARROW_BACK u8"\ue5c4"
#define ICON_MD_ARROW_DOWNWARD u8"\ue5db"
#define ICON_MD_ARROW_DROP_DOWN u8"\ue5c5"
#define ICON_MD_ARROW_DROP_DOWN_CIRCLE u8"\ue5c6"
#define ICON_MD_ARROW_DROP_UP u8"\ue5c7"
#define ICON_MD_ARROW_FORWARD u8"\ue5c8"
#define ICON_MD_ARROW_UPWARD u8"\ue5d8"
#define ICON_MD_ART_TRACK u8"\ue060"
#define ICON_MD_ASPECT_RATIO u8"\ue85b"
#define ICON_MD_ASSESSMENT u8"\ue85c"
#define ICON_MD_ASSIGNMENT u8"\ue85d"
#define ICON_MD_ASSIGNMENT_IND u8"\ue85e"
#define ICON_MD_ASSIGNMENT_LATE u8"\ue85f"
#define ICON_MD_ASSIGNMENT_RETURN u8"\ue860"
#define ICON_MD_ASSIGNMENT_RETURNED u8"\ue861"
#define ICON_MD_ASSIGNMENT_TURNED_IN u8"\ue862"
#define ICON_MD_ASSISTANT u8"\ue39f"
#define ICON_MD_ASSISTANT_PHOTO u8"\ue3a0"
#define ICON_MD_ATTACH_FILE u8"\ue226"
#define ICON_MD_ATTACH_MONEY u8"\ue227"
#define ICON_MD_ATTACHMENT u8"\ue2bc"
#define ICON_MD_AUDIOTRACK u8"\ue3a1"
#define ICON_MD_AUTORENEW u8"\ue863"
#define ICON_MD_AV_TIMER u8"\ue01b"
#define ICON_MD_BACKSPACE u8"\ue14a"
#define ICON_MD_BACKUP u8"\ue864"
#define ICON_MD_BATTERY_ALERT u8"\ue19c"
#define ICON_MD_BATTERY_CHARGING_FULL u8"\ue1a3"
#define ICON_MD_BATTERY_FULL u8"\ue1a4"
#define ICON_MD_BATTERY_STD u8"\ue1a5"
#define ICON_MD_BATTERY_UNKNOWN u8"\ue1a6"
#define ICON_MD_BEACH_ACCESS u8"\ueb3e"
#define ICON_MD_BEENHERE u8"\ue52d"
#define ICON_MD_BLOCK u8"\ue14b"
#define ICON_MD_BLUETOOTH u8"\ue1a7"
#define ICON_MD_BLUETOOTH_AUDIO u8"\ue60f"
#define ICON_MD_BLUETOOTH_CONNECTED u8"\ue1a8"
#define ICON_MD_BLUETOOTH_DISABLED u8"\ue1a9"
#define ICON_MD_BLUETOOTH_SEARCHING u8"\ue1aa"
#define ICON_MD_BLUR_CIRCULAR u8"\ue3a2"
#define ICON_MD_BLUR_LINEAR u8"\ue3a3"
#define ICON_MD_BLUR_OFF u8"\ue3a4"
#define ICON_MD_BLUR_ON u8"\ue3a5"
#define ICON_MD_BOOK u8"\ue865"
#define ICON_MD_BOOKMARK u8"\ue866"
#define ICON_MD_BOOKMARK_BORDER u8"\ue867"
#define ICON_MD_BORDER_ALL u8"\ue228"
#define ICON_MD_BORDER_BOTTOM u8"\ue229"
#define ICON_MD_BORDER_CLEAR u8"\ue22a"
#define ICON_MD_BORDER_COLOR u8"\ue22b"
#define ICON_MD_BORDER_HORIZONTAL u8"\ue22c"
#define ICON_MD_BORDER_INNER u8"\ue22d"
#define ICON_MD_BORDER_LEFT u8"\ue22e"
#define ICON_MD_BORDER_OUTER u8"\ue22f"
#define ICON_MD_BORDER_RIGHT u8"\ue230"
#define ICON_MD_BORDER_STYLE u8"\ue231"
#define ICON_MD_BORDER_TOP u8"\ue232"
#define ICON_MD_BORDER_VERTICAL u8"\ue233"
#define ICON_MD_BRANDING_WATERMARK u8"\ue06b"
#define ICON_MD_BRIGHTNESS_1 u8"\ue3a6"
#define ICON_MD_BRIGHTNESS_2 u8"\ue3a7"
#define ICON_MD_BRIGHTNESS_3 u8"\ue3a8"
#define ICON_MD_BRIGHTNESS_4 u8"\ue3a9"
#define ICON_MD_BRIGHTNESS_5 u8"\ue3aa"
#define ICON_MD_BRIGHTNESS_6 u8"\ue3ab"
#define ICON_MD_BRIGHTNESS_7 u8"\ue3ac"
#define ICON_MD_BRIGHTNESS_AUTO u8"\ue1ab"
#define ICON_MD_BRIGHTNESS_HIGH u8"\ue1ac"
#define ICON_MD_BRIGHTNESS_LOW u8"\ue1ad"
#define ICON_MD_BRIGHTNESS_MEDIUM u8"\ue1ae"
#define ICON_MD_BROKEN_IMAGE u8"\ue3ad"
#define ICON_MD_BRUSH u8"\ue3ae"
#define ICON_MD_BUBBLE_CHART u8"\ue6dd"
#define ICON_MD_BUG_REPORT u8"\ue868"
#define ICON_MD_BUILD u8"\ue869"
#define ICON_MD_BURST_MODE u8"\ue43c"
#define ICON_MD_BUSINESS u8"\ue0af"
#define ICON_MD_BUSINESS_CENTER u8"\ueb3f"
#define ICON_MD_CACHED u8"\ue86a"
#define ICON_MD_CAKE u8"\ue7e9"
#define ICON_MD_CALL u8"\ue0b0"
#define ICON_MD_CALL_END u8"\ue0b1"
#define ICON_MD_CALL_MADE u8"\ue0b2"
#define ICON_MD_CALL_MERGE u8"\ue0b3"
#define ICON_MD_CALL_MISSED u8"\ue0b4"
#define ICON_MD_CALL_MISSED_OUTGOING u8"\ue0e4"
#define ICON_MD_CALL_RECEIVED u8"\ue0b5"
#define ICON_MD_CALL_SPLIT u8"\ue0b6"
#define ICON_MD_CALL_TO_ACTION u8"\ue06c"
#define ICON_MD_CAMERA u8"\ue3af"
#define ICON_MD_CAMERA_ALT u8"\ue3b0"
#define ICON_MD_CAMERA_ENHANCE u8"\ue8fc"
#define ICON_MD_CAMERA_FRONT u8"\ue3b1"
#define ICON_MD_CAMERA_REAR u8"\ue3b2"
#define ICON_MD_CAMERA_ROLL u8"\ue3b3"
#define ICON_MD_CANCEL u8"\ue5c9"
#define ICON_MD_CARD_GIFTCARD u8"\ue8f6"
#define ICON_MD_CARD_MEMBERSHIP u8"\ue8f7"
#define ICON_MD_CARD_TRAVEL u8"\ue8f8"
#define ICON_MD_CASINO u8"\ueb40"
#define ICON_MD_CAST u8"\ue307"
#define ICON_MD_CAST_CONNECTED u8"\ue308"
#define ICON_MD_CENTER_FOCUS_STRONG u8"\ue3b4"
#define ICON_MD_CENTER_FOCUS_WEAK u8"\ue3b5"
#define ICON_MD_CHANGE_HISTORY u8"\ue86b"
#define ICON_MD_CHAT u8"\ue0b7"
#define ICON_MD_CHAT_BUBBLE u8"\ue0ca"
#define ICON_MD_CHAT_BUBBLE_OUTLINE u8"\ue0cb"
#define ICON_MD_CHECK u8"\ue5ca"
#define ICON_MD_CHECK_BOX u8"\ue834"
#define ICON_MD_CHECK_BOX_OUTLINE_BLANK u8"\ue835"
#define ICON_MD_CHECK_CIRCLE u8"\ue86c"
#define ICON_MD_CHEVRON_LEFT u8"\ue5cb"
#define ICON_MD_CHEVRON_RIGHT u8"\ue5cc"
#define ICON_MD_CHILD_CARE u8"\ueb41"
#define ICON_MD_CHILD_FRIENDLY u8"\ueb42"
#define ICON_MD_CHROME_READER_MODE u8"\ue86d"
#define ICON_MD_CLASS u8"\ue86e"
#define ICON_MD_CLEAR u8"\ue14c"
#define ICON_MD_CLEAR_ALL u8"\ue0b8"
#define ICON_MD_CLOSE u8"\ue5cd"
#define ICON_MD_CLOSED_CAPTION u8"\ue01c"
#define ICON_MD_CLOUD u8"\ue2bd"
#define ICON_MD_CLOUD_CIRCLE u8"\ue2be"
#define ICON_MD_CLOUD_DONE u8"\ue2bf"
#define ICON_MD_CLOUD_DOWNLOAD u8"\ue2c0"
#define ICON_MD_CLOUD_OFF u8"\ue2c1"
#define ICON_MD_CLOUD_QUEUE u8"\ue2c2"
#define ICON_MD_CLOUD_UPLOAD u8"\ue2c3"
#define ICON_MD_CODE u8"\ue86f"
#define ICON_MD_COLLECTIONS u8"\ue3b6"
#define ICON_MD_COLLECTIONS_BOOKMARK u8"\ue431"
#define ICON_MD_COLOR_LENS u8"\ue3b7"
#define ICON_MD_COLORIZE u8"\ue3b8"
#define ICON_MD_COMMENT u8"\ue0b9"
#define ICON_MD_COMPARE u8"\ue3b9"
#define ICON_MD_COMPARE_ARROWS u8"\ue915"
#define ICON_MD_COMPUTER u8"\ue30a"
#define ICON_MD_CONFIRMATION_NUMBER u8"\ue638"
#define ICON_MD_CONTACT_MAIL u8"\ue0d0"
#define ICON_MD_CONTACT_PHONE u8"\ue0cf"
#define ICON_MD_CONTACTS u8"\ue0ba"
#define ICON_MD_CONTENT_COPY u8"\ue14d"
#define ICON_MD_CONTENT_CUT u8"\ue14e"
#define ICON_MD_CONTENT_PASTE u8"\ue14f"
#define ICON_MD_CONTROL_POINT u8"\ue3ba"
#define ICON_MD_CONTROL_POINT_DUPLICATE u8"\ue3bb"
#define ICON_MD_COPYRIGHT u8"\ue90c"
#define ICON_MD_CREATE u8"\ue150"
#define ICON_MD_CREATE_NEW_FOLDER u8"\ue2cc"
#define ICON_MD_CREDIT_CARD u8"\ue870"
#define ICON_MD_CROP u8"\ue3be"
#define ICON_MD_CROP_16_9 u8"\ue3bc"
#define ICON_MD_CROP_3_2 u8"\ue3bd"
#define ICON_MD_CROP_5_4 u8"\ue3bf"
#define ICON_MD_CROP_7_5 u8"\ue3c0"
#define ICON_MD_CROP_DIN u8"\ue3c1"
#define ICON_MD_CROP_FREE u8"\ue3c2"
#define ICON_MD_CROP_LANDSCAPE u8"\ue3c3"
#define ICON_MD_CROP_ORIGINAL u8"\ue3c4"
#define ICON_MD_CROP_PORTRAIT u8"\ue3c5"
#define ICON_MD_CROP_ROTATE u8"\ue437"
#define ICON_MD_CROP_SQUARE u8"\ue3c6"
#define ICON_MD_DASHBOARD u8"\ue871"
#define ICON_MD_DATA_USAGE u8"\ue1af"
#define ICON_MD_DATE_RANGE u8"\ue916"
#define ICON_MD_DEHAZE u8"\ue3c7"
#define ICON_MD_DELETE u8"\ue872"
#define ICON_MD_DELETE_FOREVER u8"\ue92b"
#define ICON_MD_DELETE_SWEEP u8"\ue16c"
#define ICON_MD_DESCRIPTION u8"\ue873"
#define ICON_MD_DESKTOP_MAC u8"\ue30b"
#define ICON_MD_DESKTOP_WINDOWS u8"\ue30c"
#define ICON_MD_DETAILS u8"\ue3c8"
#define ICON_MD_DEVELOPER_BOARD u8"\ue30d"
#define ICON_MD_DEVELOPER_MODE u8"\ue1b0"
#define ICON_MD_DEVICE_HUB u8"\ue335"
#define ICON_MD_DEVICES u8"\ue1b1"
#define ICON_MD_DEVICES_OTHER u8"\ue337"
#define ICON_MD_DIALER_SIP u8"\ue0bb"
#define ICON_MD_DIALPAD u8"\ue0bc"
#define ICON_MD_DIRECTIONS u8"\ue52e"
#define ICON_MD_DIRECTIONS_BIKE u8"\ue52f"
#define ICON_MD_DIRECTIONS_BOAT u8"\ue532"
#define ICON_MD_DIRECTIONS_BUS u8"\ue530"
#define ICON_MD_DIRECTIONS_CAR u8"\ue531"
#define ICON_MD_DIRECTIONS_RAILWAY u8"\ue534"
#define ICON_MD_DIRECTIONS_RUN u8"\ue566"
#define ICON_MD_DIRECTIONS_SUBWAY u8"\ue533"
#define ICON_MD_DIRECTIONS_TRANSIT u8"\ue535"
#define ICON_MD_DIRECTIONS_WALK u8"\ue536"
#define ICON_MD_DISC_FULL u8"\ue610"
#define ICON_MD_DNS u8"\ue875"
#define ICON_MD_DO_NOT_DISTURB u8"\ue612"
#define ICON_MD_DO_NOT_DISTURB_ALT u8"\ue611"
#define ICON_MD_DO_NOT_DISTURB_OFF u8"\ue643"
#define ICON_MD_DO_NOT_DISTURB_ON u8"\ue644"
#define ICON_MD_DOCK u8"\ue30e"
#define ICON_MD_DOMAIN u8"\ue7ee"
#define ICON_MD_DONE u8"\ue876"
#define ICON_MD_DONE_ALL u8"\ue877"
#define ICON_MD_DONUT_LARGE u8"\ue917"
#define ICON_MD_DONUT_SMALL u8"\ue918"
#define ICON_MD_DRAFTS u8"\ue151"
#define ICON_MD_DRAG_HANDLE u8"\ue25d"
#define ICON_MD_DRIVE_ETA u8"\ue613"
#define ICON_MD_DVR u8"\ue1b2"
#define ICON_MD_EDIT u8"\ue3c9"
#define ICON_MD_EDIT_LOCATION u8"\ue568"
#define ICON_MD_EJECT u8"\ue8fb"
#define ICON_MD_EMAIL u8"\ue0be"
#define ICON_MD_ENHANCED_ENCRYPTION u8"\ue63f"
#define ICON_MD_EQUALIZER u8"\ue01d"
#define ICON_MD_ERROR u8"\ue000"
#define ICON_MD_ERROR_OUTLINE u8"\ue001"
#define ICON_MD_EURO_SYMBOL u8"\ue926"
#define ICON_MD_EV_STATION u8"\ue56d"
#define ICON_MD_EVENT u8"\ue878"
#define ICON_MD_EVENT_AVAILABLE u8"\ue614"
#define ICON_MD_EVENT_BUSY u8"\ue615"
#define ICON_MD_EVENT_NOTE u8"\ue616"
#define ICON_MD_EVENT_SEAT u8"\ue903"
#define ICON_MD_EXIT_TO_APP u8"\ue879"
#define ICON_MD_EXPAND_LESS u8"\ue5ce"
#define ICON_MD_EXPAND_MORE u8"\ue5cf"
#define ICON_MD_EXPLICIT u8"\ue01e"
#define ICON_MD_EXPLORE u8"\ue87a"
#define ICON_MD_EXPOSURE u8"\ue3ca"
#define ICON_MD_EXPOSURE_NEG_1 u8"\ue3cb"
#define ICON_MD_EXPOSURE_NEG_2 u8"\ue3cc"
#define ICON_MD_EXPOSURE_PLUS_1 u8"\ue3cd"
#define ICON_MD_EXPOSURE_PLUS_2 u8"\ue3ce"
#define ICON_MD_EXPOSURE_ZERO u8"\ue3cf"
#define ICON_MD_EXTENSION u8"\ue87b"
#define ICON_MD_FACE u8"\ue87c"
#define ICON_MD_FAST_FORWARD u8"\ue01f"
#define ICON_MD_FAST_REWIND u8"\ue020"
#define ICON_MD_FAVORITE u8"\ue87d"
#define ICON_MD_FAVORITE_BORDER u8"\ue87e"
#define ICON_MD_FEATURED_PLAY_LIST u8"\ue06d"
#define ICON_MD_FEATURED_VIDEO u8"\ue06e"
#define ICON_MD_FEEDBACK u8"\ue87f"
#define ICON_MD_FIBER_DVR u8"\ue05d"
#define ICON_MD_FIBER_MANUAL_RECORD u8"\ue061"
#define ICON_MD_FIBER_NEW u8"\ue05e"
#define ICON_MD_FIBER_PIN u8"\ue06a"
#define ICON_MD_FIBER_SMART_RECORD u8"\ue062"
#define ICON_MD_FILE_DOWNLOAD u8"\ue2c4"
#define ICON_MD_FILE_UPLOAD u8"\ue2c6"
#define ICON_MD_FILTER u8"\ue3d3"
#define ICON_MD_FILTER_1 u8"\ue3d0"
#define ICON_MD_FILTER_2 u8"\ue3d1"
#define ICON_MD_FILTER_3 u8"\ue3d2"
#define ICON_MD_FILTER_4 u8"\ue3d4"
#define ICON_MD_FILTER_5 u8"\ue3d5"
#define ICON_MD_FILTER_6 u8"\ue3d6"
#define ICON_MD_FILTER_7 u8"\ue3d7"
#define ICON_MD_FILTER_8 u8"\ue3d8"
#define ICON_MD_FILTER_9 u8"\ue3d9"
#define ICON_MD_FILTER_9_PLUS u8"\ue3da"
#define ICON_MD_FILTER_B_AND_W u8"\ue3db"
#define ICON_MD_FILTER_CENTER_FOCUS u8"\ue3dc"
#define ICON_MD_FILTER_DRAMA u8"\ue3dd"
#define ICON_MD_FILTER_FRAMES u8"\ue3de"
#define ICON_MD_FILTER_HDR u8"\ue3df"
#define ICON_MD_FILTER_LIST u8"\ue152"
#define ICON_MD_FILTER_NONE u8"\ue3e0"
#define ICON_MD_FILTER_TILT_SHIFT u8"\ue3e2"
#define ICON_MD_FILTER_VINTAGE u8"\ue3e3"
#define ICON_MD_FIND_IN_PAGE u8"\ue880"
#define ICON_MD_FIND_REPLACE u8"\ue881"
#define ICON_MD_FINGERPRINT u8"\ue90d"
#define ICON_MD_FIRST_PAGE u8"\ue5dc"
#define ICON_MD_FITNESS_CENTER u8"\ueb43"
#define ICON_MD_FLAG u8"\ue153"
#define ICON_MD_FLARE u8"\ue3e4"
#define ICON_MD_FLASH_AUTO u8"\ue3e5"
#define ICON_MD_FLASH_OFF u8"\ue3e6"
#define ICON_MD_FLASH_ON u8"\ue3e7"
#define ICON_MD_FLIGHT u8"\ue539"
#define ICON_MD_FLIGHT_LAND u8"\ue904"
#define ICON_MD_FLIGHT_TAKEOFF u8"\ue905"
#define ICON_MD_FLIP u8"\ue3e8"
#define ICON_MD_FLIP_TO_BACK u8"\ue882"
#define ICON_MD_FLIP_TO_FRONT u8"\ue883"
#define ICON_MD_FOLDER u8"\ue2c7"
#define ICON_MD_FOLDER_OPEN u8"\ue2c8"
#define ICON_MD_FOLDER_SHARED u8"\ue2c9"
#define ICON_MD_FOLDER_SPECIAL u8"\ue617"
#define ICON_MD_FONT_DOWNLOAD u8"\ue167"
#define ICON_MD_FORMAT_ALIGN_CENTER u8"\ue234"
#define ICON_MD_FORMAT_ALIGN_JUSTIFY u8"\ue235"
#define ICON_MD_FORMAT_ALIGN_LEFT u8"\ue236"
#define ICON_MD_FORMAT_ALIGN_RIGHT u8"\ue237"
#define ICON_MD_FORMAT_BOLD u8"\ue238"
#define ICON_MD_FORMAT_CLEAR u8"\ue239"
#define ICON_MD_FORMAT_COLOR_FILL u8"\ue23a"
#define ICON_MD_FORMAT_COLOR_RESET u8"\ue23b"
#define ICON_MD_FORMAT_COLOR_TEXT u8"\ue23c"
#define ICON_MD_FORMAT_INDENT_DECREASE u8"\ue23d"
#define ICON_MD_FORMAT_INDENT_INCREASE u8"\ue23e"
#define ICON_MD_FORMAT_ITALIC u8"\ue23f"
#define ICON_MD_FORMAT_LINE_SPACING u8"\ue240"
#define ICON_MD_FORMAT_LIST_BULLETED u8"\ue241"
#define ICON_MD_FORMAT_LIST_NUMBERED u8"\ue242"
#define ICON_MD_FORMAT_PAINT u8"\ue243"
#define ICON_MD_FORMAT_QUOTE u8"\ue244"
#define ICON_MD_FORMAT_SHAPES u8"\ue25e"
#define ICON_MD_FORMAT_SIZE u8"\ue245"
#define ICON_MD_FORMAT_STRIKETHROUGH u8"\ue246"
#define ICON_MD_FORMAT_TEXTDIRECTION_L_TO_R u8"\ue247"
#define ICON_MD_FORMAT_TEXTDIRECTION_R_TO_L u8"\ue248"
#define ICON_MD_FORMAT_UNDERLINED u8"\ue249"
#define ICON_MD_FORUM u8"\ue0bf"
#define ICON_MD_FORWARD u8"\ue154"
#define ICON_MD_FORWARD_10 u8"\ue056"
#define ICON_MD_FORWARD_30 u8"\ue057"
#define ICON_MD_FORWARD_5 u8"\ue058"
#define ICON_MD_FREE_BREAKFAST u8"\ueb44"
#define ICON_MD_FULLSCREEN u8"\ue5d0"
#define ICON_MD_FULLSCREEN_EXIT u8"\ue5d1"
#define ICON_MD_FUNCTIONS u8"\ue24a"
#define ICON_MD_G_TRANSLATE u8"\ue927"
#define ICON_MD_GAMEPAD u8"\ue30f"
#define ICON_MD_GAMES u8"\ue021"
#define ICON_MD_GAVEL u8"\ue90e"
#define ICON_MD_GESTURE u8"\ue155"
#define ICON_MD_GET_APP u8"\ue884"
#define ICON_MD_GIF u8"\ue908"
#define ICON_MD_GOLF_COURSE u8"\ueb45"
#define ICON_MD_GPS_FIXED u8"\ue1b3"
#define ICON_MD_GPS_NOT_FIXED u8"\ue1b4"
#define ICON_MD_GPS_OFF u8"\ue1b5"
#define ICON_MD_GRADE u8"\ue885"
#define ICON_MD_GRADIENT u8"\ue3e9"
#define ICON_MD_GRAIN u8"\ue3ea"
#define ICON_MD_GRAPHIC_EQ u8"\ue1b8"
#define ICON_MD_GRID_OFF u8"\ue3eb"
#define ICON_MD_GRID_ON u8"\ue3ec"
#define ICON_MD_GROUP u8"\ue7ef"
#define ICON_MD_GROUP_ADD u8"\ue7f0"
#define ICON_MD_GROUP_WORK u8"\ue886"
#define ICON_MD_HD u8"\ue052"
#define ICON_MD_HDR_OFF u8"\ue3ed"
#define ICON_MD_HDR_ON u8"\ue3ee"
#define ICON_MD_HDR_STRONG u8"\ue3f1"
#define ICON_MD_HDR_WEAK u8"\ue3f2"
#define ICON_MD_HEADSET u8"\ue310"
#define ICON_MD_HEADSET_MIC u8"\ue311"
#define ICON_MD_HEALING u8"\ue3f3"
#define ICON_MD_HEARING u8"\ue023"
#define ICON_MD_HELP u8"\ue887"
#define ICON_MD_HELP_OUTLINE u8"\ue8fd"
#define ICON_MD_HIGH_QUALITY u8"\ue024"
#define ICON_MD_HIGHLIGHT u8"\ue25f"
#define ICON_MD_HIGHLIGHT_OFF u8"\ue888"
#define ICON_MD_HISTORY u8"\ue889"
#define ICON_MD_HOME u8"\ue88a"
#define ICON_MD_HOT_TUB u8"\ueb46"
#define ICON_MD_HOTEL u8"\ue53a"
#define ICON_MD_HOURGLASS_EMPTY u8"\ue88b"
#define ICON_MD_HOURGLASS_FULL u8"\ue88c"
#define ICON_MD_HTTP u8"\ue902"
#define ICON_MD_HTTPS u8"\ue88d"
#define ICON_MD_IMAGE u8"\ue3f4"
#define ICON_MD_IMAGE_ASPECT_RATIO u8"\ue3f5"
#define ICON_MD_IMPORT_CONTACTS u8"\ue0e0"
#define ICON_MD_IMPORT_EXPORT u8"\ue0c3"
#define ICON_MD_IMPORTANT_DEVICES u8"\ue912"
#define ICON_MD_INBOX u8"\ue156"
#define ICON_MD_INDETERMINATE_CHECK_BOX u8"\ue909"
#define ICON_MD_INFO u8"\ue88e"
#define ICON_MD_INFO_OUTLINE u8"\ue88f"
#define ICON_MD_INPUT u8"\ue890"
#define ICON_MD_INSERT_CHART u8"\ue24b"
#define ICON_MD_INSERT_COMMENT u8"\ue24c"
#define ICON_MD_INSERT_DRIVE_FILE u8"\ue24d"
#define ICON_MD_INSERT_EMOTICON u8"\ue24e"
#define ICON_MD_INSERT_INVITATION u8"\ue24f"
#define ICON_MD_INSERT_LINK u8"\ue250"
#define ICON_MD_INSERT_PHOTO u8"\ue251"
#define ICON_MD_INVERT_COLORS u8"\ue891"
#define ICON_MD_INVERT_COLORS_OFF u8"\ue0c4"
#define ICON_MD_ISO u8"\ue3f6"
#define ICON_MD_KEYBOARD u8"\ue312"
#define ICON_MD_KEYBOARD_ARROW_DOWN u8"\ue313"
#define ICON_MD_KEYBOARD_ARROW_LEFT u8"\ue314"
#define ICON_MD_KEYBOARD_ARROW_RIGHT u8"\ue315"
#define ICON_MD_KEYBOARD_ARROW_UP u8"\ue316"
#define ICON_MD_KEYBOARD_BACKSPACE u8"\ue317"
#define ICON_MD_KEYBOARD_CAPSLOCK u8"\ue318"
#define ICON_MD_KEYBOARD_HIDE u8"\ue31a"
#define ICON_MD_KEYBOARD_RETURN u8"\ue31b"
#define ICON_MD_KEYBOARD_TAB u8"\ue31c"
#define ICON_MD_KEYBOARD_VOICE u8"\ue31d"
#define ICON_MD_KITCHEN u8"\ueb47"
#define ICON_MD_LABEL u8"\ue892"
#define ICON_MD_LABEL_OUTLINE u8"\ue893"
#define ICON_MD_LANDSCAPE u8"\ue3f7"
#define ICON_MD_LANGUAGE u8"\ue894"
#define ICON_MD_LAPTOP u8"\ue31e"
#define ICON_MD_LAPTOP_CHROMEBOOK u8"\ue31f"
#define ICON_MD_LAPTOP_MAC u8"\ue320"
#define ICON_MD_LAPTOP_WINDOWS u8"\ue321"
#define ICON_MD_LAST_PAGE u8"\ue5dd"
#define ICON_MD_LAUNCH u8"\ue895"
#define ICON_MD_LAYERS u8"\ue53b"
#define ICON_MD_LAYERS_CLEAR u8"\ue53c"
#define ICON_MD_LEAK_ADD u8"\ue3f8"
#define ICON_MD_LEAK_REMOVE u8"\ue3f9"
#define ICON_MD_LENS u8"\ue3fa"
#define ICON_MD_LIBRARY_ADD u8"\ue02e"
#define ICON_MD_LIBRARY_BOOKS u8"\ue02f"
#define ICON_MD_LIBRARY_MUSIC u8"\ue030"
#define ICON_MD_LIGHTBULB_OUTLINE u8"\ue90f"
#define ICON_MD_LINE_STYLE u8"\ue919"
#define ICON_MD_LINE_WEIGHT u8"\ue91a"
#define ICON_MD_LINEAR_SCALE u8"\ue260"
#define ICON_MD_LINK u8"\ue157"
#define ICON_MD_LINKED_CAMERA u8"\ue438"
#define ICON_MD_LIST u8"\ue896"
#define ICON_MD_LIVE_HELP u8"\ue0c6"
#define ICON_MD_LIVE_TV u8"\ue639"
#define ICON_MD_LOCAL_ACTIVITY u8"\ue53f"
#define ICON_MD_LOCAL_AIRPORT u8"\ue53d"
#define ICON_MD_LOCAL_ATM u8"\ue53e"
#define ICON_MD_LOCAL_BAR u8"\ue540"
#define ICON_MD_LOCAL_CAFE u8"\ue541"
#define ICON_MD_LOCAL_CAR_WASH u8"\ue542"
#define ICON_MD_LOCAL_CONVENIENCE_STORE u8"\ue543"
#define ICON_MD_LOCAL_DINING u8"\ue556"
#define ICON_MD_LOCAL_DRINK u8"\ue544"
#define ICON_MD_LOCAL_FLORIST u8"\ue545"
#define ICON_MD_LOCAL_GAS_STATION u8"\ue546"
#define ICON_MD_LOCAL_GROCERY_STORE u8"\ue547"
#define ICON_MD_LOCAL_HOSPITAL u8"\ue548"
#define ICON_MD_LOCAL_HOTEL u8"\ue549"
#define ICON_MD_LOCAL_LAUNDRY_SERVICE u8"\ue54a"
#define ICON_MD_LOCAL_LIBRARY u8"\ue54b"
#define ICON_MD_LOCAL_MALL u8"\ue54c"
#define ICON_MD_LOCAL_MOVIES u8"\ue54d"
#define ICON_MD_LOCAL_OFFER u8"\ue54e"
#define ICON_MD_LOCAL_PARKING u8"\ue54f"
#define ICON_MD_LOCAL_PHARMACY u8"\ue550"
#define ICON_MD_LOCAL_PHONE u8"\ue551"
#define ICON_MD_LOCAL_PIZZA u8"\ue552"
#define ICON_MD_LOCAL_PLAY u8"\ue553"
#define ICON_MD_LOCAL_POST_OFFICE u8"\ue554"
#define ICON_MD_LOCAL_PRINTSHOP u8"\ue555"
#define ICON_MD_LOCAL_SEE u8"\ue557"
#define ICON_MD_LOCAL_SHIPPING u8"\ue558"
#define ICON_MD_LOCAL_TAXI u8"\ue559"
#define ICON_MD_LOCATION_CITY u8"\ue7f1"
#define ICON_MD_LOCATION_DISABLED u8"\ue1b6"
#define ICON_MD_LOCATION_OFF u8"\ue0c7"
#define ICON_MD_LOCATION_ON u8"\ue0c8"
#define ICON_MD_LOCATION_SEARCHING u8"\ue1b7"
#define ICON_MD_LOCK u8"\ue897"
#define ICON_MD_LOCK_OPEN u8"\ue898"
#define ICON_MD_LOCK_OUTLINE u8"\ue899"
#define ICON_MD_LOOKS u8"\ue3fc"
#define ICON_MD_LOOKS_3 u8"\ue3fb"
#define ICON_MD_LOOKS_4 u8"\ue3fd"
#define ICON_MD_LOOKS_5 u8"\ue3fe"
#define ICON_MD_LOOKS_6 u8"\ue3ff"
#define ICON_MD_LOOKS_ONE u8"\ue400"
#define ICON_MD_LOOKS_TWO u8"\ue401"
#define ICON_MD_LOOP u8"\ue028"
#define ICON_MD_LOUPE u8"\ue402"
#define ICON_MD_LOW_PRIORITY u8"\ue16d"
#define ICON_MD_LOYALTY u8"\ue89a"
#define ICON_MD_MAIL u8"\ue158"
#define ICON_MD_MAIL_OUTLINE u8"\ue0e1"
#define ICON_MD_MAP u8"\ue55b"
#define ICON_MD_MARKUNREAD u8"\ue159"
#define ICON_MD_MARKUNREAD_MAILBOX u8"\ue89b"
#define ICON_MD_MEMORY u8"\ue322"
#define ICON_MD_MENU u8"\ue5d2"
#define ICON_MD_MERGE_TYPE u8"\ue252"
#define ICON_MD_MESSAGE u8"\ue0c9"
#define ICON_MD_MIC u8"\ue029"
#define ICON_MD_MIC_NONE u8"\ue02a"
#define ICON_MD_MIC_OFF u8"\ue02b"
#define ICON_MD_MMS u8"\ue618"
#define ICON_MD_MODE_COMMENT u8"\ue253"
#define ICON_MD_MODE_EDIT u8"\ue254"
#define ICON_MD_MONETIZATION_ON u8"\ue263"
#define ICON_MD_MONEY_OFF u8"\ue25c"
#define ICON_MD_MONOCHROME_PHOTOS u8"\ue403"
#define ICON_MD_MOOD u8"\ue7f2"
#define ICON_MD_MOOD_BAD u8"\ue7f3"
#define ICON_MD_MORE u8"\ue619"
#define ICON_MD_MORE_HORIZ u8"\ue5d3"
#define ICON_MD_MORE_VERT u8"\ue5d4"
#define ICON_MD_MOTORCYCLE u8"\ue91b"
#define ICON_MD_MOUSE u8"\ue323"
#define ICON_MD_MOVE_TO_INBOX u8"\ue168"
#define ICON_MD_MOVIE u8"\ue02c"
#define ICON_MD_MOVIE_CREATION u8"\ue404"
#define ICON_MD_MOVIE_FILTER u8"\ue43a"
#define ICON_MD_MULTILINE_CHART u8"\ue6df"
#define ICON_MD_MUSIC_NOTE u8"\ue405"
#define ICON_MD_MUSIC_VIDEO u8"\ue063"
#define ICON_MD_MY_LOCATION u8"\ue55c"
#define ICON_MD_NATURE u8"\ue406"
#define ICON_MD_NATURE_PEOPLE u8"\ue407"
#define ICON_MD_NAVIGATE_BEFORE u8"\ue408"
#define ICON_MD_NAVIGATE_NEXT u8"\ue409"
#define ICON_MD_NAVIGATION u8"\ue55d"
#define ICON_MD_NEAR_ME u8"\ue569"
#define ICON_MD_NETWORK_CELL u8"\ue1b9"
#define ICON_MD_NETWORK_CHECK u8"\ue640"
#define ICON_MD_NETWORK_LOCKED u8"\ue61a"
#define ICON_MD_NETWORK_WIFI u8"\ue1ba"
#define ICON_MD_NEW_RELEASES u8"\ue031"
#define ICON_MD_NEXT_WEEK u8"\ue16a"
#define ICON_MD_NFC u8"\ue1bb"
#define ICON_MD_NO_ENCRYPTION u8"\ue641"
#define ICON_MD_NO_SIM u8"\ue0cc"
#define ICON_MD_NOT_INTERESTED u8"\ue033"
#define ICON_MD_NOTE u8"\ue06f"
#define ICON_MD_NOTE_ADD u8"\ue89c"
#define ICON_MD_NOTIFICATIONS u8"\ue7f4"
#define ICON_MD_NOTIFICATIONS_ACTIVE u8"\ue7f7"
#define ICON_MD_NOTIFICATIONS_NONE u8"\ue7f5"
#define ICON_MD_NOTIFICATIONS_OFF u8"\ue7f6"
#define ICON_MD_NOTIFICATIONS_PAUSED u8"\ue7f8"
#define ICON_MD_OFFLINE_PIN u8"\ue90a"
#define ICON_MD_ONDEMAND_VIDEO u8"\ue63a"
#define ICON_MD_OPACITY u8"\ue91c"
#define ICON_MD_OPEN_IN_BROWSER u8"\ue89d"
#define ICON_MD_OPEN_IN_NEW u8"\ue89e"
#define ICON_MD_OPEN_WITH u8"\ue89f"
#define ICON_MD_PAGES u8"\ue7f9"
#define ICON_MD_PAGEVIEW u8"\ue8a0"
#define ICON_MD_PALETTE u8"\ue40a"
#define ICON_MD_PAN_TOOL u8"\ue925"
#define ICON_MD_PANORAMA u8"\ue40b"
#define ICON_MD_PANORAMA_FISH_EYE u8"\ue40c"
#define ICON_MD_PANORAMA_HORIZONTAL u8"\ue40d"
#define ICON_MD_PANORAMA_VERTICAL u8"\ue40e"
#define ICON_MD_PANORAMA_WIDE_ANGLE u8"\ue40f"
#define ICON_MD_PARTY_MODE u8"\ue7fa"
#define ICON_MD_PAUSE u8"\ue034"
#define ICON_MD_PAUSE_CIRCLE_FILLED u8"\ue035"
#define ICON_MD_PAUSE_CIRCLE_OUTLINE u8"\ue036"
#define ICON_MD_PAYMENT u8"\ue8a1"
#define ICON_MD_PEOPLE u8"\ue7fb"
#define ICON_MD_PEOPLE_OUTLINE u8"\ue7fc"
#define ICON_MD_PERM_CAMERA_MIC u8"\ue8a2"
#define ICON_MD_PERM_CONTACT_CALENDAR u8"\ue8a3"
#define ICON_MD_PERM_DATA_SETTING u8"\ue8a4"
#define ICON_MD_PERM_DEVICE_INFORMATION u8"\ue8a5"
#define ICON_MD_PERM_IDENTITY u8"\ue8a6"
#define ICON_MD_PERM_MEDIA u8"\ue8a7"
#define ICON_MD_PERM_PHONE_MSG u8"\ue8a8"
#define ICON_MD_PERM_SCAN_WIFI u8"\ue8a9"
#define ICON_MD_PERSON u8"\ue7fd"
#define ICON_MD_PERSON_ADD u8"\ue7fe"
#define ICON_MD_PERSON_OUTLINE u8"\ue7ff"
#define ICON_MD_PERSON_PIN u8"\ue55a"
#define ICON_MD_PERSON_PIN_CIRCLE u8"\ue56a"
#define ICON_MD_PERSONAL_VIDEO u8"\ue63b"
#define ICON_MD_PETS u8"\ue91d"
#define ICON_MD_PHONE u8"\ue0cd"
#define ICON_MD_PHONE_ANDROID u8"\ue324"
#define ICON_MD_PHONE_BLUETOOTH_SPEAKER u8"\ue61b"
#define ICON_MD_PHONE_FORWARDED u8"\ue61c"
#define ICON_MD_PHONE_IN_TALK u8"\ue61d"
#define ICON_MD_PHONE_IPHONE u8"\ue325"
#define ICON_MD_PHONE_LOCKED u8"\ue61e"
#define ICON_MD_PHONE_MISSED u8"\ue61f"
#define ICON_MD_PHONE_PAUSED u8"\ue620"
#define ICON_MD_PHONELINK u8"\ue326"
#define ICON_MD_PHONELINK_ERASE u8"\ue0db"
#define ICON_MD_PHONELINK_LOCK u8"\ue0dc"
#define ICON_MD_PHONELINK_OFF u8"\ue327"
#define ICON_MD_PHONELINK_RING u8"\ue0dd"
#define ICON_MD_PHONELINK_SETUP u8"\ue0de"
#define ICON_MD_PHOTO u8"\ue410"
#define ICON_MD_PHOTO_ALBUM u8"\ue411"
#define ICON_MD_PHOTO_CAMERA u8"\ue412"
#define ICON_MD_PHOTO_FILTER u8"\ue43b"
#define ICON_MD_PHOTO_LIBRARY u8"\ue413"
#define ICON_MD_PHOTO_SIZE_SELECT_ACTUAL u8"\ue432"
#define ICON_MD_PHOTO_SIZE_SELECT_LARGE u8"\ue433"
#define ICON_MD_PHOTO_SIZE_SELECT_SMALL u8"\ue434"
#define ICON_MD_PICTURE_AS_PDF u8"\ue415"
#define ICON_MD_PICTURE_IN_PICTURE u8"\ue8aa"
#define ICON_MD_PICTURE_IN_PICTURE_ALT u8"\ue911"
#define ICON_MD_PIE_CHART u8"\ue6c4"
#define ICON_MD_PIE_CHART_OUTLINED u8"\ue6c5"
#define ICON_MD_PIN_DROP u8"\ue55e"
#define ICON_MD_PLACE u8"\ue55f"
#define ICON_MD_PLAY_ARROW u8"\ue037"
#define ICON_MD_PLAY_CIRCLE_FILLED u8"\ue038"
#define ICON_MD_PLAY_CIRCLE_OUTLINE u8"\ue039"
#define ICON_MD_PLAY_FOR_WORK u8"\ue906"
#define ICON_MD_PLAYLIST_ADD u8"\ue03b"
#define ICON_MD_PLAYLIST_ADD_CHECK u8"\ue065"
#define ICON_MD_PLAYLIST_PLAY u8"\ue05f"
#define ICON_MD_PLUS_ONE u8"\ue800"
#define ICON_MD_POLL u8"\ue801"
#define ICON_MD_POLYMER u8"\ue8ab"
#define ICON_MD_POOL u8"\ueb48"
#define ICON_MD_PORTABLE_WIFI_OFF u8"\ue0ce"
#define ICON_MD_PORTRAIT u8"\ue416"
#define ICON_MD_POWER u8"\ue63c"
#define ICON_MD_POWER_INPUT u8"\ue336"
#define ICON_MD_POWER_SETTINGS_NEW u8"\ue8ac"
#define ICON_MD_PREGNANT_WOMAN u8"\ue91e"
#define ICON_MD_PRESENT_TO_ALL u8"\ue0df"
#define ICON_MD_PRINT u8"\ue8ad"
#define ICON_MD_PRIORITY_HIGH u8"\ue645"
#define ICON_MD_PUBLIC u8"\ue80b"
#define ICON_MD_PUBLISH u8"\ue255"
#define ICON_MD_QUERY_BUILDER u8"\ue8ae"
#define ICON_MD_QUESTION_ANSWER u8"\ue8af"
#define ICON_MD_QUEUE u8"\ue03c"
#define ICON_MD_QUEUE_MUSIC u8"\ue03d"
#define ICON_MD_QUEUE_PLAY_NEXT u8"\ue066"
#define ICON_MD_RADIO u8"\ue03e"
#define ICON_MD_RADIO_BUTTON_CHECKED u8"\ue837"
#define ICON_MD_RADIO_BUTTON_UNCHECKED u8"\ue836"
#define ICON_MD_RATE_REVIEW u8"\ue560"
#define ICON_MD_RECEIPT u8"\ue8b0"
#define ICON_MD_RECENT_ACTORS u8"\ue03f"
#define ICON_MD_RECORD_VOICE_OVER u8"\ue91f"
#define ICON_MD_REDEEM u8"\ue8b1"
#define ICON_MD_REDO u8"\ue15a"
#define ICON_MD_REFRESH u8"\ue5d5"
#define ICON_MD_REMOVE u8"\ue15b"
#define ICON_MD_REMOVE_CIRCLE u8"\ue15c"
#define ICON_MD_REMOVE_CIRCLE_OUTLINE u8"\ue15d"
#define ICON_MD_REMOVE_FROM_QUEUE u8"\ue067"
#define ICON_MD_REMOVE_RED_EYE u8"\ue417"
#define ICON_MD_REMOVE_SHOPPING_CART u8"\ue928"
#define ICON_MD_REORDER u8"\ue8fe"
#define ICON_MD_REPEAT u8"\ue040"
#define ICON_MD_REPEAT_ONE u8"\ue041"
#define ICON_MD_REPLAY u8"\ue042"
#define ICON_MD_REPLAY_10 u8"\ue059"
#define ICON_MD_REPLAY_30 u8"\ue05a"
#define ICON_MD_REPLAY_5 u8"\ue05b"
#define ICON_MD_REPLY u8"\ue15e"
#define ICON_MD_REPLY_ALL u8"\ue15f"
#define ICON_MD_REPORT u8"\ue160"
#define ICON_MD_REPORT_PROBLEM u8"\ue8b2"
#define ICON_MD_RESTAURANT u8"\ue56c"
#define ICON_MD_RESTAURANT_MENU u8"\ue561"
#define ICON_MD_RESTORE u8"\ue8b3"
#define ICON_MD_RESTORE_PAGE u8"\ue929"
#define ICON_MD_RING_VOLUME u8"\ue0d1"
#define ICON_MD_ROOM u8"\ue8b4"
#define ICON_MD_ROOM_SERVICE u8"\ueb49"
#define ICON_MD_ROTATE_90_DEGREES_CCW u8"\ue418"
#define ICON_MD_ROTATE_LEFT u8"\ue419"
#define ICON_MD_ROTATE_RIGHT u8"\ue41a"
#define ICON_MD_ROUNDED_CORNER u8"\ue920"
#define ICON_MD_ROUTER u8"\ue328"
#define ICON_MD_ROWING u8"\ue921"
#define ICON_MD_RSS_FEED u8"\ue0e5"
#define ICON_MD_RV_HOOKUP u8"\ue642"
#define ICON_MD_SATELLITE u8"\ue562"
#define ICON_MD_SAVE u8"\ue161"
#define ICON_MD_SCANNER u8"\ue329"
#define ICON_MD_SCHEDULE u8"\ue8b5"
#define ICON_MD_SCHOOL u8"\ue80c"
#define ICON_MD_SCREEN_LOCK_LANDSCAPE u8"\ue1be"
#define ICON_MD_SCREEN_LOCK_PORTRAIT u8"\ue1bf"
#define ICON_MD_SCREEN_LOCK_ROTATION u8"\ue1c0"
#define ICON_MD_SCREEN_ROTATION u8"\ue1c1"
#define ICON_MD_SCREEN_SHARE u8"\ue0e2"
#define ICON_MD_SD_CARD u8"\ue623"
#define ICON_MD_SD_STORAGE u8"\ue1c2"
#define ICON_MD_SEARCH u8"\ue8b6"
#define ICON_MD_SECURITY u8"\ue32a"
#define ICON_MD_SELECT_ALL u8"\ue162"
#define ICON_MD_SEND u8"\ue163"
#define ICON_MD_SENTIMENT_DISSATISFIED u8"\ue811"
#define ICON_MD_SENTIMENT_NEUTRAL u8"\ue812"
#define ICON_MD_SENTIMENT_SATISFIED u8"\ue813"
#define ICON_MD_SENTIMENT_VERY_DISSATISFIED u8"\ue814"
#define ICON_MD_SENTIMENT_VERY_SATISFIED u8"\ue815"
#define ICON_MD_SETTINGS u8"\ue8b8"
#define ICON_MD_SETTINGS_APPLICATIONS u8"\ue8b9"
#define ICON_MD_SETTINGS_BACKUP_RESTORE u8"\ue8ba"
#define ICON_MD_SETTINGS_BLUETOOTH u8"\ue8bb"
#define ICON_MD_SETTINGS_BRIGHTNESS u8"\ue8bd"
#define ICON_MD_SETTINGS_CELL u8"\ue8bc"
#define ICON_MD_SETTINGS_ETHERNET u8"\ue8be"
#define ICON_MD_SETTINGS_INPUT_ANTENNA u8"\ue8bf"
#define ICON_MD_SETTINGS_INPUT_COMPONENT u8"\ue8c0"
#define ICON_MD_SETTINGS_INPUT_COMPOSITE u8"\ue8c1"
#define ICON_MD_SETTINGS_INPUT_HDMI u8"\ue8c2"
#define ICON_MD_SETTINGS_INPUT_SVIDEO u8"\ue8c3"
#define ICON_MD_SETTINGS_OVERSCAN u8"\ue8c4"
#define ICON_MD_SETTINGS_PHONE u8"\ue8c5"
#define ICON_MD_SETTINGS_POWER u8"\ue8c6"
#define ICON_MD_SETTINGS_REMOTE u8"\ue8c7"
#define ICON_MD_SETTINGS_SYSTEM_DAYDREAM u8"\ue1c3"
#define ICON_MD_SETTINGS_VOICE u8"\ue8c8"
#define ICON_MD_SHARE u8"\ue80d"
#define ICON_MD_SHOP u8"\ue8c9"
#define ICON_MD_SHOP_TWO u8"\ue8ca"
#define ICON_MD_SHOPPING_BASKET u8"\ue8cb"
#define ICON_MD_SHOPPING_CART u8"\ue8cc"
#define ICON_MD_SHORT_TEXT u8"\ue261"
#define ICON_MD_SHOW_CHART u8"\ue6e1"
#define ICON_MD_SHUFFLE u8"\ue043"
#define ICON_MD_SIGNAL_CELLULAR_4_BAR u8"\ue1c8"
#define ICON_MD_SIGNAL_CELLULAR_CONNECTED_NO_INTERNET_4_BAR u8"\ue1cd"
#define ICON_MD_SIGNAL_CELLULAR_NO_SIM u8"\ue1ce"
#define ICON_MD_SIGNAL_CELLULAR_NULL u8"\ue1cf"
#define ICON_MD_SIGNAL_CELLULAR_OFF u8"\ue1d0"
#define ICON_MD_SIGNAL_WIFI_4_BAR u8"\ue1d8"
#define ICON_MD_SIGNAL_WIFI_4_BAR_LOCK u8"\ue1d9"
#define ICON_MD_SIGNAL_WIFI_OFF u8"\ue1da"
#define ICON_MD_SIM_CARD u8"\ue32b"
#define ICON_MD_SIM_CARD_ALERT u8"\ue624"
#define ICON_MD_SKIP_NEXT u8"\ue044"
#define ICON_MD_SKIP_PREVIOUS u8"\ue045"
#define ICON_MD_SLIDESHOW u8"\ue41b"
#define ICON_MD_SLOW_MOTION_VIDEO u8"\ue068"
#define ICON_MD_SMARTPHONE u8"\ue32c"
#define ICON_MD_SMOKE_FREE u8"\ueb4a"
#define ICON_MD_SMOKING_ROOMS u8"\ueb4b"
#define ICON_MD_SMS u8"\ue625"
#define ICON_MD_SMS_FAILED u8"\ue626"
#define ICON_MD_SNOOZE u8"\ue046"
#define ICON_MD_SORT u8"\ue164"
#define ICON_MD_SORT_BY_ALPHA u8"\ue053"
#define ICON_MD_SPA u8"\ueb4c"
#define ICON_MD_SPACE_BAR u8"\ue256"
#define ICON_MD_SPEAKER u8"\ue32d"
#define ICON_MD_SPEAKER_GROUP u8"\ue32e"
#define ICON_MD_SPEAKER_NOTES u8"\ue8cd"
#define ICON_MD_SPEAKER_NOTES_OFF u8"\ue92a"
#define ICON_MD_SPEAKER_PHONE u8"\ue0d2"
#define ICON_MD_SPELLCHECK u8"\ue8ce"
#define ICON_MD_STAR u8"\ue838"
#define ICON_MD_STAR_BORDER u8"\ue83a"
#define ICON_MD_STAR_HALF u8"\ue839"
#define ICON_MD_STARS u8"\ue8d0"
#define ICON_MD_STAY_CURRENT_LANDSCAPE u8"\ue0d3"
#define ICON_MD_STAY_CURRENT_PORTRAIT u8"\ue0d4"
#define ICON_MD_STAY_PRIMARY_LANDSCAPE u8"\ue0d5"
#define ICON_MD_STAY_PRIMARY_PORTRAIT u8"\ue0d6"
#define ICON_MD_STOP u8"\ue047"
#define ICON_MD_STOP_SCREEN_SHARE u8"\ue0e3"
#define ICON_MD_STORAGE u8"\ue1db"
#define ICON_MD_STORE u8"\ue8d1"
#define ICON_MD_STORE_MALL_DIRECTORY u8"\ue563"
#define ICON_MD_STRAIGHTEN u8"\ue41c"
#define ICON_MD_STREETVIEW u8"\ue56e"
#define ICON_MD_STRIKETHROUGH_S u8"\ue257"
#define ICON_MD_STYLE u8"\ue41d"
#define ICON_MD_SUBDIRECTORY_ARROW_LEFT u8"\ue5d9"
#define ICON_MD_SUBDIRECTORY_ARROW_RIGHT u8"\ue5da"
#define ICON_MD_SUBJECT u8"\ue8d2"
#define ICON_MD_SUBSCRIPTIONS u8"\ue064"
#define ICON_MD_SUBTITLES u8"\ue048"
#define ICON_MD_SUBWAY u8"\ue56f"
#define ICON_MD_SUPERVISOR_ACCOUNT u8"\ue8d3"
#define ICON_MD_SURROUND_SOUND u8"\ue049"
#define ICON_MD_SWAP_CALLS u8"\ue0d7"
#define ICON_MD_SWAP_HORIZ u8"\ue8d4"
#define ICON_MD_SWAP_VERT u8"\ue8d5"
#define ICON_MD_SWAP_VERTICAL_CIRCLE u8"\ue8d6"
#define ICON_MD_SWITCH_CAMERA u8"\ue41e"
#define ICON_MD_SWITCH_VIDEO u8"\ue41f"
#define ICON_MD_SYNC u8"\ue627"
#define ICON_MD_SYNC_DISABLED u8"\ue628"
#define ICON_MD_SYNC_PROBLEM u8"\ue629"
#define ICON_MD_SYSTEM_UPDATE u8"\ue62a"
#define ICON_MD_SYSTEM_UPDATE_ALT u8"\ue8d7"
#define ICON_MD_TAB u8"\ue8d8"
#define ICON_MD_TAB_UNSELECTED u8"\ue8d9"
#define ICON_MD_TABLET u8"\ue32f"
#define ICON_MD_TABLET_ANDROID u8"\ue330"
#define ICON_MD_TABLET_MAC u8"\ue331"
#define ICON_MD_TAG_FACES u8"\ue420"
#define ICON_MD_TAP_AND_PLAY u8"\ue62b"
#define ICON_MD_TERRAIN u8"\ue564"
#define ICON_MD_TEXT_FIELDS u8"\ue262"
#define ICON_MD_TEXT_FORMAT u8"\ue165"
#define ICON_MD_TEXTSMS u8"\ue0d8"
#define ICON_MD_TEXTURE u8"\ue421"
#define ICON_MD_THEATERS u8"\ue8da"
#define ICON_MD_THUMB_DOWN u8"\ue8db"
#define ICON_MD_THUMB_UP u8"\ue8dc"
#define ICON_MD_THUMBS_UP_DOWN u8"\ue8dd"
#define ICON_MD_TIME_TO_LEAVE u8"\ue62c"
#define ICON_MD_TIMELAPSE u8"\ue422"
#define ICON_MD_TIMELINE u8"\ue922"
#define ICON_MD_TIMER u8"\ue425"
#define ICON_MD_TIMER_10 u8"\ue423"
#define ICON_MD_TIMER_3 u8"\ue424"
#define ICON_MD_TIMER_OFF u8"\ue426"
#define ICON_MD_TITLE u8"\ue264"
#define ICON_MD_TOC u8"\ue8de"
#define ICON_MD_TODAY u8"\ue8df"
#define ICON_MD_TOLL u8"\ue8e0"
#define ICON_MD_TONALITY u8"\ue427"
#define ICON_MD_TOUCH_APP u8"\ue913"
#define ICON_MD_TOYS u8"\ue332"
#define ICON_MD_TRACK_CHANGES u8"\ue8e1"
#define ICON_MD_TRAFFIC u8"\ue565"
#define ICON_MD_TRAIN u8"\ue570"
#define ICON_MD_TRAM u8"\ue571"
#define ICON_MD_TRANSFER_WITHIN_A_STATION u8"\ue572"
#define ICON_MD_TRANSFORM u8"\ue428"
#define ICON_MD_TRANSLATE u8"\ue8e2"
#define ICON_MD_TRENDING_DOWN u8"\ue8e3"
#define ICON_MD_TRENDING_FLAT u8"\ue8e4"
#define ICON_MD_TRENDING_UP u8"\ue8e5"
#define ICON_MD_TUNE u8"\ue429"
#define ICON_MD_TURNED_IN u8"\ue8e6"
#define ICON_MD_TURNED_IN_NOT u8"\ue8e7"
#define ICON_MD_TV u8"\ue333"
#define ICON_MD_UNARCHIVE u8"\ue169"
#define ICON_MD_UNDO u8"\ue166"
#define ICON_MD_UNFOLD_LESS u8"\ue5d6"
#define ICON_MD_UNFOLD_MORE u8"\ue5d7"
#define ICON_MD_UPDATE u8"\ue923"
#define ICON_MD_USB u8"\ue1e0"
#define ICON_MD_VERIFIED_USER u8"\ue8e8"
#define ICON_MD_VERTICAL_ALIGN_BOTTOM u8"\ue258"
#define ICON_MD_VERTICAL_ALIGN_CENTER u8"\ue259"
#define ICON_MD_VERTICAL_ALIGN_TOP u8"\ue25a"
#define ICON_MD_VIBRATION u8"\ue62d"
#define ICON_MD_VIDEO_CALL u8"\ue070"
#define ICON_MD_VIDEO_LABEL u8"\ue071"
#define ICON_MD_VIDEO_LIBRARY u8"\ue04a"
#define ICON_MD_VIDEOCAM u8"\ue04b"
#define ICON_MD_VIDEOCAM_OFF u8"\ue04c"
#define ICON_MD_VIDEOGAME_ASSET u8"\ue338"
#define ICON_MD_VIEW_AGENDA u8"\ue8e9"
#define ICON_MD_VIEW_ARRAY u8"\ue8ea"
#define ICON_MD_VIEW_CAROUSEL u8"\ue8eb"
#define ICON_MD_VIEW_COLUMN u8"\ue8ec"
#define ICON_MD_VIEW_COMFY u8"\ue42a"
#define ICON_MD_VIEW_COMPACT u8"\ue42b"
#define ICON_MD_VIEW_DAY u8"\ue8ed"
#define ICON_MD_VIEW_HEADLINE u8"\ue8ee"
#define ICON_MD_VIEW_LIST u8"\ue8ef"
#define ICON_MD_VIEW_MODULE u8"\ue8f0"
#define ICON_MD_VIEW_QUILT u8"\ue8f1"
#define ICON_MD_VIEW_STREAM u8"\ue8f2"
#define ICON_MD_VIEW_WEEK u8"\ue8f3"
#define ICON_MD_VIGNETTE u8"\ue435"
#define ICON_MD_VISIBILITY u8"\ue8f4"
#define ICON_MD_VISIBILITY_OFF u8"\ue8f5"
#define ICON_MD_VOICE_CHAT u8"\ue62e"
#define ICON_MD_VOICEMAIL u8"\ue0d9"
#define ICON_MD_VOLUME_DOWN u8"\ue04d"
#define ICON_MD_VOLUME_MUTE u8"\ue04e"
#define ICON_MD_VOLUME_OFF u8"\ue04f"
#define ICON_MD_VOLUME_UP u8"\ue050"
#define ICON_MD_VPN_KEY u8"\ue0da"
#define ICON_MD_VPN_LOCK u8"\ue62f"
#define ICON_MD_WALLPAPER u8"\ue1bc"
#define ICON_MD_WARNING u8"\ue002"
#define ICON_MD_WATCH u8"\ue334"
#define ICON_MD_WATCH_LATER u8"\ue924"
#define ICON_MD_WB_AUTO u8"\ue42c"
#define ICON_MD_WB_CLOUDY u8"\ue42d"
#define ICON_MD_WB_INCANDESCENT u8"\ue42e"
#define ICON_MD_WB_IRIDESCENT u8"\ue436"
#define ICON_MD_WB_SUNNY u8"\ue430"
#define ICON_MD_WC u8"\ue63d"
#define ICON_MD_WEB u8"\ue051"
#define ICON_MD_WEB_ASSET u8"\ue069"
#define ICON_MD_WEEKEND u8"\ue16b"
#define ICON_MD_WHATSHOT u8"\ue80e"
#define ICON_MD_WIDGETS u8"\ue1bd"
#define ICON_MD_WIFI u8"\ue63e"
#define ICON_MD_WIFI_LOCK u8"\ue1e1"
#define ICON_MD_WIFI_TETHERING u8"\ue1e2"
#define ICON_MD_WORK u8"\ue8f9"
#define ICON_MD_WRAP_TEXT u8"\ue25b"
#define ICON_MD_YOUTUBE_SEARCHED_FOR u8"\ue8fa"
#define ICON_MD_ZOOM_IN u8"\ue8ff"
#define ICON_MD_ZOOM_OUT u8"\ue900"
#define ICON_MD_ZOOM_OUT_MAP u8"\ue56b"
+1 -1
View File
@@ -112,7 +112,7 @@ namespace e2d
u32 minimal_framerate() const noexcept;
u32 maximal_framerate() const noexcept;
private:
u32 minimal_framerate_{30u};
u32 minimal_framerate_{15u};
u32 maximal_framerate_{1000u};
};
+3
View File
@@ -31,6 +31,7 @@
#include "components/actor.hpp"
#include "components/behaviour.hpp"
#include "components/camera.hpp"
#include "components/colliders.hpp"
#include "components/commands.hpp"
#include "components/disabled.hpp"
#include "components/events.hpp"
@@ -42,6 +43,7 @@
#include "components/scene.hpp"
#include "components/spine_player.hpp"
#include "components/sprite_renderer.hpp"
#include "components/touchable.hpp"
#include "systems/camera_system.hpp"
#include "systems/flipbook_system.hpp"
@@ -51,6 +53,7 @@
#include "systems/render_system.hpp"
#include "systems/script_system.hpp"
#include "systems/spine_system.hpp"
#include "systems/touch_system.hpp"
#include "systems/world_system.hpp"
#include "address.hpp"
+196
View File
@@ -46,6 +46,9 @@ namespace e2d
class actor;
class behaviour;
class camera;
class rect_collider;
class circle_collider;
class polygon_collider;
template < typename C >
class commands;
template < typename T >
@@ -60,6 +63,7 @@ namespace e2d
class scene;
class spine_player;
class sprite_renderer;
class touchable;
class camera_system;
class flipbook_system;
@@ -69,6 +73,7 @@ namespace e2d
class render_system;
class script_system;
class spine_system;
class touch_system;
class world_system;
template < typename Asset, typename Content >
@@ -120,3 +125,194 @@ namespace sol
}
};
}
namespace e2d::ecsex
{
template < typename T, typename... Opts >
void remove_all_components(ecs::registry& owner, Opts&&... opts) {
static thread_local vector<ecs::entity> to_remove_components;
E2D_DEFER([](){ to_remove_components.clear(); });
owner.for_each_component<T>([](const ecs::entity& e, const T&){
to_remove_components.push_back(e);
}, std::forward<Opts>(opts)...);
for ( ecs::entity& e : to_remove_components ) {
e.remove_component<T>();
}
}
}
namespace e2d::ecsex
{
template < typename... Ts, typename Iter, typename... Opts >
std::size_t extract_components(ecs::registry& owner, Iter iter, Opts&&... opts) {
std::size_t count{0u};
owner.for_joined_components<Ts...>(
[&iter, &count](const ecs::entity& e, Ts&... cs){
iter++ = std::make_tuple(e, cs...);
++count;
}, std::forward<Opts>(opts)...);
return count;
}
template < typename... Ts, typename Iter, typename... Opts >
std::size_t extract_components(const ecs::registry& owner, Iter iter, Opts&&... opts) {
std::size_t count{0u};
owner.for_joined_components<Ts...>(
[&iter, &count](const ecs::const_entity& e, const Ts&... cs){
iter++ = std::make_tuple(e, cs...);
++count;
}, std::forward<Opts>(opts)...);
return count;
}
}
namespace e2d::ecsex
{
template < typename... Ts, typename F, typename... Opts >
void for_extracted_components(ecs::registry& owner, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::entity, Ts...>> components;
const std::size_t begin_index = components.size();
E2D_DEFER([begin_index](){
components.erase(
components.begin() + begin_index,
components.end());
});
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
}
template < typename... Ts, typename F, typename... Opts >
void for_extracted_components(const ecs::registry& owner, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::const_entity, Ts...>> components;
const std::size_t begin_index = components.size();
E2D_DEFER([begin_index](){
components.erase(
components.begin() + begin_index,
components.end());
});
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
}
}
namespace e2d::ecsex
{
template < typename... Ts, typename Comp, typename F, typename... Opts >
void for_extracted_sorted_components(ecs::registry& owner, Comp&& comp, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::entity, Ts...>> components;
const std::size_t begin_index = components.size();
E2D_DEFER([begin_index](){
components.erase(
components.begin() + begin_index,
components.end());
});
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
std::sort(
components.begin() + begin_index,
components.end(),
comp);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
}
template < typename... Ts, typename Comp, typename F, typename... Opts >
void for_extracted_sorted_components(const ecs::registry& owner, Comp&& comp, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::const_entity, Ts...>> components;
const std::size_t begin_index = components.size();
E2D_DEFER([begin_index](){
components.erase(
components.begin() + begin_index,
components.end());
});
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
std::sort(
components.begin() + begin_index,
components.end(),
comp);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
}
}
namespace e2d::strings
{
template <>
class format_arg<ecs::entity> {
ecs::entity value_;
u8 width_;
public:
template < typename U >
explicit format_arg(U&& value, u8 width = 0) noexcept
: value_(std::forward<U>(value)), width_(width) {}
std::ptrdiff_t write(char* dst, size_t size) const {
return math::numeric_cast<std::ptrdiff_t>(
format(dst, size, "(%0,%1)",
make_format_arg(ecs::detail::entity_id_index(value_.id()), width_),
make_format_arg(ecs::detail::entity_id_version(value_.id()), width_)));
}
};
template <>
class format_arg<ecs::const_entity> {
ecs::const_entity value_;
u8 width_;
public:
template < typename U >
explicit format_arg(U&& value, u8 width = 0) noexcept
: value_(std::forward<U>(value)), width_(width) {}
std::ptrdiff_t write(char* dst, size_t size) const {
return math::numeric_cast<std::ptrdiff_t>(
format(dst, size, "(%0,%1)",
make_format_arg(ecs::detail::entity_id_index(value_.id()), width_),
make_format_arg(ecs::detail::entity_id_version(value_.id()), width_)));
}
};
}
@@ -0,0 +1,17 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
namespace e2d::components
{
}
+1 -5
View File
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../node.hpp"
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/script_asset.hpp"
+16 -5
View File
@@ -6,16 +6,13 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
namespace e2d
{
class camera final {
public:
class input final {};
class gizmos final {};
public:
ENUM_HPP_CLASS_DECL(modes, u8,
@@ -77,6 +74,20 @@ namespace e2d
const collect_context& ctx) const;
};
template <>
class factory_loader<camera::input> final : factory_loader<> {
public:
static const char* schema_source;
bool operator()(
camera::input& component,
const fill_context& ctx) const;
bool operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const;
};
template <>
class factory_loader<camera::gizmos> final : factory_loader<> {
public:
@@ -0,0 +1,193 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
#include "_components.hpp"
namespace e2d::impl
{
template < typename Collider >
class collider_base {
public:
collider_base() = default;
Collider& offset(const v2f& value) noexcept;
[[nodiscard]] const v2f& offset() const noexcept;
private:
v2f offset_ = v2f::zero();
};
}
namespace e2d
{
class rect_collider final
: public impl::collider_base<rect_collider> {
public:
rect_collider() = default;
rect_collider& size(const v2f& value) noexcept;
[[nodiscard]] const v2f& size() const noexcept;
private:
v2f size_ = v2f::unit();
};
class circle_collider final
: public impl::collider_base<rect_collider> {
public:
circle_collider() = default;
circle_collider& radius(f32 value) noexcept;
[[nodiscard]] f32 radius() const noexcept;
private:
f32 radius_ = 1.f;
};
class polygon_collider final
: public impl::collider_base<rect_collider> {
public:
polygon_collider() = default;
polygon_collider& points(vector<v2f> value) noexcept;
[[nodiscard]] vector<v2f>& points() noexcept;
[[nodiscard]] const vector<v2f>& points() const noexcept;
private:
vector<v2f> points_ = {
{-0.5f, -0.5f},
{+0.5f, -0.5f},
{+0.5f, +0.5f},
{-0.5f, +0.5f}};
};
}
namespace e2d
{
template <>
class factory_loader<rect_collider> final : factory_loader<> {
public:
static const char* schema_source;
bool operator()(
rect_collider& component,
const fill_context& ctx) const;
bool operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const;
};
template <>
class factory_loader<circle_collider> final : factory_loader<> {
public:
static const char* schema_source;
bool operator()(
circle_collider& component,
const fill_context& ctx) const;
bool operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const;
};
template <>
class factory_loader<polygon_collider> final : factory_loader<> {
public:
static const char* schema_source;
bool operator()(
polygon_collider& component,
const fill_context& ctx) const;
bool operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const;
};
}
namespace e2d
{
template <>
class component_inspector<rect_collider> final : component_inspector<> {
public:
static const char* title;
void operator()(gcomponent<rect_collider>& c) const;
void operator()(gcomponent<rect_collider>& c, gizmos_context& ctx) const;
};
template <>
class component_inspector<circle_collider> final : component_inspector<> {
public:
static const char* title;
void operator()(gcomponent<circle_collider>& c) const;
void operator()(gcomponent<circle_collider>& c, gizmos_context& ctx) const;
};
template <>
class component_inspector<polygon_collider> final : component_inspector<> {
public:
static const char* title;
void operator()(gcomponent<polygon_collider>& c) const;
void operator()(gcomponent<polygon_collider>& c, gizmos_context& ctx) const;
};
}
namespace e2d::impl
{
template < typename Collider >
Collider& collider_base<Collider>::offset(const v2f& value) noexcept {
offset_ = value;
return static_cast<Collider&>(*this);
}
template < typename Collider >
const v2f& collider_base<Collider>::offset() const noexcept {
return offset_;
}
}
namespace e2d
{
inline rect_collider& rect_collider::size(const v2f& value) noexcept {
size_ = math::maximized(v2f::unit(), value);
return *this;
}
inline const v2f& rect_collider::size() const noexcept {
return size_;
}
}
namespace e2d
{
inline circle_collider& circle_collider::radius(f32 value) noexcept {
radius_ = math::max(1.f, value);
return *this;
}
inline f32 circle_collider::radius() const noexcept {
return radius_;
}
}
namespace e2d
{
inline polygon_collider& polygon_collider::points(vector<v2f> value) noexcept {
points_ = std::move(value);
return *this;
}
inline vector<v2f>& polygon_collider::points() noexcept {
return points_;
}
inline const vector<v2f>& polygon_collider::points() const noexcept {
return points_;
}
}
@@ -6,7 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "_components.hpp"
namespace e2d
{
@@ -6,7 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "_components.hpp"
namespace e2d
{
+1 -1
View File
@@ -6,7 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "_components.hpp"
namespace e2d
{
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/flipbook_asset.hpp"
+1 -5
View File
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/font_asset.hpp"
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/model_asset.hpp"
+2 -6
View File
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
namespace e2d
{
@@ -50,7 +46,7 @@ namespace e2d
class component_inspector<named> final : component_inspector<> {
public:
static const char* title;
void operator()(gcomponent<named>& c) const;
};
}
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/material_asset.hpp"
+1 -5
View File
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
namespace e2d
{
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/spine_asset.hpp"
#include "../assets/material_asset.hpp"
@@ -6,11 +6,7 @@
#pragma once
#include "../_high.hpp"
#include "../factory.hpp"
#include "../gobject.hpp"
#include "../inspector.hpp"
#include "_components.hpp"
#include "../assets/atlas_asset.hpp"
#include "../assets/sprite_asset.hpp"
@@ -0,0 +1,190 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
#include "_components.hpp"
namespace e2d::touchable_events
{
class mouse_evt;
class touch_evt;
using event = std::variant<std::monostate,
mouse_evt,
touch_evt>;
}
namespace e2d
{
class touchable final {
public:
touchable() = default;
touchable& bubbling(bool value) noexcept;
touchable& capturing(bool value) noexcept;
[[nodiscard]] bool bubbling() const noexcept;
[[nodiscard]] bool capturing() const noexcept;
private:
enum flag_masks : u8 {
fm_bubbling = 1u << 0,
fm_capturing = 1u << 1,
};
private:
std::underlying_type_t<flag_masks> flags_{
fm_bubbling |
fm_capturing};
};
}
namespace e2d
{
template <>
class factory_loader<touchable> final : factory_loader<> {
public:
static const char* schema_source;
bool operator()(
touchable& component,
const fill_context& ctx) const;
bool operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const;
};
template <>
class factory_loader<events<touchable_events::event>> final : factory_loader<> {
public:
static const char* schema_source;
bool operator()(
events<touchable_events::event>& component,
const fill_context& ctx) const;
bool operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const;
};
}
namespace e2d
{
template <>
class component_inspector<touchable> final : component_inspector<> {
public:
static const char* title;
void operator()(gcomponent<touchable>& c) const;
};
}
namespace e2d::touchable_events
{
namespace impl
{
template < typename Event >
class base_evt {
public:
base_evt(bool bubbling, bool capturing)
: bubbling_(bubbling)
, capturing_(capturing) {}
base_evt(gobject target, bool bubbling, bool capturing)
: target_(target)
, bubbling_(bubbling)
, capturing_(capturing) {}
Event& target(gobject value) noexcept {
target_ = std::move(value);
return static_cast<Event&>(*this);
}
[[nodiscard]] gobject target() const noexcept { return target_; }
[[nodiscard]] bool bubbling() const noexcept { return bubbling_; }
[[nodiscard]] bool capturing() const noexcept { return capturing_; }
private:
gobject target_;
bool bubbling_ = true;
bool capturing_ = true;
};
}
class mouse_evt final : public impl::base_evt<mouse_evt> {
public:
ENUM_HPP_CLASS_DECL(types, u8,
(pressed)
(released))
public:
mouse_evt(types type, mouse_button button)
: base_evt(true, true)
, type_(type)
, button_(button) {}
mouse_evt(gobject target, types type, mouse_button button)
: base_evt(target, true, true)
, type_(type)
, button_(button) {}
[[nodiscard]] types type() const noexcept { return type_; }
[[nodiscard]] mouse_button button() const noexcept { return button_; }
private:
types type_ = types::pressed;
mouse_button button_ = mouse_button::left;
};
class touch_evt final : public impl::base_evt<touch_evt> {
public:
ENUM_HPP_CLASS_DECL(types, u8,
(pressed)
(released))
public:
touch_evt(types type, u32 finger)
: base_evt(true, true)
, type_(type)
, finger_(finger) {}
touch_evt(gobject target, types type, u32 finger)
: base_evt(target, true, true)
, type_(type)
, finger_(finger) {}
[[nodiscard]] types type() const noexcept { return type_; }
[[nodiscard]] u32 finger() const noexcept { return finger_; }
private:
types type_ = types::pressed;
u32 finger_ = 0u;
};
}
ENUM_HPP_REGISTER_TRAITS(e2d::touchable_events::mouse_evt::types)
ENUM_HPP_REGISTER_TRAITS(e2d::touchable_events::touch_evt::types)
namespace e2d
{
inline touchable& touchable::bubbling(bool value) noexcept {
if ( value != bubbling() ) {
math::flip_flags_inplace(flags_, fm_bubbling);
}
return *this;
}
inline touchable& touchable::capturing(bool value) noexcept {
if ( value != capturing() ) {
math::flip_flags_inplace(flags_, fm_capturing);
}
return *this;
}
inline bool touchable::bubbling() const noexcept {
return math::check_any_flags(flags_, fm_bubbling);
}
inline bool touchable::capturing() const noexcept {
return math::check_any_flags(flags_, fm_capturing);
}
}
+67 -4
View File
@@ -67,6 +67,29 @@ namespace e2d
const color32& color) = 0;
virtual bool selected() const noexcept = 0;
public:
void draw_rect(
const v2f& center,
const v2f& size,
const color32& color);
void draw_wire_rect(
const v2f& center,
const v2f& size,
const color32& color);
template < typename Iter >
void draw_wire_polygon(
Iter begin,
Iter end,
const v2f& center,
const color32& color);
template < typename Container >
void draw_wire_polygon(
Container&& container,
const v2f& center,
const color32& color);
};
};
@@ -125,6 +148,41 @@ namespace e2d
};
}
//
// inspector_creator
//
namespace impl
{
class inspector_creator;
using inspector_creator_iptr = intrusive_ptr<inspector_creator>;
class inspector_creator
: private noncopyable
, public ref_counter<inspector_creator> {
public:
inspector_creator() = default;
virtual ~inspector_creator() noexcept = default;
virtual void ensure(gobject& go) const = 0;
virtual bool exists(gobject& go) const noexcept = 0;
virtual const char* title() const noexcept = 0;
};
template < typename Component >
class typed_inspector_creator final : public inspector_creator {
public:
typed_inspector_creator() = default;
~typed_inspector_creator() noexcept final = default;
void ensure(gobject& go) const final;
bool exists(gobject& go) const noexcept final;
const char* title() const noexcept final;
};
}
//
// inspector
//
@@ -135,17 +193,22 @@ namespace e2d
~inspector() noexcept final = default;
template < typename Component >
inspector& register_component(str_hash type);
inspector& register_component(str type);
void show_for(
gobject& go);
gobject go);
void show_for(
gobject& go,
gobject go,
component_inspector<>::gizmos_context& ctx);
private:
struct inspector_impl {
impl::inspector_drawer_iptr drawer;
impl::inspector_creator_iptr creator;
};
private:
mutable std::mutex mutex_;
hash_map<str_hash, impl::inspector_drawer_iptr> drawers_;
flat_map<str, inspector_impl> inspector_impls_;
};
}
+153 -36
View File
@@ -10,62 +10,179 @@
namespace e2d
{
//
// typed_inspector_drawer
//
namespace impl
inline void component_inspector<>::gizmos_context::draw_rect(
const v2f& center,
const v2f& size,
const color32& color)
{
template < typename Component >
void typed_inspector_drawer<Component>::operator()(
gobject& go) const
{
if constexpr ( utils::is_detected<has_component_inspector, Component>() ) {
gcomponent<Component> co = go.component<Component>();
if ( !co ) {
return;
const v2f& of = center;
const v2f& hs = size * 0.5f;
draw_rect(
{of.x - hs.x, of.y - hs.y},
{of.x + hs.x, of.y - hs.y},
{of.x + hs.x, of.y + hs.y},
{of.x - hs.x, of.y + hs.y},
color);
}
inline void component_inspector<>::gizmos_context::draw_wire_rect(
const v2f& center,
const v2f& size,
const color32& color)
{
const v2f& of = center;
const v2f& hs = size * 0.5f;
draw_wire_rect(
{of.x - hs.x, of.y - hs.y},
{of.x + hs.x, of.y - hs.y},
{of.x + hs.x, of.y + hs.y},
{of.x - hs.x, of.y + hs.y},
color);
}
template < typename Iter >
void component_inspector<>::gizmos_context::draw_wire_polygon(
Iter begin,
Iter end,
const v2f& center,
const color32& color)
{
for ( Iter iter = begin; iter != end; ) {
const v2f p1 = *iter++;
const v2f p2 = (iter != end) ? *iter : *begin;
draw_line(
center + p1,
center + p2,
color);
}
}
template < typename Container >
void component_inspector<>::gizmos_context::draw_wire_polygon(
Container&& container,
const v2f& center,
const color32& color)
{
draw_wire_polygon(
std::begin(container),
std::end(container),
center,
color);
}
}
namespace e2d::impl
{
template < typename Component >
void typed_inspector_drawer<Component>::operator()(gobject& go) const {
if constexpr ( utils::is_detected<has_component_inspector, Component>() ) {
gcomponent<Component> co = go.component<Component>();
if ( !co ) {
return;
}
ImGui::PushID(co.find());
E2D_DEFER([](){ ImGui::PopID(); });
const bool inspector_opened = ImGui::CollapsingHeader(
component_inspector<Component>::title,
ImGuiTreeNodeFlags_AllowItemOverlap);
const char* component_popup_context_str_id = "e2d_component_popup_context";
if ( ImGui::BeginPopupContextItem(component_popup_context_str_id) ) {
E2D_DEFER([](){ ImGui::EndPopup(); });
auto disabled_co = co.owner().template component<disabled<Component>>();
if ( bool enabled = !disabled_co; ImGui::Checkbox("Enabled", &enabled) ) {
if ( enabled ) {
disabled_co.remove();
} else {
disabled_co.ensure();
}
}
ImGui::PushID(co.find());
E2D_DEFER([](){ ImGui::PopID(); });
ImGui::Separator();
if ( ImGui::CollapsingHeader(component_inspector<Component>::title) ) {
inspector_(co);
if ( ImGui::Button("Remove") ) {
co.remove();
return;
}
}
}
template < typename Component >
void typed_inspector_drawer<Component>::operator()(
gobject& go,
component_inspector<>::gizmos_context& ctx) const
{
if constexpr ( utils::is_detected<has_component_inspector_gizmos, Component>() ) {
gcomponent<Component> co = go.component<Component>();
if ( !co ) {
return;
{
ImGui::SameLine(
ImGui::GetWindowContentRegionMax().x -
ImGui::GetFrameHeight());
if ( ImGui::Button(ICON_FA_COG) ) {
ImGui::OpenPopup(component_popup_context_str_id);
}
}
ImGui::PushID(co.find());
E2D_DEFER([](){ ImGui::PopID(); });
if ( inspector_opened ) {
inspector_(co);
}
}
}
template < typename Component >
void typed_inspector_drawer<Component>::operator()(
gobject& go,
component_inspector<>::gizmos_context& ctx) const
{
if constexpr ( utils::is_detected<has_component_inspector_gizmos, Component>() ) {
gcomponent<Component> co = go.component<Component>();
if ( !co ) {
return;
}
ImGui::PushID(co.find());
E2D_DEFER([](){ ImGui::PopID(); });
if ( !co.owner().template component<disabled<Component>>() ) {
inspector_(co, ctx);
}
}
}
}
//
// inspector
//
namespace e2d::impl
{
template < typename Component >
void typed_inspector_creator<Component>::ensure(gobject& go) const {
go.component<Component>().ensure();
}
template < typename Component >
inspector& inspector::register_component(str_hash type) {
bool typed_inspector_creator<Component>::exists(gobject& go) const noexcept {
return go.component<Component>().exists();
}
template < typename Component >
const char* typed_inspector_creator<Component>::title() const noexcept {
return component_inspector<Component>::title;
}
}
namespace e2d
{
template < typename Component >
inspector& inspector::register_component(str type) {
std::lock_guard<std::mutex> guard(mutex_);
if ( drawers_.count(type) > 0 ) {
if ( inspector_impls_.count(type) > 0 ) {
throw bad_inspector_operation();
}
impl::inspector_drawer_iptr drawer(new impl::typed_inspector_drawer<Component>());
drawers_.emplace(type, std::move(drawer));
auto drawer = make_intrusive<impl::typed_inspector_drawer<Component>>();
auto creator = make_intrusive<impl::typed_inspector_creator<Component>>();
inspector_impls_.insert(std::make_pair(
std::move(type),
inspector_impl{
std::move(drawer),
std::move(creator)}));
return *this;
}
}
+3 -2
View File
@@ -9,6 +9,7 @@
#include "_high.hpp"
#include "asset.hpp"
#include "starter.hpp"
namespace e2d
{
@@ -66,7 +67,7 @@ namespace e2d
class library final : public module<library> {
public:
library(url root);
library(starter::library_parameters params);
~library() noexcept final;
const url& root() const noexcept;
@@ -100,7 +101,7 @@ namespace e2d
void wait_all_loading_assets_() noexcept;
private:
url root_;
starter::library_parameters params_;
std::atomic<bool> cancelled_{false};
private:
mutable asset_cache cache_;
+3 -3
View File
@@ -44,8 +44,8 @@ namespace e2d
// library
//
inline library::library(url root)
: root_(std::move(root)) {}
inline library::library(starter::library_parameters params)
: params_(std::move(params)) {}
inline library::~library() noexcept {
cancelled_.store(true);
@@ -53,7 +53,7 @@ namespace e2d
}
inline const url& library::root() const noexcept {
return root_;
return params_.root();
}
inline const asset_cache& library::cache() const noexcept {
+100 -30
View File
@@ -59,6 +59,9 @@ namespace e2d
const m4f& local_matrix() const noexcept;
const m4f& world_matrix() const noexcept;
v4f local_to_world(const v4f& local) const noexcept;
v4f world_to_local(const v4f& world) const noexcept;
node_iptr root() noexcept;
const_node_iptr root() const noexcept;
@@ -122,16 +125,6 @@ namespace e2d
node_iptr next_sibling() noexcept;
const_node_iptr next_sibling() const noexcept;
template < typename F >
void for_each_child(F&& f);
template < typename F >
void for_each_child(F&& f) const;
template < typename F >
void for_each_child_reversed(F&& f);
template < typename F >
void for_each_child_reversed(F&& f) const;
protected:
node() = default;
node(gobject owner);
@@ -158,37 +151,114 @@ namespace e2d
namespace e2d::nodes
{
template < typename Iter >
std::size_t extract_nodes(const node_iptr& root, Iter iter);
template < typename Iter >
std::size_t extract_nodes(const const_node_iptr& root, Iter iter);
class options final {
public:
options() = default;
template < typename Iter >
std::size_t extract_nodes_reversed(const node_iptr& root, Iter iter);
template < typename Iter >
std::size_t extract_nodes_reversed(const const_node_iptr& root, Iter iter);
options& reversed(bool value) noexcept;
options& recursive(bool value) noexcept;
options& include_root(bool value) noexcept;
[[nodiscard]] bool reversed() const noexcept;
[[nodiscard]] bool recursive() const noexcept;
[[nodiscard]] bool include_root() const noexcept;
private:
enum flag_masks : u8 {
fm_reversed = 1u << 0,
fm_recursive = 1u << 1,
fm_include_root = 1u << 2,
};
private:
std::underlying_type_t<flag_masks> flags_{};
};
}
namespace e2d::nodes
{
vector<node_iptr> extract_nodes(const node_iptr& root);
vector<const_node_iptr> extract_nodes(const const_node_iptr& root);
template < typename Node, typename F >
bool for_each_child(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts = options());
vector<node_iptr> extract_nodes_reversed(const node_iptr& root);
vector<const_node_iptr> extract_nodes_reversed(const const_node_iptr& root);
template < typename Node, typename F >
bool for_each_parent(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts = options());
}
namespace e2d::nodes
{
template < typename F >
void for_extracted_nodes(const node_iptr& root, F&& f);
template < typename F >
void for_extracted_nodes(const const_node_iptr& root, F&& f);
template < typename Node, typename Iter >
std::size_t extract_parents(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts = options());
template < typename F >
void for_extracted_nodes_reversed(const node_iptr& root, F&& f);
template < typename F >
void for_extracted_nodes_reversed(const const_node_iptr& root, F&& f);
template < typename Node, typename Iter >
std::size_t extract_children(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts = options());
}
namespace e2d::nodes
{
template < typename Node, typename F >
bool for_extracted_parents(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts = options());
template < typename Node, typename F >
bool for_extracted_children(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts = options());
}
namespace e2d::nodes
{
template < typename Component, typename Node, typename Iter >
std::size_t extract_components_from_parents(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts = options());
template < typename Component, typename Node, typename Iter >
std::size_t extract_components_from_children(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts = options());
}
namespace e2d::nodes
{
template < typename Component, typename Node, typename F >
bool for_extracted_components_from_parents(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts = options());
template < typename Component, typename Node, typename F >
bool for_extracted_components_from_children(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts = options());
}
namespace e2d::nodes
{
template < typename Component, typename Node >
gcomponent<Component> find_component_from_parents(
const intrusive_ptr<Node>& root,
const options& opts = options());
template < typename Component, typename Node >
gcomponent<Component> find_component_from_children(
const intrusive_ptr<Node>& root,
const options& opts = options());
}
#include "node.inl"
+281 -145
View File
@@ -8,199 +8,335 @@
#include "node.hpp"
namespace e2d
namespace e2d::nodes::impl
{
template < typename F >
void node::for_each_child(F&& f) {
for ( auto iter = children_.begin(); iter != children_.end(); ++iter ) {
f(node_iptr(&*iter));
}
}
template < typename F >
void node::for_each_child(F&& f) const {
for ( auto iter = children_.begin(); iter != children_.end(); ++iter ) {
f(const_node_iptr(&*iter));
}
}
template < typename F >
void node::for_each_child_reversed(F&& f) {
for ( auto iter = children_.rbegin(); iter != children_.rend(); ++iter ) {
f(node_iptr(&*iter));
}
}
template < typename F >
void node::for_each_child_reversed(F&& f) const {
for ( auto iter = children_.rbegin(); iter != children_.rend(); ++iter ) {
f(const_node_iptr(&*iter));
template < typename F, typename... Args >
bool invoke_with_force_bool(F&& f, Args&&... args) {
if constexpr ( std::is_invocable_r_v<bool, F, Args...> ) {
return std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
} else {
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
return true;
}
}
}
namespace e2d::nodes
{
template < typename Iter >
std::size_t extract_nodes(const node_iptr& root, Iter iter) {
std::size_t count{0u};
if ( root ) {
++count;
iter++ = root;
root->for_each_child([&iter, &count](const node_iptr& child){
count += extract_nodes(child, iter);
});
template < typename Node, typename F >
bool for_each_child(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts)
{
if ( !root ) {
return true;
}
if ( opts.reversed() ) {
for ( auto child = root->last_child(); child; child = child->prev_sibling() ) {
if ( opts.recursive() && !for_each_child(child, f, options(opts).include_root(false)) ) {
return false;
}
if ( !impl::invoke_with_force_bool(f, child) ) {
return false;
}
}
if ( opts.include_root() && !impl::invoke_with_force_bool(f, root) ) {
return false;
}
} else {
if ( opts.include_root() && !impl::invoke_with_force_bool(f, root) ) {
return false;
}
for ( auto child = root->first_child(); child; child = child->next_sibling() ) {
if ( !impl::invoke_with_force_bool(f, child) ) {
return false;
}
if ( opts.recursive() && !for_each_child(child, f, options(opts).include_root(false)) ) {
return false;
}
}
}
return true;
}
template < typename Node, typename F >
bool for_each_parent(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts)
{
if ( !root ) {
return true;
}
if ( opts.reversed() ) {
if ( root->has_parent() ) {
if ( opts.recursive() && !for_each_parent(root->parent(), f, options(opts).include_root(false)) ) {
return false;
}
if ( !impl::invoke_with_force_bool(f, root->parent()) ) {
return false;
}
}
if ( opts.include_root() && !impl::invoke_with_force_bool(f, root) ) {
return false;
}
} else {
if ( opts.include_root() && !impl::invoke_with_force_bool(f, root) ) {
return false;
}
if ( root->has_parent() ) {
if ( !impl::invoke_with_force_bool(f, root->parent()) ) {
return false;
}
if ( opts.recursive() && !for_each_parent(root->parent(), f, options(opts).include_root(false)) ) {
return false;
}
}
}
return true;
}
}
namespace e2d::nodes
{
template < typename Node, typename Iter >
std::size_t extract_parents(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts)
{
std::size_t count{0u};
for_each_parent(root, [&count, &iter](const auto& parent){
++count;
iter++ = parent;
}, opts);
return count;
}
template < typename Iter >
std::size_t extract_nodes(const const_node_iptr& root, Iter iter) {
template < typename Node, typename Iter >
std::size_t extract_children(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts)
{
std::size_t count{0u};
if ( root ) {
for_each_child(root, [&count, &iter](const auto& child){
++count;
iter++ = root;
root->for_each_child([&iter, &count](const const_node_iptr& child){
count += extract_nodes(child, iter);
});
}
return count;
}
template < typename Iter >
std::size_t extract_nodes_reversed(const node_iptr& root, Iter iter) {
std::size_t count{0u};
if ( root ) {
root->for_each_child_reversed([&iter, &count](const node_iptr& child){
count += extract_nodes_reversed(child, iter);
});
++count;
iter++ = root;
}
return count;
}
template < typename Iter >
std::size_t extract_nodes_reversed(const const_node_iptr& root, Iter iter) {
std::size_t count{0u};
if ( root ) {
root->for_each_child_reversed([&iter, &count](const const_node_iptr& child){
count += extract_nodes_reversed(child, iter);
});
++count;
iter++ = root;
}
iter++ = child;
}, opts);
return count;
}
}
namespace e2d::nodes
{
template < typename F >
void for_extracted_nodes(const node_iptr& root, F&& f) {
template < typename Node, typename F >
bool for_extracted_parents(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts)
{
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<node_iptr> nodes;
const std::size_t begin_index = nodes.size();
static thread_local vector<intrusive_ptr<Node>> parents;
try {
extract_nodes(
root,
std::back_inserter(nodes));
const std::size_t begin_index = parents.size();
E2D_DEFER([begin_index](){
parents.erase(
parents.begin() + begin_index,
parents.end());
});
const std::size_t end_index = nodes.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
f(nodes[i]);
extract_parents(
root,
std::back_inserter(parents),
opts);
const std::size_t end_index = parents.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
if ( !impl::invoke_with_force_bool(f, parents[i]) ) {
return false;
}
} catch (...) {
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
throw;
}
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
return true;
}
template < typename F >
void for_extracted_nodes(const const_node_iptr& root, F&& f) {
template < typename Node, typename F >
bool for_extracted_children(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts)
{
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<const_node_iptr> nodes;
const std::size_t begin_index = nodes.size();
static thread_local vector<intrusive_ptr<Node>> children;
try {
extract_nodes(
root,
std::back_inserter(nodes));
const std::size_t begin_index = children.size();
E2D_DEFER([begin_index](){
children.erase(
children.begin() + begin_index,
children.end());
});
const std::size_t end_index = nodes.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
f(nodes[i]);
extract_children(
root,
std::back_inserter(children),
opts);
const std::size_t end_index = children.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
if ( !impl::invoke_with_force_bool(f, children[i]) ) {
return false;
}
} catch (...) {
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
throw;
}
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
return true;
}
}
template < typename F >
void for_extracted_nodes_reversed(const node_iptr& root, F&& f) {
namespace e2d::nodes
{
template < typename Component, typename Node, typename Iter >
std::size_t extract_components_from_parents(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts)
{
std::size_t count{0u};
for_each_parent(root, [&count, &iter](const auto& parent){
if ( auto component = parent->owner().template component<Component>() ) {
++count;
iter++ = component;
}
}, opts);
return count;
}
template < typename Component, typename Node, typename Iter >
std::size_t extract_components_from_children(
const intrusive_ptr<Node>& root,
Iter iter,
const options& opts)
{
std::size_t count{0u};
for_each_child(root, [&count, &iter](const auto& child){
if ( auto component = child->owner().template component<Component>() ) {
++count;
iter++ = component;
}
}, opts);
return count;
}
}
namespace e2d::nodes
{
template < typename Component, typename Node, typename F >
bool for_extracted_components_from_parents(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts)
{
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<node_iptr> nodes;
const std::size_t begin_index = nodes.size();
static thread_local vector<gcomponent<Component>> components;
const std::size_t begin_index = components.size();
E2D_DEFER([begin_index](){
components.erase(
components.begin() + begin_index,
components.end());
});
try {
extract_nodes_reversed(
root,
std::back_inserter(nodes));
extract_components_from_parents<Component>(
root,
std::back_inserter(components),
opts);
const std::size_t end_index = nodes.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
f(nodes[i]);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
if ( !impl::invoke_with_force_bool(f, components[i]) ) {
return false;
}
} catch (...) {
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
throw;
}
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
return true;
}
template < typename F >
void for_extracted_nodes_reversed(const const_node_iptr& root, F&& f) {
template < typename Component, typename Node, typename F >
bool for_extracted_components_from_children(
const intrusive_ptr<Node>& root,
F&& f,
const options& opts)
{
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<const_node_iptr> nodes;
const std::size_t begin_index = nodes.size();
static thread_local vector<gcomponent<Component>> components;
try {
extract_nodes_reversed(
root,
std::back_inserter(nodes));
const std::size_t begin_index = components.size();
E2D_DEFER([begin_index](){
components.erase(
components.begin() + begin_index,
components.end());
});
const std::size_t end_index = nodes.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
f(nodes[i]);
extract_components_from_children<Component>(
root,
std::back_inserter(components),
opts);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
if ( !impl::invoke_with_force_bool(f, components[i]) ) {
return false;
}
} catch (...) {
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
throw;
}
return true;
}
}
nodes.erase(
nodes.begin() + begin_index,
nodes.end());
namespace e2d::nodes
{
template < typename Component, typename Node >
gcomponent<Component> find_component_from_parents(
const intrusive_ptr<Node>& root,
const options& opts)
{
gcomponent<Component> component;
for_each_parent(root, [&component](const auto& child){
if ( auto child_component = child->owner().template component<Component>() ) {
component = child_component;
return false;
}
return true;
}, opts);
return component;
}
template < typename Component, typename Node >
gcomponent<Component> find_component_from_children(
const intrusive_ptr<Node>& root,
const options& opts)
{
gcomponent<Component> component;
for_each_child(root, [&component](const auto& child){
if ( auto child_component = child->owner().template component<Component>() ) {
component = child_component;
return false;
}
return true;
}, opts);
return component;
}
}
-1
View File
@@ -49,7 +49,6 @@ namespace e2d
class starter::library_parameters {
public:
library_parameters& root(url value) noexcept;
url& root() noexcept;
const url& root() const noexcept;
private:
url root_{"resources://bin/library"};
-157
View File
@@ -47,160 +47,3 @@ namespace e2d::systems
using render_system = ecs::system<render_event>;
using post_render_system = ecs::system<post_render_event>;
}
namespace e2d::systems
{
template < typename... Ts, typename Iter, typename... Opts >
std::size_t extract_components(ecs::registry& owner, Iter iter, Opts&&... opts) {
std::size_t count{0u};
owner.for_joined_components<Ts...>(
[&iter, &count](const ecs::entity& e, Ts&... cs){
iter++ = std::make_tuple(e, cs...);
++count;
}, std::forward<Opts>(opts)...);
return count;
}
template < typename... Ts, typename Iter, typename... Opts >
std::size_t extract_components(const ecs::registry& owner, Iter iter, Opts&&... opts) {
std::size_t count{0u};
owner.for_joined_components<Ts...>(
[&iter, &count](const ecs::const_entity& e, const Ts&... cs){
iter++ = std::make_tuple(e, cs...);
++count;
}, std::forward<Opts>(opts)...);
return count;
}
}
namespace e2d::systems
{
template < typename... Ts, typename F, typename... Opts >
void for_extracted_components(ecs::registry& owner, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::entity, Ts...>> components;
const std::size_t begin_index = components.size();
try {
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
} catch (...) {
components.erase(
components.begin() + begin_index,
components.end());
throw;
}
components.erase(
components.begin() + begin_index,
components.end());
}
template < typename... Ts, typename F, typename... Opts >
void for_extracted_components(const ecs::registry& owner, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::const_entity, Ts...>> components;
const std::size_t begin_index = components.size();
try {
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
} catch (...) {
components.erase(
components.begin() + begin_index,
components.end());
throw;
}
components.erase(
components.begin() + begin_index,
components.end());
}
}
namespace e2d::systems
{
template < typename... Ts, typename Comp, typename F, typename... Opts >
void for_extracted_sorted_components(ecs::registry& owner, Comp&& comp, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::entity, Ts...>> components;
const std::size_t begin_index = components.size();
try {
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
std::sort(
components.begin() + begin_index,
components.end(),
comp);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
} catch (...) {
components.erase(
components.begin() + begin_index,
components.end());
throw;
}
components.erase(
components.begin() + begin_index,
components.end());
}
template < typename... Ts, typename Comp, typename F, typename... Opts >
void for_extracted_sorted_components(const ecs::registry& owner, Comp&& comp, F&& f, Opts&&... opts) {
//TODO(BlackMat): replace it to frame allocator
static thread_local vector<
std::tuple<ecs::const_entity, Ts...>> components;
const std::size_t begin_index = components.size();
try {
extract_components<Ts...>(
owner,
std::back_inserter(components),
std::forward<Opts>(opts)...);
std::sort(
components.begin() + begin_index,
components.end(),
comp);
const std::size_t end_index = components.size();
for ( std::size_t i = begin_index; i < end_index; ++i ) {
std::apply(f, components[i]);
}
} catch (...) {
components.erase(
components.begin() + begin_index,
components.end());
throw;
}
components.erase(
components.begin() + begin_index,
components.end());
}
}
@@ -0,0 +1,26 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
#include "_systems.hpp"
namespace e2d
{
class touch_system final
: public ecs::system<ecs::before<systems::update_event>> {
public:
touch_system();
~touch_system() noexcept final;
void process(
ecs::registry& owner,
const ecs::before<systems::update_event>& trigger) override;
private:
class internal_state;
std::unique_ptr<internal_state> state_;
};
}
+1 -1
View File
@@ -31,7 +31,7 @@ namespace e2d
gobject instantiate(const node_iptr& parent, const t2f& transform);
gobject instantiate(const prefab& prefab, const node_iptr& parent, const t2f& transform);
void destroy_instance(gobject& inst) noexcept;
void destroy_instance(gobject inst) noexcept;
void finalize_instances() noexcept;
private:
ecs::registry registry_;
+237 -41
View File
@@ -7,6 +7,7 @@
#pragma once
#include "_math.hpp"
#include "rect.hpp"
#include "trig.hpp"
#include "trs2.hpp"
#include "trs3.hpp"
@@ -414,7 +415,8 @@ namespace e2d::math
}
template < typename T, typename AngleTag >
mat4<T> make_rotation_matrix4(
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_rotation_matrix4(
const unit<T, AngleTag>& angle,
const vec3<T>& axis_xyz) noexcept
{
@@ -430,7 +432,8 @@ namespace e2d::math
//
template < typename T, typename AngleTag >
mat4<T> make_rotation_matrix4(
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_rotation_matrix4(
const unit<T, AngleTag>& roll,
const unit<T, AngleTag>& pitch,
const unit<T, AngleTag>& yaw) noexcept
@@ -455,7 +458,8 @@ namespace e2d::math
}
template < typename T >
mat4<T> make_rotation_matrix4(const vec3<T>& rpy) noexcept {
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_rotation_matrix4(const vec3<T>& rpy) noexcept {
return make_rotation_matrix4(
make_rad(rpy.x),
make_rad(rpy.y),
@@ -467,14 +471,16 @@ namespace e2d::math
//
template < typename T >
mat4<T> make_trs_matrix4(const trs2<T>& trs) noexcept {
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_trs_matrix4(const trs2<T>& trs) noexcept {
return make_scale_matrix4(trs.scale)
* make_rotation_matrix4(make_rad(trs.rotation), vec3<T>::unit_z())
* make_translation_matrix4(trs.translation);
}
template < typename T >
mat4<T> make_trs_matrix4(const trs3<T>& trs) noexcept {
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_trs_matrix4(const trs3<T>& trs) noexcept {
return make_scale_matrix4(trs.scale)
* make_rotation_matrix4(trs.rotation)
* make_translation_matrix4(trs.translation);
@@ -528,55 +534,77 @@ namespace e2d::math
{
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_lh_zo_matrix4(T width, T height, T znear, T zfar) noexcept {
E2D_ASSERT(!math::is_near_zero(width, T(0)));
E2D_ASSERT(!math::is_near_zero(height, T(0)));
make_orthographic_lh_zo_matrix4(T left, T right, T bottom, T top, T znear, T zfar) noexcept {
E2D_ASSERT(!math::approximately(left, right, T(0)));
E2D_ASSERT(!math::approximately(bottom, top, T(0)));
E2D_ASSERT(!math::approximately(znear, zfar, T(0)));
const T sx = T(2) / width;
const T sy = T(2) / height;
const T sx = T(2) / (right - left);
const T sy = T(2) / (top - bottom);
const T sz = T(1) / (zfar - znear);
const T tz = -znear / (zfar - znear);
const T tx = - (right + left) / (right - left);
const T ty = - (top + bottom) / (top - bottom);
const T tz = - znear / (zfar - znear);
return {
sx, T(0), T(0), T(0),
T(0), sy, T(0), T(0),
T(0), T(0), sz, T(0),
T(0), T(0), tz, T(1)};
tx, ty, tz, T(1)};
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_lh_no_matrix4(T width, T height, T znear, T zfar) noexcept {
E2D_ASSERT(!math::is_near_zero(width, T(0)));
E2D_ASSERT(!math::is_near_zero(height, T(0)));
make_orthographic_lh_no_matrix4(T left, T right, T bottom, T top, T znear, T zfar) noexcept {
E2D_ASSERT(!math::approximately(left, right, T(0)));
E2D_ASSERT(!math::approximately(bottom, top, T(0)));
E2D_ASSERT(!math::approximately(znear, zfar, T(0)));
const T sx = T(2) / width;
const T sy = T(2) / height;
const T sx = T(2) / (right - left);
const T sy = T(2) / (top - bottom);
const T sz = T(2) / (zfar - znear);
const T tz = -(zfar + znear) / (zfar - znear);
const T tx = - (right + left) / (right - left);
const T ty = - (top + bottom) / (top - bottom);
const T tz = - (zfar + znear) / (zfar - znear);
return {
sx, T(0), T(0), T(0),
T(0), sy, T(0), T(0),
T(0), T(0), sz, T(0),
T(0), T(0), tz, T(1)};
tx, ty, tz, T(1)};
}
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_lh_matrix4(T width, T height, T znear, T zfar) noexcept {
make_orthographic_lh_matrix4(T left, T right, T bottom, T top, T znear, T zfar) noexcept {
#if defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_ZO
return impl::make_orthographic_lh_zo_matrix4(width, height, znear, zfar);
return impl::make_orthographic_lh_zo_matrix4(left, right, bottom, top, znear, zfar);
#elif defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_NO
return impl::make_orthographic_lh_no_matrix4(width, height, znear, zfar);
return impl::make_orthographic_lh_no_matrix4(left, right, bottom, top, znear, zfar);
#else
# error "E2D_CLIPPING_MODE not detected"
#endif
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_lh_matrix4(const vec2<T>& lb, const vec2<T>& rt, T znear, T zfar) noexcept {
return make_orthographic_lh_matrix4(lb.x, rt.x, lb.y, rt.y, znear, zfar);
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_lh_matrix4(const vec2<T>& size, T znear, T zfar) noexcept {
return make_orthographic_lh_matrix4(size.x, size.y, znear, zfar);
return make_orthographic_lh_matrix4(size * T(-0.5), size * T(0.5), znear, zfar);
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_lh_matrix4(T width, T height, T znear, T zfar) noexcept {
return make_orthographic_lh_matrix4(vec2<T>(width, height), znear, zfar);
}
//
@@ -587,55 +615,77 @@ namespace e2d::math
{
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_rh_zo_matrix4(T width, T height, T znear, T zfar) noexcept {
E2D_ASSERT(!math::is_near_zero(width, T(0)));
E2D_ASSERT(!math::is_near_zero(height, T(0)));
make_orthographic_rh_zo_matrix4(T left, T right, T bottom, T top, T znear, T zfar) noexcept {
E2D_ASSERT(!math::approximately(left, right, T(0)));
E2D_ASSERT(!math::approximately(bottom, top, T(0)));
E2D_ASSERT(!math::approximately(znear, zfar, T(0)));
const T sx = T(2) / width;
const T sy = T(2) / height;
const T sx = T(2) / (right - left);
const T sy = T(2) / (top - bottom);
const T sz = T(-1) / (zfar - znear);
const T tz = -znear / (zfar - znear);
const T tx = - (right + left) / (right - left);
const T ty = - (top + bottom) / (top - bottom);
const T tz = - znear / (zfar - znear);
return {
sx, T(0), T(0), T(0),
T(0), sy, T(0), T(0),
T(0), T(0), sz, T(0),
T(0), T(0), tz, T(1)};
tx, ty, tz, T(1)};
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_rh_no_matrix4(T width, T height, T znear, T zfar) noexcept {
E2D_ASSERT(!math::is_near_zero(width, T(0)));
E2D_ASSERT(!math::is_near_zero(height, T(0)));
make_orthographic_rh_no_matrix4(T left, T right, T bottom, T top, T znear, T zfar) noexcept {
E2D_ASSERT(!math::approximately(left, right, T(0)));
E2D_ASSERT(!math::approximately(bottom, top, T(0)));
E2D_ASSERT(!math::approximately(znear, zfar, T(0)));
const T sx = T(2) / width;
const T sy = T(2) / height;
const T sx = T(2) / (right - left);
const T sy = T(2) / (top - bottom);
const T sz = T(-2) / (zfar - znear);
const T tz = -(zfar + znear) / (zfar - znear);
const T tx = - (right + left) / (right - left);
const T ty = - (top + bottom) / (top - bottom);
const T tz = - (zfar + znear) / (zfar - znear);
return {
sx, T(0), T(0), T(0),
T(0), sy, T(0), T(0),
T(0), T(0), sz, T(0),
T(0), T(0), tz, T(1)};
tx, ty, tz, T(1)};
}
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_rh_matrix4(T width, T height, T znear, T zfar) noexcept {
make_orthographic_rh_matrix4(T left, T right, T bottom, T top, T znear, T zfar) noexcept {
#if defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_ZO
return impl::make_orthographic_rh_zo_matrix4(width, height, znear, zfar);
return impl::make_orthographic_rh_zo_matrix4(left, right, bottom, top, znear, zfar);
#elif defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_NO
return impl::make_orthographic_rh_no_matrix4(width, height, znear, zfar);
return impl::make_orthographic_rh_no_matrix4(left, right, bottom, top, znear, zfar);
#else
# error "E2D_CLIPPING_MODE not detected"
#endif
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_rh_matrix4(const vec2<T>& lb, const vec2<T>& rt, T znear, T zfar) noexcept {
return make_orthographic_rh_matrix4(lb.x, rt.x, lb.y, rt.y, znear, zfar);
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_rh_matrix4(const vec2<T>& size, T znear, T zfar) noexcept {
return make_orthographic_rh_matrix4(size.x, size.y, znear, zfar);
return make_orthographic_rh_matrix4(size * T(-0.5), size * T(0.5), znear, zfar);
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, mat4<T>>
make_orthographic_rh_matrix4(T width, T height, T znear, T zfar) noexcept {
return make_orthographic_rh_matrix4(vec2<T>(width, height), znear, zfar);
}
//
@@ -847,4 +897,150 @@ namespace e2d::math
mm[2], mm[6], mm[10], mm[14],
mm[3], mm[7], mm[11], mm[15]};
}
//
// project
//
namespace impl
{
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, std::pair<vec3<T>, bool>>
project_zo(
const vec3<T>& world,
const mat4<T>& projection,
const rect<T>& viewport) noexcept
{
const vec4<T> t4 = vec4<T>(world, T(1)) * projection;
if ( math::is_near_zero(t4.w, T(0)) ) {
return std::make_pair(vec3<T>::zero(), false);
}
vec3<T> t3 = vec3<T>(t4) / t4.w;
t3.x = t3.x * T(0.5) + T(0.5);
t3.y = t3.y * T(0.5) + T(0.5);
t3.x = t3.x * viewport.size.x + viewport.position.x;
t3.y = t3.y * viewport.size.y + viewport.position.y;
return std::make_pair(t3, true);
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, std::pair<vec3<T>, bool>>
project_no(
const vec3<T>& world,
const mat4<T>& projection,
const rect<T>& viewport) noexcept
{
const vec4<T> t4 = vec4<T>(world, T(1)) * projection;
if ( math::is_near_zero(t4.w, T(0)) ) {
return std::make_pair(vec3<T>::zero(), false);
}
vec3<T> t3 = vec3<T>(t4) / t4.w;
t3.x = t3.x * T(0.5) + T(0.5);
t3.y = t3.y * T(0.5) + T(0.5);
t3.z = t3.z * T(0.5) + T(0.5);
t3.x = t3.x * viewport.size.x + viewport.position.x;
t3.y = t3.y * viewport.size.y + viewport.position.y;
return std::make_pair(t3, true);
}
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, std::pair<vec3<T>, bool>>
project(
const vec3<T>& world,
const mat4<T>& projection,
const rect<T>& viewport) noexcept {
#if defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_ZO
return impl::project_zo(world, projection, viewport);
#elif defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_NO
return impl::project_no(world, projection, viewport);
#else
# error "E2D_CLIPPING_MODE not detected"
#endif
}
//
// unproject
//
namespace impl
{
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, std::pair<vec3<T>, bool>>
unproject_zo(
const vec3<T>& screen,
const mat4<T>& inv_projection,
const rect<T>& viewport) noexcept
{
if ( math::is_near_zero(math::area(viewport), T(0)) ) {
return std::make_pair(vec3<T>::zero(), false);
}
vec4<T> t4 = vec4<T>(screen, T(1));
t4.x = (t4.x - viewport.position.x) / viewport.size.x;
t4.y = (t4.y - viewport.position.y) / viewport.size.y;
t4.x = t4.x * T(2) - T(1);
t4.y = t4.y * T(2) - T(1);
t4 = t4 * inv_projection;
return math::is_near_zero(t4.w, T(0))
? std::make_pair(vec3<T>::zero(), false)
: std::make_pair(vec3<T>(t4) / t4.w, true);
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, std::pair<vec3<T>, bool>>
unproject_no(
const vec3<T>& screen,
const mat4<T>& inv_projection,
const rect<T>& viewport) noexcept
{
if ( math::is_near_zero(math::area(viewport), T(0)) ) {
return std::make_pair(vec3<T>::zero(), false);
}
vec4<T> t4 = vec4<T>(screen, T(1));
t4.x = (t4.x - viewport.position.x) / viewport.size.x;
t4.y = (t4.y - viewport.position.y) / viewport.size.y;
t4.x = t4.x * T(2) - T(1);
t4.y = t4.y * T(2) - T(1);
t4.z = t4.z * T(2) - T(1);
t4 = t4 * inv_projection;
return math::is_near_zero(t4.w, T(0))
? std::make_pair(vec3<T>::zero(), false)
: std::make_pair(vec3<T>(t4) / t4.w, true);
}
}
template < typename T >
std::enable_if_t<std::is_floating_point_v<T>, std::pair<vec3<T>, bool>>
unproject(
const vec3<T>& screen,
const mat4<T>& inv_projection,
const rect<T>& viewport) noexcept {
#if defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_ZO
return impl::unproject_zo(screen, inv_projection, viewport);
#elif defined(E2D_CLIPPING_MODE) && E2D_CLIPPING_MODE == E2D_CLIPPING_MODE_NO
return impl::unproject_no(screen, inv_projection, viewport);
#else
# error "E2D_CLIPPING_MODE not detected"
#endif
}
}
+22 -2
View File
@@ -90,6 +90,11 @@ namespace e2d::math
return deg * deg_to_rad<T>();
}
template < typename T >
rad<T> deg_to_rad(const deg<T>& deg) noexcept {
return rad<T>(deg_to_rad(deg.value));
}
//
// rad_to_deg
//
@@ -111,6 +116,11 @@ namespace e2d::math
rad_to_deg(T rad) noexcept {
return rad * rad_to_deg<T>();
}
template < typename T >
deg<T> rad_to_deg(const rad<T>& rad) noexcept {
return deg<T>(rad_to_deg(rad.value));
}
}
namespace e2d
@@ -129,7 +139,7 @@ namespace e2d
struct unit_converter<rad_tag, deg_tag> {
template < typename T >
deg<T> operator()(const rad<T>& u) const noexcept {
return make_deg(math::rad_to_deg(u.value));
return math::rad_to_deg(u);
}
};
@@ -138,7 +148,7 @@ namespace e2d
public:
template < typename T >
rad<T> operator()(const deg<T>& u) const noexcept {
return make_rad(math::deg_to_rad(u.value));
return math::deg_to_rad(u);
}
};
}
@@ -154,11 +164,21 @@ namespace e2d::math
return u.template convert_to<deg_tag>();
}
template < typename T, typename Tag >
T to_deg_v(const unit<T, Tag>& u) noexcept {
return to_deg(u).value;
}
template < typename T, typename Tag >
rad<T> to_rad(const unit<T, Tag>& u) noexcept {
return u.template convert_to<rad_tag>();
}
template < typename T, typename Tag >
T to_rad_v(const unit<T, Tag>& u) noexcept {
return to_rad(u).value;
}
//
// cos/sin/tan
//
+12
View File
@@ -16,6 +16,9 @@
#include <3rdparty/imgui/imgui_stdlib.h>
#include <3rdparty/imgui/imgui_internal.h>
#include <3rdparty/icons/icon_fa.h>
#include <3rdparty/icons/icon_md.h>
namespace e2d::imgui_utils
{
template < typename... Args >
@@ -84,4 +87,13 @@ namespace e2d::imgui_utils
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
}
template < typename F, typename... Args >
void with_disabled_flag_ex(bool disabled, F&& f, Args&&... args) {
if ( disabled ) {
with_disabled_flag(std::forward<F>(f), std::forward<Args>(args)...);
} else {
std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
}
}
}
+1
Submodule modules/pnpoly.h added at 5ba3fd8de6
+1
View File
@@ -46,3 +46,4 @@ add_e2d_sample(04)
add_e2d_sample(05)
add_e2d_sample(06)
add_e2d_sample(07)
add_e2d_sample(08)
@@ -6,6 +6,7 @@
"camera" : {
"background" : [1.0, 0.4, 0.0, 1.0]
},
"camera.input" : {},
"camera.gizmos" : {}
}
}
+136
View File
@@ -0,0 +1,136 @@
{
"components" : {
"named" : {
"name" : "scene"
},
"scene" : {},
"behaviour" : {
"script" : "../scripts/sample_08/sample_08.lua"
}
},
"children" : [{
"prototype" : "../prefabs/camera_prefab.json",
"components" : {
"actor" : {
"rotation" : 0.5
},
"camera" : {
"viewport" : [0.0, 0.0, 0.45, 1.0]
},
"named" : {
"name" : "camera(1)"
}
}
},{
"prototype" : "../prefabs/camera_prefab.json",
"components" : {
"actor" : {
"rotation" : -0.5
},
"camera" : {
"viewport" : [0.55, 0.0, 0.45, 1.0]
},
"named" : {
"name" : "camera(2)"
}
}
},{
"prototype" : "../prefabs/ship_prefab.json",
"components" : {
"named" : {
"name" : "ship(1)"
},
"actor" : {
"translation" : [0,0],
"rotation" : 1
},
"behaviour" : {
"script" : "../scripts/sample_08/ship.lua"
},
"touchable" : {},
"circle_collider" : {
"offset" : [10,15],
"radius" : 33
}
},
"children" : [{
"prototype" : "../prefabs/ship_prefab.json",
"components" : {
"named" : {
"name" : "ship(11)"
},
"actor" : {
"translation" : [0,0],
"rotation" : 1,
"scale" : [0.5,0.5]
},
"behaviour" : {
"script" : "../scripts/sample_08/ship.lua"
},
"touchable" : {},
"circle_collider" : {
"offset" : [10,15],
"radius" : 33
}
},
"children" : []
}]
},{
"prototype" : "../prefabs/ship_prefab.json",
"components" : {
"named" : {
"name" : "ship(2)"
},
"actor" : {
"translation" : [120,100],
"rotation" : 0.2
},
"behaviour" : {
"script" : "../scripts/sample_08/ship.lua"
},
"touchable" : {},
"rect_collider" : {
"size" : [66,113]
},
"polygon_collider" : {
"offset" : [25,50],
"points" : [
[-20,0],
[0,-20],
[20,0],
[30,-50],
[-30,-50]
]
}
}
},{
"components" : {
"named" : {
"name" : "floor"
},
"actor" : {
"translation" : [0,-240]
},
"rect_collider" : {
"size" : [320, 50]
}
}
},{
"prototype" : "../prefabs/label_sdf_prefab.json",
"components" : {
"named" : {
"name" : "label"
},
"label" : {
"text" : "Hello!",
"halign" : "center",
"outline_width" : 0.5,
"outline_color" : [0,0,0,255]
},
"actor" : {
"translation" : [-80,-140],
"scale" : 1
}
}
}]
}
@@ -6,6 +6,12 @@ local camera = {
---@type boolean
disabled = false,
---@type boolean
input = false,
---@type boolean
gizmos = false,
---@type integer
depth = 0,
@@ -0,0 +1,81 @@
---@class rect_collider
local rect_collider = {
---@type boolean
enabled = true,
---@type boolean
disabled = false,
---@type v2f
size = v2f.unit(),
---@type v2f
offset = v2f.zero()
}
---@overload fun(self: rect_collider)
---@param self rect_collider
function rect_collider.enable(self) end
---@overload fun(self: rect_collider)
---@param self rect_collider
function rect_collider.disable(self) end
---@type rect_collider
_G.rect_collider = _G.rect_collider or rect_collider
---@class circle_collider
local circle_collider = {
---@type boolean
enabled = true,
---@type boolean
disabled = false,
---@type number
radius = 1.0,
---@type v2f
offset = v2f.zero()
}
---@overload fun(self: circle_collider)
---@param self circle_collider
function circle_collider.enable(self) end
---@overload fun(self: circle_collider)
---@param self circle_collider
function circle_collider.disable(self) end
---@type circle_collider
_G.circle_collider = _G.circle_collider or circle_collider
---@class polygon_collider
local polygon_collider = {
---@type boolean
enabled = true,
---@type boolean
disabled = false,
---@type v2f[]
points = {
v2f.new(-0.5, -0.5),
v2f.new( 0.5, -0.5),
v2f.new( 0.5, 0.5),
v2f.new(-0.5, 0.5)},
---@type v2f
offset = v2f.zero()
}
---@overload fun(self: polygon_collider)
---@param self polygon_collider
function polygon_collider.enable(self) end
---@overload fun(self: polygon_collider)
---@param self polygon_collider
function polygon_collider.disable(self) end
---@type polygon_collider
_G.polygon_collider = _G.polygon_collider or polygon_collider
@@ -0,0 +1,81 @@
---@class touchable
local touchable = {
---@type boolean
enabled = true,
---@type boolean
disabled = false,
---@type boolean
bubbling = true,
---@type boolean
capturing = true
}
---@overload fun(self: touchable)
---@param self touchable
function touchable.enable(self) end
---@overload fun(self: touchable)
---@param self touchable
function touchable.disable(self) end
-- -----------------------------------------------------------------------------
--
-- events
--
-- -----------------------------------------------------------------------------
--
-- input_evt
--
---@class touchable_base_evt
touchable.input_evt = {
---@type gobject
target = nil,
---@type boolean
bubbling = true,
---@type boolean
capturing = true
}
--
-- mouse_evt
--
---@class touchable_mouse_evt : touchable_base_evt
touchable.mouse_evt = {
---@type string
type = "pressed",
---@type string
button = "left"
}
--
-- touch_evt
--
---@class touchable_touch_evt : touchable_base_evt
touchable.touch_evt = {
---@type string
type = "pressed",
---@type integer
finger = 0
}
---@alias touchable_event touchable_mouse_evt | touchable_touch_evt
-- -----------------------------------------------------------------------------
--
-- globals
--
-- -----------------------------------------------------------------------------
---@type touchable
_G.touchable = _G.touchable or touchable
@@ -15,6 +15,15 @@ local gobject = {
---@type camera
camera = nil,
---@type rect_collider
rect_collider = nil,
---@type circle_collider
circle_collider = nil,
---@type polygon_collider
polygon_collider = nil,
---@type flipbook_player
flipbook_player = nil,
@@ -37,7 +46,10 @@ local gobject = {
spine_player = nil,
---@type sprite_renderer
sprite_renderer = nil
sprite_renderer = nil,
---@type touchable
touchable = nil
}
---@param self gobject
@@ -46,6 +46,34 @@ local node = {
next_sibling = nil
}
---@param self node
---@param point v4f
---@return v4f
function node.local_to_world(self, point) end
---@param self node
---@param point v4f
---@return v4f
function node.world_to_local(self, point) end
---@param self node
---@return boolean
function node.has_parent(self) end
---@param self node
---@param parent node
---@return boolean
function node.has_parent_recursive(self, parent) end
---@param self node
---@return boolean
function node.has_children(self) end
---@param self node
---@param child node
---@return boolean
function node.has_child_recursive(self, child) end
---@param self node
---@return boolean
function node.remove_from_parent(self) end
+11 -6
View File
@@ -50,15 +50,20 @@ function m4f.make_look_at_lh(eye, at, up) end
---@return m4f
function m4f.make_look_at_rh(eye, at, up) end
---@overload fun(width: number, height: number, znear: number, zfar: number): m4f
---@overload fun(size: v2f, znear: number, zfar: number): m4f
---@return m4f
function m4f.make_orthographic_lh(...) end
---@overload fun(width: number, height: number, znear: number, zfar: number): m4f
---@overload fun(left: number, right: number, bottom: number, top: number, znear: number, zfar: number): m4f
---@overload fun(lb: v2f, rt: v2f, znear: number, zfar: number): m4f
---@overload fun(size: v2f, znear: number, zfar: number): m4f
---@overload fun(width: number, height: number, znear: number, zfar: number): m4f
---@return m4f
function m4f.make_orthographic_rh(...) end
function m4f.make_orthographic_lh() end
---@overload fun(left: number, right: number, bottom: number, top: number, znear: number, zfar: number): m4f
---@overload fun(lb: v2f, rt: v2f, znear: number, zfar: number): m4f
---@overload fun(size: v2f, znear: number, zfar: number): m4f
---@overload fun(width: number, height: number, znear: number, zfar: number): m4f
---@return m4f
function m4f.make_orthographic_rh(left, right, bottom, top, znear, zfar) end
---@param angle number
---@param aspect number
@@ -0,0 +1,29 @@
local M = {}
---@param go gobject
function M:on_start(go)
the_debug:trace("sample_08: on_start")
end
---@param go gobject
function M:on_update(go)
end
---@param go gobject
---@param type string
---@param event touchable_base_evt | touchable_mouse_evt
function M:on_event(go, type, event)
if type == "touchable.mouse_evt" then
the_debug:trace(string.format(
"scene %q touched(%s %s)",
go.named and go.named.name or "---",
event.type,
event.button))
end
end
---@param go gobject
function M:on_shutdown(go)
end
return M
@@ -0,0 +1,41 @@
-- -----------------------------------------------------------------------------
--
-- private
--
-- -----------------------------------------------------------------------------
---@class ship_meta
-- -----------------------------------------------------------------------------
--
-- meta
--
-- -----------------------------------------------------------------------------
local M = {}
---@param meta ship_meta
---@param go gobject
function M.on_start(meta, go)
end
---@param meta ship_meta
---@param go gobject
function M.on_update(meta, go)
end
---@param go gobject
---@param type string
---@param event touchable_mouse_evt
function M:on_event(go, type, event)
if type == "touchable.mouse_evt" then
the_debug:trace(string.format(
"ship %q touched(%s %s) - %s",
go.named and go.named.name or "---",
event.type,
event.button,
go == event.target and "self" or "other"))
end
end
return M
+1 -1
View File
@@ -1,5 +1,5 @@
{
"texture" : "ships.png",
"pivot" : { "x" : 441, "y" : 340 },
"pivot" : { "x" : 441, "y" : 340.5 },
"texrect" : { "x" : 408, "y" : 284, "w" : 66, "h" : 113 }
}
+69
View File
@@ -0,0 +1,69 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#include "../common.hpp"
using namespace e2d;
namespace
{
class game_system final : public systems::update_system {
public:
void process(
ecs::registry& owner,
const systems::update_event& event) override
{
E2D_UNUSED(owner, event);
const keyboard& k = the<input>().keyboard();
if ( k.is_key_just_released(keyboard_key::f12) ) {
the<dbgui>().toggle_visible(!the<dbgui>().visible());
}
if ( k.is_key_just_released(keyboard_key::escape) ) {
the<window>().set_should_close(true);
}
if ( k.is_key_pressed(keyboard_key::lsuper) && k.is_key_just_released(keyboard_key::enter) ) {
the<window>().toggle_fullscreen(!the<window>().fullscreen());
}
}
};
class game final : public starter::application {
public:
bool initialize() final {
return create_scene()
&& create_systems();
}
private:
bool create_scene() {
auto scene_prefab_res = the<library>().load_asset<prefab_asset>("scenes/sample_08.json");
auto scene_go = scene_prefab_res
? the<world>().instantiate(scene_prefab_res->content())
: gobject();
return scene_go.valid();
}
bool create_systems() {
ecs::registry_filler(the<world>().registry())
.feature<struct game_feature>(ecs::feature()
.add_system<game_system>());
return true;
}
};
}
int e2d_main(int argc, char *argv[]) {
const auto starter_params = starter::parameters(
engine::parameters("sample_08", "enduro2d")
.window_params(engine::window_parameters()
.size({1024, 768}))
.timer_params(engine::timer_parameters()
.maximal_framerate(100)));
modules::initialize<starter>(argc, argv, starter_params).start<game>();
modules::shutdown<starter>();
return 0;
}
+2 -2
View File
@@ -2,8 +2,8 @@
set -e
BUILD_DIR=`dirname "$BASH_SOURCE"`/../build
mkdir -p $BUILD_DIR/Debug
cd $BUILD_DIR/Debug
pushd $BUILD_DIR/Debug
cmake -DCMAKE_BUILD_TYPE=Debug ../..
cmake --build .
ctest --verbose
cd ../..
popd
+2 -2
View File
@@ -1,11 +1,11 @@
@echo off
set BUILD_DIR=%~dp0%\..\build
mkdir %BUILD_DIR%\Debug\x64 || goto :error
cd %BUILD_DIR%\Debug\x64 || goto :error
pushd %BUILD_DIR%\Debug\x64 || goto :error
cmake ..\..\.. -A x64 || goto :error
cmake --build . --config Debug || goto :error
ctest --verbose || goto :error
cd ..\..\.. || goto :error
popd || goto :error
goto :EOF
+2 -2
View File
@@ -1,11 +1,11 @@
@echo off
set BUILD_DIR=%~dp0%\..\build
mkdir %BUILD_DIR%\Debug\x86 || goto :error
cd %BUILD_DIR%\Debug\x86 || goto :error
pushd %BUILD_DIR%\Debug\x86 || goto :error
cmake ..\..\.. -A Win32 || goto :error
cmake --build . --config Debug || goto :error
ctest --verbose || goto :error
cd ..\..\.. || goto :error
popd || goto :error
goto :EOF
+2 -2
View File
@@ -2,8 +2,8 @@
set -e
BUILD_DIR=`dirname "$BASH_SOURCE"`/../build
mkdir -p $BUILD_DIR/Release
cd $BUILD_DIR/Release
pushd $BUILD_DIR/Release
cmake -DCMAKE_BUILD_TYPE=Release ../..
cmake --build .
ctest --verbose
cd ../..
popd
+2 -2
View File
@@ -1,11 +1,11 @@
@echo off
set BUILD_DIR=%~dp0%\..\build
mkdir %BUILD_DIR%\Release\x64 || goto :error
cd %BUILD_DIR%\Release\x64 || goto :error
pushd %BUILD_DIR%\Release\x64 || goto :error
cmake ..\..\.. -A x64 || goto :error
cmake --build . --config Release || goto :error
ctest --verbose || goto :error
cd ..\..\.. || goto :error
popd || goto :error
goto :EOF
+2 -2
View File
@@ -1,11 +1,11 @@
@echo off
set BUILD_DIR=%~dp0%\..\build
mkdir %BUILD_DIR%\Release\x86 || goto :error
cd %BUILD_DIR%\Release\x86 || goto :error
pushd %BUILD_DIR%\Release\x86 || goto :error
cmake ..\..\.. -A Win32 || goto :error
cmake --build . --config Release || goto :error
ctest --verbose || goto :error
cd ..\..\.. || goto :error
popd || goto :error
goto :EOF
+13 -1
View File
@@ -6,4 +6,16 @@ cloc \
$SCRIPT_DIR/../samples/bin \
$SCRIPT_DIR/../samples/sources \
$SCRIPT_DIR/../untests/bin \
$SCRIPT_DIR/../untests/sources
$SCRIPT_DIR/../untests/sources \
$SCRIPT_DIR/../modules/curly.hpp/headers \
$SCRIPT_DIR/../modules/curly.hpp/sources \
$SCRIPT_DIR/../modules/curly.hpp/untests \
$SCRIPT_DIR/../modules/ecs.hpp/headers \
$SCRIPT_DIR/../modules/ecs.hpp/untests \
$SCRIPT_DIR/../modules/enum.hpp/headers \
$SCRIPT_DIR/../modules/enum.hpp/untests \
$SCRIPT_DIR/../modules/flat.hpp/headers \
$SCRIPT_DIR/../modules/flat.hpp/untests \
$SCRIPT_DIR/../modules/pnpoly.h \
$SCRIPT_DIR/../modules/promise.hpp/headers \
$SCRIPT_DIR/../modules/promise.hpp/untests
+8 -1
View File
@@ -2,4 +2,11 @@
SCRIPT_DIR=`dirname "$BASH_SOURCE"`
cloc \
$SCRIPT_DIR/../headers/enduro2d \
$SCRIPT_DIR/../sources/enduro2d
$SCRIPT_DIR/../sources/enduro2d \
$SCRIPT_DIR/../modules/curly.hpp/headers \
$SCRIPT_DIR/../modules/curly.hpp/sources \
$SCRIPT_DIR/../modules/ecs.hpp/headers \
$SCRIPT_DIR/../modules/enum.hpp/headers \
$SCRIPT_DIR/../modules/flat.hpp/headers \
$SCRIPT_DIR/../modules/pnpoly.h \
$SCRIPT_DIR/../modules/promise.hpp/headers
+15
View File
@@ -0,0 +1,15 @@
#!/bin/bash
SCRIPT_DIR=`dirname "$BASH_SOURCE"`
cloc \
$SCRIPT_DIR/../modules/curly.hpp/headers \
$SCRIPT_DIR/../modules/curly.hpp/sources \
$SCRIPT_DIR/../modules/curly.hpp/untests \
$SCRIPT_DIR/../modules/ecs.hpp/headers \
$SCRIPT_DIR/../modules/ecs.hpp/untests \
$SCRIPT_DIR/../modules/enum.hpp/headers \
$SCRIPT_DIR/../modules/enum.hpp/untests \
$SCRIPT_DIR/../modules/flat.hpp/headers \
$SCRIPT_DIR/../modules/flat.hpp/untests \
$SCRIPT_DIR/../modules/pnpoly.h \
$SCRIPT_DIR/../modules/promise.hpp/headers \
$SCRIPT_DIR/../modules/promise.hpp/untests
+2 -1
View File
@@ -1,9 +1,10 @@
@echo off
set BUILD_DIR=%~dp0%\..\build
mkdir %BUILD_DIR%\msvc2017 || goto :error
cd %BUILD_DIR%\msvc2017 || goto :error
pushd %BUILD_DIR%\msvc2017 || goto :error
cmake -G "Visual Studio 15 2017" ..\.. || goto :error
start enduro2d.sln || goto :error
popd || goto :error
goto :EOF
+2 -1
View File
@@ -1,9 +1,10 @@
@echo off
set BUILD_DIR=%~dp0%\..\build
mkdir %BUILD_DIR%\msvc2019 || goto :error
cd %BUILD_DIR%\msvc2019 || goto :error
pushd %BUILD_DIR%\msvc2019 || goto :error
cmake -G "Visual Studio 16 2019" ..\.. || goto :error
start enduro2d.sln || goto :error
popd || goto :error
goto :EOF
+2 -1
View File
@@ -2,6 +2,7 @@
set -e
BUILD_DIR=`dirname "$BASH_SOURCE"`/../build
mkdir -p $BUILD_DIR/xcode
cd $BUILD_DIR/xcode
pushd $BUILD_DIR/xcode
cmake -G Xcode ../..
open enduro2d.xcodeproj
popd
+2 -1
View File
@@ -2,7 +2,7 @@
set -e
BUILD_DIR=`dirname "$BASH_SOURCE"`/../build
mkdir -p $BUILD_DIR/pvs_analyze
cd $BUILD_DIR/pvs_analyze
pushd $BUILD_DIR/pvs_analyze
rm -rf pvs_report
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=On ../..
pvs-studio-analyzer analyze\
@@ -15,3 +15,4 @@ pvs-studio-analyzer analyze\
-j8
plog-converter -a GA:1,2 -t fullhtml -o pvs_report pvs_report.log
open pvs_report/index.html
popd
+36
View File
@@ -0,0 +1,36 @@
#!/bin/bash
ROOT_DIR=`dirname "$BASH_SOURCE"`/..
MODULES_DIR=$ROOT_DIR/modules
HEADERS_DIR=$ROOT_DIR/headers
SOURCES_DIR=$ROOT_DIR/sources
HEADERS_RDPARTY_DIR=$HEADERS_DIR/3rdparty
SOURCES_RDPARTY_DIR=$SOURCES_DIR/3rdparty
mkdir -p $MODULES_DIR
mkdir -p $HEADERS_DIR
mkdir -p $SOURCES_DIR
mkdir -p $HEADERS_RDPARTY_DIR
mkdir -p $SOURCES_RDPARTY_DIR
HEADERS_ICONS_DIR=$HEADERS_RDPARTY_DIR/icons
SOURCES_ICONS_DIR=$SOURCES_RDPARTY_DIR/icons
SOURCES_ICONS_BUILD_DIR=$SOURCES_RDPARTY_DIR/icons/build
mkdir -p $HEADERS_ICONS_DIR
cp -fv $MODULES_DIR/IconFontCppHeaders/IconsFontAwesome5.h $HEADERS_ICONS_DIR/icon_fa.h
cp -fv $MODULES_DIR/IconFontCppHeaders/IconsMaterialDesign.h $HEADERS_ICONS_DIR/icon_md.h
mkdir -p $SOURCES_ICONS_BUILD_DIR
cp -fv $MODULES_DIR/imgui/misc/fonts/binary_to_compressed_c.cpp $SOURCES_ICONS_BUILD_DIR/binary_to_compressed_c.cpp
wget -N -O $SOURCES_ICONS_BUILD_DIR/fa_solid_900.ttf https://github.com/FortAwesome/Font-Awesome/raw/master/webfonts/fa-solid-900.ttf
wget -N -O $SOURCES_ICONS_BUILD_DIR/fa_regular_400.ttf https://github.com/FortAwesome/Font-Awesome/raw/master/webfonts/fa-regular-400.ttf
wget -N -O $SOURCES_ICONS_BUILD_DIR/materialicons_regular.ttf https://github.com/google/material-design-icons/raw/master/iconfont/MaterialIcons-Regular.ttf
pushd $SOURCES_ICONS_BUILD_DIR
clang++ binary_to_compressed_c.cpp -o binary_to_compressed_c
./binary_to_compressed_c fa_solid_900.ttf fa_solid_900 > ../fa_solid_900.h
./binary_to_compressed_c fa_regular_400.ttf fa_regular_400 > ../fa_regular_400.h
./binary_to_compressed_c materialicons_regular.ttf materialicons_regular > ../materialicons_regular.h
popd
rm -rf $SOURCES_ICONS_BUILD_DIR
+3
View File
@@ -101,6 +101,9 @@ cp -fv $MODULES_DIR/miniz/miniz_tinfl.h $SOURCES_RDPARTY_DIR/miniz/miniz_tinfl.h
cp -fv $MODULES_DIR/miniz/miniz_zip.c $SOURCES_RDPARTY_DIR/miniz/miniz_zip.c
cp -fv $MODULES_DIR/miniz/miniz_zip.h $SOURCES_RDPARTY_DIR/miniz/miniz_zip.h
mkdir -p $SOURCES_RDPARTY_DIR/pnpoly.h
cp -fv $MODULES_DIR/pnpoly.h/pnpoly.h $SOURCES_RDPARTY_DIR/pnpoly.h/pnpoly.h
mkdir -p $HEADERS_RDPARTY_DIR/pugixml
cp -rfv $MODULES_DIR/pugixml/src/. $HEADERS_RDPARTY_DIR/pugixml/
+2 -1
View File
@@ -3,7 +3,7 @@ set -e
BUILD_DIR=`dirname "$BASH_SOURCE"`/../build
mkdir -p $BUILD_DIR/coverage
cd $BUILD_DIR/coverage
pushd $BUILD_DIR/coverage
cmake -DCMAKE_BUILD_TYPE=Debug -DE2D_BUILD_WITH_COVERAGE=ON ../..
cmake --build .
@@ -15,3 +15,4 @@ lcov -r "coverage.info" "*/usr/*" "*/Xcode.app/*" "*/untests/*" "*/samples/*" "*
lcov -l "coverage.info"
bash <(curl -s https://codecov.io/bash) || echo "Codecov did not collect coverage reports"
popd
+472
View File
@@ -0,0 +1,472 @@
// File: 'fa_regular_400.ttf' (34092 bytes)
// Exported using binary_to_compressed_c.cpp
static const unsigned int fa_regular_400_compressed_size = 22305;
static const unsigned int fa_regular_400_compressed_data[22308/4] =
{
0x0000bc57, 0x00000000, 0x2c850000, 0x00000400, 0x00010037, 0x000d0000, 0x00030080, 0x54464650, 0xb5968d4d, 0x85000076, 0x2c158210, 0x4544471c,
0x002a0046, 0x840000a0, 0x2c0f82f0, 0x2f534f1e, 0x53924132, 0x0100001b, 0x360f8258, 0x616d6360, 0xc8a0c770, 0x040000f4, 0x0300000c, 0x736167da,
0x82ffff70, 0x84002249, 0x381f82e8, 0x796c6708, 0xadda4466, 0x090000d9, 0x6e000020, 0x616568c0, 0x90071764, 0x201b827e, 0x210382dc, 0x10826836,
0x02350423, 0x204f82d1, 0x280f8214, 0x746d6824, 0x00b01278, 0x2f0f8274, 0x020000b8, 0x636f6c54, 0xcb01e861, 0x07000046, 0x01294f82, 0x78616d36,
0x00ea0070, 0x201f82af, 0x3c2f8238, 0x6d616e20, 0x34d73265, 0x77000028, 0x050000e0, 0x736f705b, 0x4169fc74, 0x7d0000bb, 0x2033823c, 0x2fdb83ab,
0x83c04a01, 0x2ad1d96c, 0xf53c0f5f, 0x00020b00, 0xda230083, 0x86bcc715, 0xffc02807, 0x02b9ffec, 0x82c90187, 0x0008210f, 0x5e821e85, 0xc0220282,
0x8382c0ff, 0xecff8022, 0x87230582, 0x8d000100, 0x84902000, 0x009a2411, 0x840e00ac, 0x00022118, 0x13843282, 0x09824020, 0x04260283, 0x9001ed01,
0x16820500, 0x66014c22, 0x47211082, 0x2a078501, 0x001900f5, 0x02000084, 0x82030500, 0x2a029215, 0x64456650, 0x04f08000, 0x8301c8f5, 0x012e2483,
0x825400cc, 0x23818426, 0xa5013a01, 0x20240b82, 0x00020100, 0xaa200086, 0xff274b83, 0x004002fb, 0x83c0010f, 0x0800230b, 0x07840002, 0x80010022,
0x02200785, 0x02219382, 0x20178400, 0x83078408, 0x201b820f, 0x212f8401, 0x1382fcff, 0x85020021, 0x82078223, 0x234b820f, 0xfdff0002, 0x17871384,
0xc9820020, 0x01202f82, 0xf884038e, 0x1b8d6020, 0x08221382, 0x1382f001, 0x47830386, 0x6b840120, 0x87080021, 0x8202203f, 0x8b238457, 0x8293834f,
0x86bf8703, 0x8c172007, 0x201f823b, 0x84039e01, 0xff0027e3, 0xfff001ff, 0xeb8402ed, 0x85faff21, 0x090f4113, 0x8f850120, 0x21082341, 0xef82c001,
0x0220e382, 0x0f83ef86, 0xfb200382, 0xf38fcb84, 0x53412386, 0x06674108, 0x27820120, 0x1383d788, 0x00202789, 0x00202b82, 0x23884f83, 0x8f413385,
0x079b4105, 0xfeff4023, 0x82178502, 0xfcff212f, 0xa30b4341, 0x8402200b, 0x82e382f3, 0x202f9843, 0x059741f8, 0x00950020, 0x16820320, 0x1c220383,
0x09820100, 0xd4020024, 0x09840300, 0x04001c24, 0x1182b802, 0x00aab408, 0x00060080, 0xf005f02a, 0xf017f007, 0xf024f022, 0xf03ef02e, 0xf059f044,
0xf070f06e, 0xf075f073, 0xf080f07c, 0xf089f086, 0xf09df094, 0xf0a7f0a0, 0xf0c8f0c5, 0xf0ebf0e0, 0xf0f8f0f3, 0xf111f1fe, 0xf11cf11a, 0xf144f133,
0xf14af146, 0xf152f14e, 0xf165f15c, 0xf192f186, 0xf1c9f1ad, 0xf1d8f1cd, 0xf1eaf1e3, 0xf2f9f1f6, 0xf249f20a, 0xf25bf24d, 0xf274f25d, 0xf28bf27a,
0xf2b6f28d, 0xf2bbf2b9, 0xf2c2f2bd, 0xf2dcf2d2, 0xf302f3ed, 0xf35bf328, 0xf4d1f3a5, 0xf4adf410, 0xf556f5da, 0xf57af567, 0xf59cf58c, 0xf5b4f5a5,
0xf5c2f5b8, 0x00ffffc8, 0x8e04f000, 0x885720ab, 0x8c7b20ab, 0x82a420ab, 0x8cc720ab, 0x8a1820ab, 0xf14d2aab, 0xf15bf150, 0xf185f164, 0x20ab8291,
0x20ab8ec1, 0x20ab8247, 0x22ab8254, 0x8479f271, 0x86b520ab, 0xf2c122ab, 0x20ab88d0, 0x28ab8e58, 0xf57ff579, 0xf5a4f596, 0x08ab87b3, 0x0fff0faa,
0x0fef0ffe, 0x0fe40fe5, 0x0fcc0fdb, 0x0fb50fc7, 0x0fa00fa1, 0x0f9d0f9e, 0x0f950f98, 0x0f8e0f90, 0x0f7c0f84, 0x0f770f7a, 0x0f590f5a, 0x0f380f42,
0x0f2d0f31, 0x0f160f28, 0x0e0f0f10, 0x0ee90ef9, 0x0ee50ee8, 0x0ee20ee3, 0x0ed30eda, 0x0eaa0eb4, 0x0e7d0e90, 0x0e700e7a, 0x0e600e66, 0x0e530e55,
0x0e070e43, 0x0dfe0d04, 0x0dea0dfd, 0x0dd60de6, 0x0dae0dd5, 0x0dab0dac, 0x0da70daa, 0x0d910d9a, 0x0d6d0d81, 0x0c190d48, 0x0ca50cd0, 0x0bcb0b67,
0x0b240b9f, 0x0a030b14, 0x0af60aff, 0x0ae20aef, 0x0ad60adf, 0x000100d1, 0x22aa0040, 0x88000601, 0x440120b0, 0x00200652, 0xcd40008b, 0xb4b88bac,
0x4056090b, 0xc4007c00, 0x6e01f800, 0xe201be01, 0x84022a02, 0x0403ce02, 0xac036203, 0xa2041a04, 0x0c05e004, 0xb6054805, 0x4e062a06, 0x1a07cc06,
0xe2076207, 0xe2086208, 0xb8095e09, 0x3a0a0e0a, 0xe80a880a, 0xce0b3a0b, 0x360c180c, 0xd00c820c, 0xe60d140d, 0x4e0e1e0e, 0xc60e880e, 0x840f440f,
0x0010c20f, 0x6e103e10, 0x3811ba10, 0x2812b611, 0xa4126612, 0x4c13ce12, 0x4414ce13, 0x0015a814, 0xbe154c15, 0x6c161c16, 0x2e17e416, 0xc8176c17,
0xa6184418, 0x6619f418, 0x981af019, 0x141bca1a, 0xec1b5a1b, 0xea1c681c, 0xdc1d441d, 0x181f941e, 0xbc1f661f, 0x66200220, 0x0821b820, 0x8e214821,
0x6422c021, 0x4c23ec22, 0x0e24be23, 0xd4246824, 0x1425fc24, 0x40264e25, 0x0827a426, 0x84274e27, 0xf027ba27, 0x6a282628, 0x2229ca28, 0xdc298029,
0xc42a4c2a, 0x7c2b342b, 0x482cfc2b, 0x102da42c, 0x062e982d, 0x062f642e, 0x2a30862f, 0x1e319a30, 0x0a32b431, 0xee326e32, 0xd6338e33, 0x92343834,
0x1e35ea34, 0x00369035, 0xc6365836, 0x60370437, 0x02000000, 0xdffffaff, 0xa5010602, 0x24001200, 0x1e010000, 0x010f0601, 0x012f2206, 0x3736012e,
0x3e171636, 0x34361701, 0x14822627, 0x2e275208, 0x14060701, 0x3716011f, 0x1824ca01, 0x10af1b16, 0x1baf102c, 0x2b241816, 0x752a2a75, 0x1e241d14,
0x23231c4f, 0x241e4f1c, 0x0303b01d, 0x551f8001, 0x10b21c4e, 0x4f1cb210, 0x09241f54, 0xe0092a2a, 0x1822571e, 0x23231d06, 0x2218061d, 0x04b21e57,
0x2c7f8304, 0xbaff0f00, 0xc1013102, 0x22001800, 0x257f8300, 0x1617010f, 0x6b822f06, 0x3f266208, 0x36262701, 0x3236023f, 0x2f37021f, 0x17010f01,
0x02173707, 0x0e0c1410, 0x2003196a, 0x11838311, 0x6a190320, 0x92140c0e, 0x09280941, 0x8b640741, 0x648b3e3e, 0x017c7c17, 0x0e260214, 0x17139267,
0x0a444409, 0x67921318, 0x1602260e, 0x84121284, 0x7e1462a2, 0x8b62147e, 0x04004242, 0xc0ff0000, 0x21018201, 0x77821300, 0x002a2108, 0x25000032,
0x011d1632, 0x21230614, 0x013d2622, 0x32333634, 0x17363216, 0x23263435, 0x22230622, 0x1d2d0583, 0x26223601, 0x16323634, 0x06222614, 0x081d8214,
0x3a01343e, 0x141c4f37, 0x1c14a0fe, 0x330d374f, 0x33623434, 0x1e390323, 0x2303391e, 0x5478ec33, 0x68547854, 0x50383850, 0x374f9038, 0x1c1c141a,
0x4f371a14, 0x1aa01010, 0x10103323, 0xb01a2333, 0x54221f82, 0x1f829c78, 0x00503834, 0xff080003, 0x01f801c8, 0x000700b8, 0x001f000f, 0x66821200,
0x6e820620, 0x36321223, 0x216e8334, 0x95832705, 0x013b2308, 0x17011d32, 0x06010f16, 0x9191ce99, 0xa6a591ce, 0x75a67575, 0x05550601, 0x430c200c,
0x07120709, 0x1682b801, 0xfece9123, 0x2f1782d1, 0x3e0da675, 0x0ca40604, 0x07308e0c, 0x000a1a0a, 0x08200082, 0xe024f782, 0xa0010002, 0x1b336582,
0x33002700, 0x47003f00, 0x57004f00, 0x32010000, 0x85111516, 0x113526ff, 0x01333634, 0x22068232, 0x82222123, 0x25332914, 0x012b1415, 0x34013d22,
0x35208082, 0x06210b96, 0x20af8314, 0x89b78636, 0xd0012107, 0xfe21fb83, 0x2c058360, 0x06069a01, 0x06066cfe, 0xc80c6a01, 0x23028e0c, 0x151e15fc,
0x0121028d, 0x055c41a0, 0x01141c22, 0xfe243d82, 0x54010670, 0xac283e82, 0x0c185c06, 0x540c180c, 0x0920058a, 0x75203a84, 0xeb82058a, 0xeb820220,
0x0002c029, 0x2800c201, 0x82003800, 0x363726df, 0x14011d16, 0x05ce4107, 0x14150723, 0x34d38206, 0x26113526, 0x17363435, 0x1417011e, 0x36071415,
0x13163233, 0x83218735, 0x3329080d, 0x2c500132, 0x162b1841, 0x6725433d, 0x093f4116, 0x09071007, 0x11151e18, 0x2702021a, 0x96672529, 0x661e3b45,
0x342d391e, 0x0806834c, 0x1c70012b, 0xf01a1c0a, 0x20280e1a, 0x0907531d, 0x96010709, 0x1c151c0e, 0x11180101, 0x07080303, 0x00ff200f, 0x202020f0,
0x002018e8, 0x289f8400, 0xc0018001, 0x13000a00, 0x057f4100, 0x11072734, 0x01333634, 0x21233411, 0x37111522, 0x1c145001, 0xff82c0c0, 0xfe062026,
0x019006ec, 0xfe330a82, 0x01707030, 0xfe1c14d0, 0x06760154, 0x548afe06, 0x82000400, 0x00022b00, 0x0f008001, 0x23001b00, 0xcb412e00, 0x0799411d,
0x37351725, 0x83011f36, 0x41152003, 0x393613a2, 0x22171722, 0x08280817, 0x08782808, 0x80015808, 0xe0fe141c, 0x8b831c14, 0xb0237c82, 0x82140106,
0x06ec227d, 0x232482f8, 0x30b12217, 0x50212787, 0x055b4300, 0x0141022e, 0x001c00c1, 0x002f002a, 0x25000037, 0x20057a41, 0x21d58206, 0xe1833526,
0x1632212c, 0x2b06010f, 0x35211101, 0xec433734, 0x36013805, 0x16011f32, 0x0f270714, 0x27133701, 0x17010f26, 0x92013637, 0x420a0420, 0x2b080804,
0x04040512, 0xf2030220, 0xfe9f6001, 0x1c145af9, 0x07010a02, 0x2b123011, 0xba3a7411, 0x2bfb4107, 0x3a1f0708, 0x2067071f, 0x91060404, 0x6023a984,
0x820a1c14, 0xa0fe2b31, 0xfecc0372, 0x1c020af9, 0x31825a14, 0x112b112c, 0xba3a3031, 0x0a010741, 0x3284072b, 0x7f430020, 0x432b200e, 0x2522117f,
0xb1831707, 0xab822f20, 0x26012f25, 0x8227013f, 0x063e4103, 0x8b431620, 0x3e2e2a0c, 0x1708083e, 0x3e3e0908, 0x20068209, 0x430d8c08, 0x91200d9c,
0x30862293, 0x00820020, 0x20181344, 0x067e4424, 0x91850720, 0x17208987, 0x012f8785, 0x7575a64b, 0x093c75a6, 0x0809ac09, 0x8209095b, 0x8e3b238b,
0x7b860908, 0x1a826120, 0x0da67528, 0x09ab0809, 0xa1845b09, 0x088d3d25, 0x44040009, 0x38220c7f, 0x01414000, 0x0e142412, 0x43011d02, 0x3d2d0534,
0x023e3401, 0x35033e37, 0x22232634, 0x0513410e, 0x33363724, 0x04441632, 0x0c124107, 0x16332508, 0x0507161c, 0x0807052e, 0x080c0a12, 0x19030908,
0x0c110b0f, 0x1c090709, 0x40250609, 0x19413f26, 0x22191922, 0x310d1c41, 0x0e20178a, 0x05060810, 0x09050707, 0x0710140c, 0x3e820506, 0x100c052d,
0x090b0c07, 0x0a071507, 0x83bb3436, 0x00192434, 0x82030000, 0x02002d03, 0x00800140, 0x00230011, 0x0100002f, 0x39058344, 0x16373435, 0x35363233,
0x05362734, 0x0e071416, 0x2e222301, 0x34262701, 0x20823e37, 0x32072308, 0x012e3736, 0x1e070622, 0x2f200102, 0x415d4141, 0x170e0d04, 0x010f0721,
0x2a03032d, 0x6f3c5b98, 0x08831c56, 0xf398b62f, 0x25257f4a, 0x257f947f, 0x015b4a18, 0x32288230, 0x0f102e41, 0x0e172107, 0x0761050d, 0x61500710,
0x84354f2d, 0x61350807, 0x43434def, 0x2c434d4d, 0x05002341, 0xc0ffffff, 0xc0018102, 0x19001300, 0x33001f00, 0x00004600, 0x14151605, 0x2306010f,
0x26012722, 0x013f3435, 0x17323336, 0x22048205, 0x82071716, 0x27262514, 0x27072237, 0x1e220e82, 0xae821701, 0x0b820620, 0x0323a182, 0x84173732,
0x20b7821c, 0x2d0a8236, 0x02011e07, 0x0a04067a, 0x04060804, 0x0886aafd, 0x0b050127, 0x02412d0c, 0x25058459, 0x2f1f1b70, 0xbf853435, 0x261f1627,
0x7f25121a, 0x2412844a, 0x032a985b, 0x29118603, 0x06070517, 0x04060c05, 0x0886d301, 0x3f028e24, 0x0382722d, 0x24079423, 0x28d08513, 0x1b1e2229,
0xfe4d4321, 0x211182e0, 0xe1825061, 0x00211086, 0x083b4708, 0x17000b32, 0x2f002300, 0x47003b00, 0x6f006700, 0x23370000, 0x23062446, 0x3714011d,
0x21093246, 0x0b8a1715, 0x0b960720, 0x3720238b, 0x290a8846, 0x3435013b, 0x1d32013b, 0x07873301, 0x03163230, 0x14112111, 0x94322133, 0x280c0c28,
0x0382600c, 0xc0200697, 0x44441b86, 0x82302007, 0x8280200f, 0x14302a03, 0xa0fe301c, 0x06540106, 0x202185a0, 0x8649830c, 0x8a88200a, 0x2361840b,
0xa0fedc0c, 0x23075144, 0x340c0c34, 0x1c2c0383, 0x2a0192fe, 0x0006d6fe, 0xfffbff02, 0x22055347, 0x43260013, 0x232e0637, 0x23062722, 0x3e372622,
0x35263702, 0xc4470534, 0x152f0805, 0x07011f14, 0x3f360706, 0x96161701, 0x6a9696d4, 0x4a412e2f, 0x020a0c10, 0x3507170f, 0x7a560001, 0x287aac7a,
0x0c080a14, 0x17141b1e, 0x82a00126, 0x2e0e3c0e, 0x11020b1d, 0x46381225, 0x845ef656, 0x33425e5e, 0x141c162a, 0x0d140a15, 0x82000c07, 0x85022000,
0x80012804, 0x1b001300, 0x48010000, 0x353009c3, 0x3b363411, 0x011f3201, 0x22233513, 0x1123012f, 0x250be445, 0x37090d93, 0x0482c7c0, 0x40018c24,
0xd645141c, 0x37092408, 0x82e0f0fe, 0x43e02004, 0x48200653, 0x15225782, 0xd5832200, 0x16322524, 0xbf45010f, 0x013b2308, 0x6a833317, 0x15253a08,
0x21333637, 0x012b3435, 0x01222327, 0x02072137, 0x0f1c1c10, 0xfe1b0e50, 0x1c1c1470, 0xa040a014, 0x50fe1c14, 0x011b0e3f, 0x40ae0618, 0x90010686,
0x4d85fe50, 0x801831e0, 0x05484617, 0x302d7d82, 0x1768e96a, 0xfe40062a, 0x008080e0, 0x2bcf8805, 0x001f000f, 0x0044002f, 0x25000054, 0x82059149,
0x441620cd, 0xdd830a80, 0x23210f84, 0x211f8d33, 0x05411723, 0x15162310, 0x248e3711, 0x058d0126, 0x16050808, 0xd6200483, 0x4a200988, 0xad2e0988,
0x07090907, 0x130d30fe, 0x07100709, 0x17883d09, 0x05086023, 0x840c83e6, 0x83c62004, 0x20048409, 0x82098386, 0x84302004, 0x0d13232e, 0x3f845001,
0x0830c024, 0x1a834605, 0x002f0482, 0xfffbff03, 0x014502e0, 0x002300a0, 0x824d0036, 0x021e24d7, 0x42061617, 0x2721062a, 0x05314226, 0x26373631,
0x33363435, 0x1e171632, 0x25141501, 0x42331617, 0x372c0d3c, 0x34353605, 0x15162726, 0x07010e14, 0x8a081c82, 0x1617013f, 0x012f2617, 0x13071402,
0x0c0a010b, 0x1e3c410f, 0x1867401e, 0x423b0e0f, 0x150a0c0f, 0x567a2c11, 0x4b186840, 0x144bfe65, 0x5f411918, 0x1e5f825f, 0x04040f18, 0x78011516,
0x0131401e, 0x3132522f, 0x14181952, 0x04161511, 0x0e3e0f04, 0x0b010d1b, 0x3607271c, 0x2703022c, 0x23140b1c, 0x5e42372b, 0x59092c36, 0x0431373c,
0x425c4206, 0x1d232e42, 0x07072018, 0x1d2f0e07, 0x0b3b2423, 0x45280208, 0x0632052c, 0x820e0b04, 0x00202e14, 0x00010000, 0x01baff0f, 0x00c00120,
0x24e38213, 0x26060715, 0x06c94b3f, 0x0f153327, 0x01071701, 0x0bba4b20, 0x3e142808, 0x3f17648b, 0x17094437, 0x0e679114, 0x84150326, 0x147e4412,
0x00008b62, 0xfffcff03, 0x010402bc, 0x002300c4, 0x82510041, 0x011e3a59, 0x16010e07, 0x0626060e, 0x022e0607, 0x26013e37, 0x3616063e, 0x36173637,
0x23188226, 0x16040e26, 0x16201882, 0x16291782, 0x37013e32, 0x3626023e, 0x20118226, 0x2035830e, 0x360f822e, 0x01363701, 0x0d0b2acf, 0x04080204,
0x443e270a, 0x25283838, 0x90361608, 0x0a352e11, 0x3311112c, 0x44463c36, 0x01060320, 0x270d820b, 0x33282a0f, 0x221d3b32, 0x23080f83, 0x090a02a0,
0x01056029, 0x010a110d, 0x08377407, 0x362ab901, 0x28250816, 0x3e443838, 0x08040b26, 0x0b0d0402, 0x692e1190, 0x0b0a2b12, 0x20030601, 0x363c4644,
0x0d821133, 0x06040926, 0x221c2107, 0x112e0e84, 0x6005010d, 0x020a0929, 0x7437080d, 0xe9820107, 0x00000530, 0x4002e0ff, 0x1000a001, 0x20001800,
0xc14a2c00, 0x011e2105, 0x300ca24b, 0x011d2217, 0x23343521, 0x013d3211, 0x33141521, 0x0a9a4b37, 0x0b8a1720, 0x0d100239, 0x141c0d16, 0x1c1420fe,
0x0606141c, 0x0606e001, 0x8a0620fe, 0x820c480c, 0x0cc02302, 0x02820c88, 0x82a00121, 0x09e54423, 0x2a06302b, 0xa0fe062a, 0x06aaaa06, 0x05024564,
0x9a820584, 0x2f06a343, 0x00800140, 0x00190015, 0x0025001d, 0x2500002d, 0x310b3c4d, 0x013e013f, 0x16322133, 0x21070517, 0x21351327, 0x1b4c2415,
0x071e4806, 0x09370222, 0x093a8e85, 0x0a170669, 0x170a0e01, 0x4ecbfe06, 0x694eaa01, 0xc00120fe, 0x13131a13, 0x05844d1a, 0x0f0cd423, 0x2fb48389,
0x970c0f89, 0x090c0c09, 0xfe70701b, 0x4d8080e0, 0x24822183, 0x00210283, 0x08d34c03, 0x55003239, 0x00005d00, 0x15163201, 0x2b020e14, 0x16070601,
0x2b010e07, 0x82262201, 0x3006830b, 0x3634013d, 0x1732013b, 0x31373233, 0x033e3736, 0x25298333, 0x36321707, 0x22823435, 0x06823420, 0x2505ce48,
0x15070607, 0x2982021e, 0x013e2722, 0x06210283, 0x05f24d34, 0x22ad013a, 0x1e170d31, 0x06022411, 0x35011404, 0x5322152e, 0x0d09030a, 0x13130d40,
0x6d080482, 0x15090309, 0x12040911, 0x2a101a0c, 0x0e560232, 0x9f0e1515, 0x0a042c1b, 0x140b0510, 0x2a111b20, 0x3d15132a, 0x08090c0a, 0xfa0a010e,
0x0e0e140e, 0x31360114, 0x171e1122, 0x220a0c0d, 0x2833281d, 0xe60c1108, 0x1808110c, 0x24060e13, 0x242f1213, 0x15760b0c, 0x07150e0e, 0x1123142c,
0x1612081f, 0x02b00424, 0x073d1214, 0x260d0f20, 0x40838a0a, 0x82000e21, 0x25ff8b00, 0x005e0056, 0xe4833500, 0x28054544, 0x1617021e, 0x3b163117,
0x20f68301, 0x07bf491e, 0x2223272b, 0x22012b06, 0x37262726, 0x220b8226, 0x82143726, 0x16062221, 0x82028317, 0x373622f4, 0x2d1a8235, 0x23022e27,
0x16141522, 0x0e222315, 0x724a0402, 0x22312d06, 0x2a320256, 0x120c1a10, 0x15110904, 0x0d25f082, 0x090b0740, 0x08fd8505, 0x22530a2e, 0x01352e15,
0x02060414, 0x30312224, 0x0a5b0e15, 0x09080e01, 0x153d0a0c, 0x1b144c18, 0x050b1420, 0x2c040a10, 0x0d079f1b, 0x9a010609, 0x3b08c084, 0x0b3122e3,
0x122f240c, 0x0e062413, 0x05081813, 0xe6060b07, 0x2808110c, 0x221d2833, 0x22310c0a, 0x260a150e, 0x07200f0d, 0xb002263d, 0x12162404, 0x23111f08,
0x05072c14, 0x0e920d0a, 0xff864083, 0x2005cb4f, 0x05ff4133, 0x3634132c, 0x011e3233, 0x1716011d, 0x07831736, 0x82061421, 0x011d220b, 0x050b4214,
0x34013d2c, 0x27343537, 0x2e272631, 0x2a833504, 0x34371722, 0x2005df4f, 0x25068222, 0x011e1415, 0x01821617, 0x013e3322, 0x07222982, 0x0283012e,
0xff861620, 0x22316a25, 0x41162716, 0x082207af, 0xb041080d, 0x1a072406, 0x410a1311, 0x262015b1, 0x230cb041, 0x31226d01, 0x40424182, 0x0e09220f,
0x0a414209, 0x0f0a0d24, 0x42420d15, 0x4c142212, 0x0e414218, 0x8507ff41, 0x00313aff, 0x005b0053, 0x26221700, 0x2306013d, 0x34352622, 0x3637033e,
0x3d363137, 0x20118201, 0x07314734, 0x1415072b, 0x14011d16, 0x27060706, 0x220b8206, 0x82322706, 0x36162220, 0x82028337, 0x272622f2, 0x281a8223,
0x15020e07, 0x36323314, 0x282c8233, 0x32161412, 0x22263436, 0x05ac41bd, 0x11130a27, 0x130e071a, 0x06af4218, 0x271fab41, 0x140e9915, 0x40140e0e,
0x24053b42, 0x0a0f150d, 0x083c420d, 0x42073843, 0x0e21283a, 0x06384215, 0x2006674e, 0x31f98201, 0x2a001b00, 0x42003900, 0x16010000, 0x06141115,
0xdb4f012b, 0x20f38308, 0x27f88435, 0x3d320317, 0x26222301, 0x24820483, 0x8d253321, 0x3513250e, 0x26012f34, 0x01253982, 0x141c0eb2, 0x06144950,
0x28080782, 0x740e14ac, 0x1c146006, 0x0106064a, 0x0a580654, 0x06066a0e, 0x023002da, 0x7e010a02, 0xf4fe140e, 0x14301c14, 0x01141c1c, 0x24088440,
0x063efe0e, 0x293c822a, 0x06ccfe06, 0x0eca0660, 0x0983580a, 0x0a000123, 0x27328202, 0x05000040, 0xe0ff0000, 0xa02ab382, 0x15001100, 0x33002b00,
0xb5873b00, 0x280a1b4f, 0x15230717, 0x35321333, 0x86938211, 0x4fb687ca, 0x904107bd, 0x14062105, 0xb645ae84, 0x140c3f06, 0x80804e0e, 0x4e02067a,
0x0ab00a0e, 0x06062a0e, 0x34344886, 0x22473448, 0x17221717, 0xae853e01, 0x35054d51, 0xfe50220e, 0x040106f0, 0x644e0202, 0x0a0e0e0a, 0xacfe0668,
0x2c82c806, 0x4c483422, 0x17242c82, 0x02000022, 0x0f21ab88, 0x055b4a00, 0x520c7c46, 0x01230b1f, 0x4f1c1490, 0x5a2108a6, 0x204b8306, 0x17bd5106,
0xaf4d0020, 0x05af5005, 0x32002022, 0x3b11ad50, 0x16152105, 0x021e1417, 0x023e3233, 0x05373635, 0x07063521, 0x2e22040e, 0x27262703, 0x080caa50,
0x60fea021, 0x0e1c6423, 0x17080817, 0x23641c0e, 0xa00160fe, 0x19024623, 0x18181a0e, 0x190e1919, 0x50234602, 0x303d0db6, 0x014e1c29, 0x0c0c0917,
0x4e011709, 0x1cbaf71c, 0x0a160137, 0x1007070f, 0x3701150a, 0x094b431c, 0x01602808, 0x000f00c0, 0x0042001d, 0x16321300, 0x22230614, 0x06141506,
0x34352622, 0x33350336, 0x010f1415, 0x22012b06, 0x8226012f, 0x14152e1d, 0x07010e07, 0x36373423, 0x34353637, 0x282a8426, 0x16171617, 0x022e2315,
0x08318327, 0x0907b032, 0x261a0709, 0x38090e09, 0x1803a028, 0x094e0905, 0x50031805, 0x0e2c6749, 0x0230071f, 0x4b202b13, 0x204c3435, 0x3002132b,
0x08141305, 0x7001652c, 0x26212b82, 0x0836831a, 0xfe382823, 0x052b2b85, 0x07072504, 0xd0010425, 0x32424967, 0x07173510, 0x24313d07, 0x4a4b3530,
0x31243036, 0x26be823d, 0x320a1d25, 0x82694742, 0xff0326c0, 0x01c0ffff, 0x28bf82c1, 0x00330025, 0x25000039, 0x26b98216, 0x2e222123, 0x82343501,
0x023e21a2, 0x3720c382, 0x32250382, 0x1e011d16, 0x05ec4402, 0x82210521, 0x343122a7, 0x23e58226, 0x16141530, 0x2e08e782, 0xb7011433, 0xfe0e1209,
0x080f0980, 0x0f020109, 0x38481411, 0x25131a13, 0x1114213a, 0x8efe020f, 0x422c3801, 0x348a425c, 0x0a568026, 0x82130d0c, 0x0c270825, 0x0f03010a,
0x3a2c4318, 0x0d150b56, 0x150d1313, 0x26422c07, 0x0f18432c, 0x643b0703, 0x42422e01, 0xcb64012e, 0x821b1b25, 0x4e0720a3, 0x4b27103f, 0x7d006100,
0x4d370000, 0x142406e0, 0x3322012b, 0x2009484e, 0x0b314e23, 0x178a1720, 0x21151722, 0x11203183, 0x8209e443, 0x323327d4, 0x33111516, 0x2d4e2532,
0x23112108, 0x23094243, 0x34352337, 0x1d295c82, 0x1d222301, 0x013b1401, 0x23038215, 0x33013d32, 0x34240382, 0x0c280c80, 0x8c200282, 0x0c210483,
0x200c8574, 0x340c844c, 0x0c40fe8c, 0x580a0e14, 0x0a700a0e, 0x0e0a580e, 0x90fe0c14, 0x21208270, 0x11844070, 0x1aba4027, 0x1a061406, 0x83028206,
0x49cc2006, 0x54200a2e, 0x34203f84, 0x7c394c85, 0x010c2424, 0x280c097b, 0x0a0e0e0a, 0xfe090c28, 0x0c430185, 0x5f01430c, 0x21108318, 0x41883018,
0x00224884, 0x7f430300, 0x001b2a08, 0x0037002b, 0x14152500, 0x82b2822b, 0x823d20c0, 0x013d23c0, 0x1a4f3b34, 0x4f322008, 0x33240b31, 0x03163221,
0x20064254, 0x250c8214, 0x580c6001, 0x0382200c, 0x60200686, 0x2308aa43, 0x301c1460, 0x2205ac43, 0x8ad00654, 0x580c2221, 0x06534494, 0x1c252182,
0x540192fe, 0x22268306, 0x52020000, 0xa5560c27, 0x0cf65110, 0x200c8956, 0x05fb4400, 0xf001c82e, 0x0700b801, 0x17000f00, 0x2f001f00, 0x57116552,
0x16380762, 0x36342622, 0x07141632, 0x011e013e, 0x27220607, 0x16013e26, 0x91321617, 0x260af756, 0x13131a85, 0x848d131a, 0x061c2f05, 0x06020f14,
0x062f942f, 0x06140f02, 0x4d526621, 0x8263200d, 0x2d028727, 0x0d02085c, 0x39390714, 0x020d1407, 0x97942708, 0x97993020, 0x30077f45, 0x16173206,
0x26060706, 0x07222627, 0x012e010e, 0x20989137, 0x2b988473, 0x06297e6f, 0x14080702, 0x1a521a06, 0x9993a384, 0x9c842d20, 0x07316d29, 0x02070614,
0x841f1f08, 0x249a82a2, 0x00000500, 0x0d3341ff, 0x41129b54, 0xd9550733, 0x16322a08, 0x012b0614, 0x36342622, 0x25969733, 0x0e0e0a28, 0x0483b00a,
0x7d218f99, 0x08634a0e, 0x8c830e20, 0x56400221, 0x37580663, 0x004b3005, 0x00630057, 0x007b006f, 0x00930087, 0x45ab009f, 0xc85611c9, 0x33142407,
0x52253221, 0xf751160f, 0x200b8b0b, 0x8b2f8a05, 0x5247af0b, 0x0223177b, 0x4c1c1410, 0x1c300584, 0x08e80114, 0x080820fe, 0xfe08e001, 0x0c1c0c92,
0x60200282, 0xfe210693, 0x211585b0, 0x07858001, 0x0786fe20, 0x14862c94, 0xd80c6223, 0x4602820c, 0xfe220d88, 0x6e8201b0, 0x08e0fe23, 0x856b838a,
0x20058c4c, 0x20178a6e, 0x84239688, 0xba0c27a7, 0x0c100c0c, 0x0082000c, 0x57450220, 0x001f2208, 0x108b4127, 0x27104653, 0x11353213, 0x33141121,
0x200bbb47, 0x061d5330, 0xfe062a24, 0xb28406a0, 0x2710f652, 0x010670fe, 0x06d6fe2a, 0x340b3357, 0x0014000c, 0x2500001c, 0x010f1416, 0x3d012e06,
0x17363401, 0x06f24d04, 0x3b4a0420, 0x74012b06, 0x09b00c0c, 0x0c180b10, 0xa25a3401, 0x07d22d0b, 0x0465071c, 0xd0090d03, 0x16070e0e, 0x440add43,
0x0b220aff, 0xd1831b00, 0xfb453720, 0x1bef440a, 0x0c0c6c26, 0x6c0c0ce8, 0x2314e544, 0x0c200ca4, 0xcc200282, 0x8a15de44, 0x000f2473, 0x41230013,
0x33291045, 0x11211101, 0x2f060725, 0x0aff5701, 0x250b4141, 0xa0fe6001, 0x79573c01, 0x0916210c, 0x830f0a49, 0x57f22024, 0x8c250980, 0x09160909,
0x2a7b8400, 0x014102c0, 0x001c00c9, 0x82590032, 0x14162e7b, 0x2606010f, 0x010e013d, 0x06161714, 0x06c34727, 0x35373636, 0x03173634, 0x22152737,
0x1415040e, 0x3e012e17, 0x36173705, 0x080e6259, 0x32013b43, 0x0714011d, 0x2b060706, 0x11152201, 0x32213314, 0x0234013d, 0x900e0e32, 0x2b313b17,
0x1c360b08, 0x1e242d28, 0x3b493035, 0x90902217, 0x2a3c3021, 0x073e1326, 0x1a100804, 0x1a29291f, 0x060a0b19, 0x0741410c, 0x080c8430, 0x03031214,
0x01060656, 0x22010654, 0x4382280e, 0x20193508, 0x20130436, 0x11292018, 0x3b2d4b19, 0x0f112128, 0x18203903, 0x90befe16, 0x08036890, 0x1a291911,
0x25162741, 0x0a0f161c, 0xbc010207, 0x07040603, 0x1c142b07, 0x2c057c4a, 0x0309040c, 0x06020a08, 0x0606acfe, 0x22f9821a, 0x44040000, 0x0d2b08e7,
0x1d001500, 0x00002500, 0x82163601, 0x250282fd, 0x36013f26, 0x065d1637, 0x02162105, 0x280e175d, 0x140c5c01, 0x0b054206, 0x26068590, 0x1a131339,
0x425a1313, 0x01280a46, 0x0c14063e, 0x42050b90, 0x5c200685, 0x1a231f83, 0x42180113, 0x6b470b83, 0x000a290b, 0x0026001a, 0x32333700, 0x21065d59,
0x8c562536, 0x0f5a470a, 0x08c67d2c, 0x08630606, 0x06066308, 0x70424b01, 0x0ff02214, 0x221f8305, 0x42800f05, 0x73421672, 0x227b860a, 0x42222325,
0x1621055d, 0x1be64206, 0x89430121, 0x9475207c, 0x8790207b, 0xa8e0207b, 0x3537257b, 0x011f3634, 0x2621fa83, 0x20f79a01, 0x215987b0, 0x79941001,
0x9a895d20, 0x961b0121, 0x00032e7c, 0x01c0ff00, 0x00c10180, 0x00140011, 0x0f074d1d, 0x32013b29, 0x1527011f, 0x4d112103, 0x012205b5, 0x825c0e72,
0xcc260807, 0x4c2e0e14, 0x682001d0, 0x01a00e0a, 0xfe140e5e, 0x1c1c14b4, 0x14a00114, 0x4c720e1c, 0x01b0fe4c, 0x680a0e20, 0x5f860500, 0x0b00c02b,
0x29001700, 0x35002c00, 0x05434900, 0x23064744, 0x011d3207, 0x20066446, 0x0be44133, 0x16247984, 0x13331527, 0x11257a86, 0xa80c2001, 0x8402830c,
0x14012104, 0x5424888a, 0x044c800e, 0xc8268883, 0x1c0c0c1c, 0xc645540c, 0x8abc2005, 0x0e542292, 0x2193873c, 0xaf5060fe, 0x01e02808, 0x002e00c0,
0x825c0054, 0x07162d93, 0x020e0716, 0x23012a23, 0x23012e22, 0x2708a550, 0x3e013b36, 0x023e3702, 0x2905a552, 0x011e3233, 0x3e071415, 0xae522701,
0x032e210a, 0x07272e82, 0x012b030e, 0x52163215, 0x042005af, 0x0807ab52, 0x1007d28b, 0x17011605, 0x10032633, 0x2f452d03, 0x0b110311, 0x13130d40,
0x1808630d, 0x0c030a1b, 0x332d1b1d, 0x28182409, 0x010f4b16, 0x160f070b, 0x011d6810, 0x0e130905, 0x07100e08, 0x0a1b161c, 0x266d190b, 0x0c0a4025,
0x0ebbfe0a, 0x140e0e14, 0x241e21a1, 0x192a1c1f, 0x0e0a1414, 0x0df00d13, 0x23200713, 0x2f3a0409, 0x17173534, 0x1a162719, 0x0a290f4e, 0x180e0e18,
0x0a133912, 0x080a120b, 0x07104708, 0xba181d25, 0x22074226, 0x07484855, 0x8505f341, 0x003622fb, 0x25fb835b, 0x2b061415, 0x05821601, 0x2724fc83,
0x2327012e, 0xac570f82, 0x33173008, 0x33013e32, 0x3233013a, 0x07161716, 0x44320416, 0x05200507, 0x35261582, 0x36232634, 0x02832726, 0x22012b2a,
0x33152306, 0x17011e32, 0x32220282, 0x1b82023e, 0xd2013533, 0x2424320e, 0x1b2d3309, 0x0b030c1d, 0x0a070a30, 0x32ff8412, 0x0b090c40, 0x2d472e0f,
0x38031003, 0x05160138, 0x845dfe10, 0x62012a9e, 0x0f0a120a, 0x0f010b07, 0x08f58208, 0x26254030, 0x0c0b196d, 0x10082822, 0x1511080e, 0xdf1d0208,
0x34221a18, 0x34351717, 0x0b043a2f, 0x1310093f, 0x130df00d, 0x33141408, 0x1e241f2c, 0x43830e68, 0x0b1f2d08, 0x180e0912, 0x100f290a, 0x26420722,
0x083623ba, 0x0a084710, 0x130d0e14, 0x04001239, 0xc0ff0000, 0xc1010102, 0x38002800, 0x48004000, 0x1422fd83, 0xd782010f, 0x012f0625, 0x83220607,
0x3f262504, 0x34262701, 0x36250483, 0x3637011f, 0x32048332, 0x37020f16, 0x27073727, 0x07172707, 0x17370717, 0x45261737, 0x05500605, 0x12ee3408,
0x040e3c12, 0x47150f0f, 0x0c2b0d28, 0x1e154728, 0x843c0e04, 0x821e2013, 0x2c0c2112, 0x35281286, 0x5b124d4d, 0x125b3434, 0xba340786, 0x563d3d56,
0x212e513d, 0xe2212e21, 0x290c2b0c, 0x0f0f1547, 0x16223988, 0x13852946, 0x11214c83, 0x82608211, 0x357f214c, 0x5c203e88, 0xf7204683, 0x3d224082,
0x40826356, 0x2e212608, 0x00020000, 0x01c0ff17, 0x00c001f4, 0x00260016, 0x26220500, 0x32333634, 0x06011e17, 0x15010e07, 0x36371614, 0x08088216,
0x06220353, 0x32331614, 0x26063736, 0x37363435, 0x6a170126, 0x186a9696, 0x09161517, 0x61251f13, 0x1522213e, 0x563b6824, 0x30567a7a, 0x84541d55,
0x40132a32, 0x0496d496, 0x0a282304, 0x3f243e12, 0x39060c50, 0x01322d1a, 0x7aac7ad0, 0x6d102429, 0x18543255, 0x12c34503, 0xa8477082, 0x45162006,
0x10201c47, 0x2007cc44, 0x14cb44b0, 0x44230121, 0x452009cc, 0x6318cb44, 0x17230bbf, 0x54000000, 0x24200630, 0x3b08a941, 0x22061416, 0x53013426,
0xa67575a6, 0xced1fe75, 0x91ce9191, 0x2f2f42d7, 0x88012f42, 0x75221182, 0x1082a5a6, 0x17ce9122, 0x2f211082, 0x5d408242, 0x59251667, 0x00006500,
0x17294f13, 0x4f0a2149, 0x33212d41, 0x10374f21, 0x114f2520, 0x0ca8260c, 0x0c0c280c, 0x181d4f58, 0x4f500121, 0xfe230a18, 0x4f2c01e0, 0x60200a06,
0x8505004f, 0x11134f05, 0x0e0ab826, 0x48fe0a0e, 0x21050d4f, 0xfb89019e, 0x28091b46, 0x003d0037, 0x004a0044, 0x1f254651, 0x0616132c, 0x06272223,
0x26270607, 0x01823637, 0x162f0582, 0x16071617, 0x14073617, 0x0637013e, 0x82142237, 0x07342d0b, 0x27263736, 0x26361706, 0x37011e07, 0x08165946,
0x0a0afa30, 0x0f1f1911, 0x0c1b2736, 0x102e0502, 0x03060d14, 0x0a050324, 0xb933190c, 0x1a080f07, 0x0301024e, 0x0a2d1e03, 0x780d0c12, 0x0e151505,
0x8a460213, 0xfe320818, 0x111f08f0, 0x11441103, 0x18160d07, 0x13302e1c, 0x0e13020f, 0x070f1f2a, 0x1105015b, 0x0eb4190e, 0x22060614, 0x0d021188,
0x030f2317, 0x04060106, 0x00820001, 0x1f470420, 0x9f52200e, 0x331725fb, 0x15011e32, 0x2405f149, 0x012f2627, 0x05a75214, 0x022e272f, 0x3b362627,
0x16173201, 0x34171415, 0x260a8537, 0x31011c17, 0x96363736, 0xdc2b08fb, 0x02060410, 0x0a02190a, 0x07020a18, 0x1203030b, 0x0a190902, 0x0e0d0302,
0x05080203, 0x13020a11, 0x09031801, 0x17020a0d, 0x99140101, 0x04d03bf7, 0x62260407, 0x2b1d0909, 0x48090811, 0x370b0909, 0x09060e38, 0x0103600a,
0x16820603, 0x07836120, 0x930a6121, 0x08cb55eb, 0x48071555, 0x172e0f0d, 0x06071632, 0x06161707, 0x2722012b, 0xf4852726, 0x013f2622, 0x1720e987,
0x3320db82, 0xd431dc96, 0x23040707, 0x07042e0b, 0x03071d07, 0x110c1b02, 0x22088203, 0x852e0407, 0x09042611, 0x03140913, 0x18cc4107, 0x060cb02c,
0x064e113d, 0x3703060c, 0x06821f1b, 0x0b834e20, 0x16281224, 0xc8820624, 0x48077348, 0x362207d3, 0xb5413e00, 0x05cb431f, 0x14151626, 0x012a060e,
0x2706ab52, 0x36323337, 0x012b2634, 0x4839c096, 0x231c450c, 0x090b0604, 0x08100a0f, 0x0507020f, 0x18300c18, 0x0b0d0d0b, 0x35b59818, 0x0ca89cfe,
0x120b1d25, 0x05060b0d, 0x052f0102, 0x170f6307, 0x2349000e, 0x22af8708, 0xa1300028, 0x363721af, 0x46063766, 0xa6960786, 0x0828202e, 0x08582808,
0x28c41808, 0x1c281c1c, 0x90219b99, 0x21298740, 0x2882f080, 0x00281c23, 0x08fb420a, 0x0700033d, 0x0f000b00, 0x24002100, 0x40003100, 0x50004c00,
0x33130000, 0x15372315, 0x82073523, 0x21028207, 0xba683735, 0x013b240c, 0x49071732, 0x278209bd, 0x3711233c, 0x010e1617, 0x3f262223, 0x15333501,
0x32063233, 0x2e343536, 0x010e2201, 0x48831415, 0x20208024, 0x00822040, 0xd2204022, 0x080b654a, 0x044c1e22, 0x300e0a68, 0x12925020, 0x101a0d03,
0x13051f19, 0x2d0a1620, 0x0f09131b, 0x40090e12, 0x20200120, 0x37823982, 0x4a1e2021, 0x26200c85, 0x3307f049, 0x60fe1010, 0x1d1057c6, 0x61182712,
0x10862020, 0x070d070b, 0x0b230282, 0x412020b6, 0xc020087b, 0x2206ff4a, 0x413d002f, 0x1422207b, 0xc4582f06, 0x36342d05, 0x3637013b, 0x36171516,
0x3e262734, 0x20053164, 0x172f422e, 0x050f9037, 0x07051c24, 0x241c0507, 0x07290f05, 0x18090a07, 0x0b14140c, 0x19e4421a, 0x08acfe3c, 0x07240606,
0x08043805, 0x08060624, 0x07140759, 0x0a061b0a, 0x0b153a15, 0x9b441808, 0x20bb870a, 0x24b99f37, 0x1d163617, 0x55bd8301, 0xc183088c, 0x14823220,
0x2a163c42, 0x141407e5, 0x080c3507, 0x840c0868, 0x183d4204, 0x0808cd29, 0x080b700b, 0x86253408, 0x080c2429, 0x42060025, 0x1233083f, 0x27002400,
0x3c003000, 0x00004d00, 0x010f1637, 0x4f222306, 0x152007bd, 0x3a420e82, 0x3711211c, 0x2406f567, 0x36013f26, 0x4d048317, 0x2f22051b, 0x0c823501,
0x06069632, 0x03040311, 0x07073903, 0x11060739, 0xfd210606, 0x27113c42, 0x0918a2a0, 0x09023703, 0x21200584, 0x06203182, 0x2f872c82, 0x07066331,
0x36030312, 0x07360606, 0x06011207, 0x42de1d06, 0xfe281546, 0x0207fa60, 0x0309bc09, 0x08210583, 0x2135824f, 0x358a0707, 0xef820020, 0x24097f48,
0x0016000e, 0x24f5821d, 0x0400002b, 0x05455522, 0x32160526, 0x27062737, 0x08053b4b, 0x17321632, 0x07273436, 0x26270716, 0x36170722, 0x14060717,
0x37263717, 0x91ce6701, 0xfe91ce91, 0x2f702fa1, 0x82323235, 0x2f2f422f, 0x1d1d8a42, 0x0f151535, 0xdd201285, 0x38200c84, 0x91222482, 0x0b8444ce,
0x23835520, 0x8b172f21, 0x082b861e, 0x0000007a, 0xfffeff03, 0x010502be, 0x001500c9, 0x00210018, 0x16360100, 0x07060307, 0x2f222306, 0x010e0701,
0x27013d26, 0x1737012e, 0x13172737, 0x36371705, 0x01010f16, 0x04321ab8, 0x0b14043c, 0x70090a0c, 0x20290e2b, 0x1a041c72, 0xd52525a8, 0x6c60fe3b,
0x08150bd3, 0x0eba018c, 0x7cfe1e21, 0x03060b17, 0x04113b2e, 0x3054161c, 0xda0f3c0b, 0x01240f32, 0xb92df083, 0xca0c1309, 0x00357a82, 0xffecff06,
0x010402c8, 0x001000b8, 0x00200019, 0x002e0027, 0x20818235, 0x2a7e8416, 0x36262726, 0x32333637, 0x8207011e, 0x27372907, 0x3717010f, 0x15072726,
0x06278a82, 0x37011f07, 0x82370335, 0x1f1632a1, 0x013f1601, 0x01072327, 0x615e20e4, 0x844f2726, 0x08078419, 0x485f342d, 0x15050c3a, 0x19472701,
0x3d25342c, 0xd647402f, 0x470a263c, 0x182b5d40, 0x25012747, 0x16403a65, 0x012b4f2c, 0x20b7620d, 0x834d5e0c, 0x2a260805, 0x0a10f54e, 0x16252f2a,
0x34f23d4c, 0x2f4a1a14, 0x34147d16, 0x4a2f1635, 0x4a3ee0fe, 0x343f2517, 0x30131349, 0xb8823d3d, 0x03820920, 0x6805cb68, 0x2b200537, 0x22065d67,
0x525f0053, 0x3b30108b, 0x33013e01, 0x3d321403, 0x11012301, 0x07141121, 0x240b1f53, 0x35331527, 0x0a254a07, 0x220b5b59, 0x5234013d, 0x2b23051d,
0x8a152201, 0x02200823, 0x0e0e0a28, 0x1710fe0a, 0x2b0a0e21, 0x400f1905, 0xe0011010, 0x3d0160fe, 0x0c880c0c, 0x78506c0c, 0x88250683, 0x680cc00c,
0x21028e0c, 0x37828001, 0x0e0ab026, 0x10011721, 0x12314382, 0x0808b8fe, 0x0100fff8, 0x04e8fe20, 0x600c7804, 0x2602820c, 0x8c282850, 0x870c0c18,
0x849c2002, 0x843c2008, 0x00260805, 0xf9ff0400, 0x8702b9ff, 0x0b00c701, 0x38001e00, 0x00004000, 0x010f1605, 0x26012706, 0x1736013f, 0x21173313,
0xc15a2622, 0x35042805, 0x22370617, 0x5a362707, 0x17210bc6, 0x231d8227, 0x03263431, 0x332c2582, 0x02010e14, 0x0a0a0c7a, 0xaafd0c0a, 0x2e080684,
0xfe3eb680, 0x09120ee8, 0x09080201, 0x2e090910, 0x1d227c09, 0x13261f26, 0x3a25131a, 0x033b0e21, 0x261a2e42, 0x171e1180, 0x0c0c0d0a, 0x84d3010a,
0x94fe2406, 0x820d1330, 0x09022d0d, 0x2a1a1a0a, 0xe5442318, 0x08191d13, 0x3009db5a, 0x172f2637, 0x422e0116, 0x1b2560fe, 0x00111e11, 0x0e436c00,
0x43583420, 0x5f052011, 0x01260693, 0x16173233, 0xde831415, 0x2223262e, 0x1415010e, 0x37323316, 0x011f1636, 0x99201582, 0x3c0bbb52, 0x3d3f2933,
0x2840244f, 0x0204263b, 0x1c0b0712, 0x12241821, 0x1e24242a, 0x14040a04, 0x0db85702, 0x5129103e, 0x2540273c, 0x03050423, 0x090b1d03, 0x16251516,
0x041b3222, 0x041b0401, 0x04000404, 0x00219f82, 0x05735d02, 0x33001b24, 0x4d424b00, 0x0cef6f10, 0x0716372b, 0x3526010e, 0x17163634, 0x20a68416,
0x21a38206, 0xa0823637, 0x17201794, 0x200c955d, 0x05e36f9a, 0x0403c137, 0x4140521a, 0x02031952, 0x1e060411, 0x051f3d40, 0x0303d204, 0x2913851b,
0x05041201, 0x1e3e401f, 0x19570406, 0x07596e0f, 0x0404562c, 0x2f36051c, 0x1903342e, 0x27820303, 0x22151828, 0x051b1725, 0x17961b06, 0x64090021,
0x2b220807, 0xe3822f00, 0x3b00372a, 0x63004f00, 0x6f006700, 0x2322ed82, 0xee513311, 0x65212008, 0x1120091b, 0x2009b16a, 0x070a4321, 0x33152724,
0x03822135, 0x23351124, 0x03822115, 0x24842720, 0x44843484, 0x33212882, 0x894c8827, 0x20378340, 0x262f8217, 0x15012b14, 0x820cf401, 0x0c482500,
0x480cc0fe, 0x0b840882, 0x82400121, 0x20402a0b, 0x202040fe, 0x0820c001, 0x821c830c, 0x25168218, 0xc80c0c18, 0x0483540c, 0x6090b829, 0x014c0c38,
0x8a00ff40, 0x820b8a37, 0x2020243b, 0x822080fe, 0x01402200, 0x203d8200, 0x8229820c, 0x0cc02506, 0x340c0ca8, 0x18280484, 0x70b07070, 0x00180c4c,
0x21080082, 0xff00000a, 0x014002e0, 0x004300a0, 0x004b0047, 0x0053004f, 0x006b0067, 0x008b0087, 0x2500008f, 0x15411523, 0x41232009, 0xc4850915,
0x20054c4e, 0x5de08935, 0xe0830753, 0xf5830b88, 0x33150324, 0x34820535, 0x03821320, 0x19841720, 0x51843584, 0x15216182, 0x20178217, 0x8b128625,
0x820b8370, 0x8333202e, 0x213b831f, 0x35413402, 0x84e02005, 0x415820fc, 0x10890902, 0xf982e020, 0x82c0fe21, 0xe0402104, 0x04842b83, 0x01208026,
0x580c0c38, 0x48200f82, 0xe0220583, 0x1f82340c, 0x89a0e021, 0x8418203e, 0x2310911a, 0x00ff2020, 0x20222a82, 0x06820120, 0x0c0cd823, 0x822782a0,
0x20942304, 0x0a824020, 0x3b837f85, 0x85400c21, 0x0aab5522, 0x2106b354, 0x166b1425, 0x21332a0a, 0x03151632, 0x21132337, 0x26d58211, 0x01013b36,
0x61540ec0, 0x802b0b75, 0xfe504c4c, 0x0a0ee0a0, 0x82146468, 0x050d5719, 0xfe141c2c, 0x10014ca4, 0x0a68a0fe, 0x0082000e, 0x0000032e, 0x0002c0ff,
0x1900c001, 0x34002800, 0x2108a943, 0xca5f012b, 0x35262105, 0x2107f15e, 0xc4621333, 0x7325200d, 0x92430ab2, 0x82302005, 0x14c0245c, 0x82141c1c,
0x06da2d08, 0x2a1c14e0, 0x94010606, 0xccfe0606, 0xc0200782, 0xbf621c85, 0x30fe210b, 0x210abe62, 0x28843401, 0x01219388, 0x2c938280, 0x002b0025,
0x01000031, 0x1e070614, 0x053d4201, 0x42212321, 0x34260529, 0x012e3736, 0x0c832335, 0x3221332b, 0x2314011d, 0x32161421, 0x31ae8236, 0x15062226,
0x2f327001, 0x0c04322f, 0x0c98fe0c, 0x0b86040c, 0x82680121, 0x4bcc230f, 0x02824b6a, 0x3f900127, 0x731e1e73, 0x0522463f, 0x4c250b8b, 0xfe4c6c6c,
0x83058360, 0x0002318b, 0x02e0ff00, 0x00a10100, 0x00700029, 0x16360100, 0x0f226a82, 0x594a0601, 0x3c352606, 0x26342605, 0x05f1642f, 0x013e172c,
0x17323617, 0x35171636, 0x21872634, 0x82013d21, 0x5433820b, 0x26210767, 0x210c9006, 0x40852223, 0x1f211a84, 0x08618201, 0x34353328, 0x0136013f,
0x09432499, 0x0d13042b, 0x01130dfc, 0x27620101, 0x49022338, 0x16401624, 0x1a483a18, 0x0707091a, 0x06910907, 0x05062208, 0x1a1a0507, 0xdc146117,
0x01052b08, 0x282c1071, 0x64151872, 0x130d2109, 0x08040d13, 0x03030505, 0x3d4b8202, 0x39342255, 0x29082c23, 0x17171428, 0x72cf0d0e, 0x0f0d0d10,
0x07090907, 0x0d0d111a, 0x09831b10, 0x0e102825, 0x8829100d, 0x07742713, 0x04060409, 0x28832908, 0x141e392c, 0x0a1a1155, 0x64121407, 0x0082000c,
0xfcff022c, 0xc001bfff, 0x1d00c101, 0x23415900, 0x010e2109, 0x2d05b762, 0x17363736, 0x17363435, 0x3617013e, 0x0a821516, 0x82120241, 0x41262029,
0x38081529, 0x012e012f, 0x1f14010e, 0x36373301, 0x2e1d7501, 0x11031e05, 0x0a11de0c, 0x16081077, 0x2033211d, 0x1f145012, 0x13121b34, 0x07060709,
0x09121309, 0x0a060707, 0x060a1212, 0x080d8307, 0x1b07162e, 0x070a0c04, 0x1bca7304, 0x054f0104, 0x17841e29, 0x0e0b8316, 0x3716a90d, 0x7e0c1510,
0x24082821, 0x29082502, 0x0c84d121, 0x4c0d0a0a, 0x9a25ed83, 0x0c0a0b0c, 0x2009839b, 0x200983bc, 0x200983bd, 0x2d098399, 0x09070cce, 0x04030626,
0xa2060c09, 0xf7841177, 0x08061b42, 0x2000a62d, 0x00005d00, 0x37262205, 0x2337012e, 0x36342622, 0x2e271733, 0x1f013e01, 0x011f3601, 0x14011d16,
0x06010f06, 0x32332723, 0x8236013f, 0x012f22e6, 0x071a4c26, 0x17060723, 0x24228616, 0x0622012b, 0x0a776e16, 0x23200c89, 0x3d081882, 0x28220001,
0x0311100a, 0x2b2b1f58, 0x1d4f5e1f, 0x1d381618, 0x62312b91, 0x77171d22, 0x46460807, 0x0f770202, 0x0a0f6209, 0x03070516, 0x0a17a603, 0x0203130b,
0x07090a9c, 0x0e0e10b6, 0xc583b610, 0xe3821c20, 0x831c0c21, 0x08088209, 0x2036203d, 0x2b14230a, 0x13092b3c, 0x1838380b, 0x1c35380b, 0xcd271337,
0x1b052517, 0x1b013002, 0x0bcd0f03, 0x0c083705, 0x4001061b, 0x0c151409, 0x043b0201, 0x0a060c0b, 0x060a1919, 0x41090707, 0xb765086e, 0x40022a05,
0x1c00a001, 0x00004100, 0x23ec8225, 0x26273523, 0x2627cb82, 0x3b363435, 0x57233701, 0x3323055d, 0x66173221, 0x232505f6, 0x011d2221, 0x23e88414,
0x020e010f, 0x06222982, 0xf6821415, 0x011f6508, 0x011d011e, 0xe0132d02, 0x84040464, 0x24342117, 0x21c41272, 0x0117212f, 0x76152726, 0x0d07920c,
0x1308dafe, 0x1613d50d, 0x0e041807, 0x11720912, 0x0d840817, 0x110e630d, 0x7c241d9d, 0x21022648, 0x30342417, 0x1708212f, 0x91fe2121, 0xe212154c,
0x0d08080b, 0x40121f13, 0x17080e09, 0x27050811, 0x180f1805, 0x2e07b741, 0x010102c0, 0x003300c3, 0x01000067, 0x82141516, 0x2b012f89, 0x022e2202,
0x022e012f, 0x36373435, 0x2d562717, 0x38c48205, 0x011e3637, 0x3e37011f, 0x1e323302, 0x07361702, 0x0f062636, 0x3f260601, 0x20088501, 0x25328222,
0x011f0601, 0x08870616, 0x82141521, 0x0e26210a, 0xc9083482, 0x023b011e, 0x01373632, 0x3a020bf5, 0x6b2a4909, 0x1c1e0c01, 0x065c091a, 0x1c14060b,
0x28031828, 0x1721011c, 0x041a2615, 0x1603050e, 0x0f06101f, 0x2b051518, 0x1c16040f, 0x1b031904, 0x16031d02, 0x0320031c, 0x042f041a, 0x2b04161c,
0x20041c03, 0x05151d04, 0x04090a24, 0x061c0b34, 0x2b0d5b0a, 0x1a6b0111, 0x4c01062e, 0x09081512, 0x073a28f2, 0x56090f0b, 0x09141306, 0x081e151d,
0x1c0a0b52, 0x0403032b, 0x05062a18, 0x36111c0d, 0x101b1017, 0x11190903, 0x13105202, 0x0e681007, 0x118b0d07, 0x9b100813, 0x0fb80d0d, 0xa50f1407,
0x690e080e, 0x0f140510, 0x0524227a, 0x0c300304, 0x560c1a0b, 0x1924110c, 0xff050000, 0xf369fffc, 0x001e2805, 0x0070005e, 0x438c0080, 0x322818e5,
0x36011d16, 0x05163617, 0x1622ff84, 0xf242013b, 0x06262206, 0x09116b15, 0x21080044, 0xf443012e, 0x010e2107, 0x220c0244, 0x6a351727, 0x0e210841,
0x201a8302, 0x20108937, 0x4c0f8606, 0x2b080857, 0x39216601, 0x25051b02, 0x1422b217, 0x1608106d, 0x3727211d, 0x15172127, 0x07f9fe2d, 0x6d060715,
0x0fb20906, 0x12011b03, 0x05070413, 0x27072544, 0x12040804, 0x04070512, 0x29062744, 0x06060844, 0x04020806, 0x06820305, 0x0c824c20, 0x09090523,
0x230a8205, 0x0e060e4b, 0x2b080282, 0x280c0d01, 0x07085423, 0x1c1d1777, 0x1037169a, 0x1ca10c15, 0x4a1c2727, 0x0b0a1805, 0x12040a77, 0x0f089a0a,
0x54020277, 0x0c0a0a0c, 0x09225982, 0x09831507, 0x09071522, 0x23200c82, 0x23200a83, 0xaf201584, 0xf12e0a83, 0x5209070c, 0x09090760, 0x06036007,
0x06820304, 0x04840b84, 0x60101027, 0xff020010, 0x066f41fa, 0x5e00232a, 0x36010000, 0x011d011e, 0x2805a242, 0x012f2201, 0x26273726, 0x05944236,
0x36342726, 0x011d1632, 0x42267146, 0x0f24099f, 0x011f0601, 0x3f069c41, 0x28156a01, 0x051b0219, 0x27cd1725, 0x351c3713, 0x1c180b38, 0x071f2514,
0x3c2b0913, 0x3023142b, 0x2208eb43, 0x44070709, 0x38080500, 0x3b040b0c, 0x06131c06, 0x1b060140, 0x0537080c, 0x030fcd0b, 0x0001011b, 0x16230e07,
0x77070846, 0x62221d17, 0x1d912b31, 0x05070b38, 0x5e4f1319, 0x1f2b2b1f, 0x96110358, 0x44fd8346, 0x9d440d89, 0x9c0a3407, 0x1016030f, 0x070303a6,
0x0f0a1605, 0x770f0962, 0x78000002, 0x2c220d27, 0xe54c3500, 0x42162012, 0x2f200555, 0x3407cc54, 0x34013d26, 0x32013b36, 0x16071415, 0x34353227,
0x012b012e, 0x0ce64c15, 0x0302363a, 0x072b0306, 0x07203003, 0x08042705, 0x664f0408, 0x203a0228, 0x1b101205, 0x200de44c, 0x348c8223, 0x545a0603,
0x05070705, 0x550705f8, 0x29031633, 0x080d0a21, 0x0d076d40, 0x3b001b24, 0x2f674300, 0x101a6329, 0x61763320, 0x50012509, 0x180c4c0c, 0x06860382,
0x48767020, 0x8a9c2019, 0x4c0c2226, 0x1a3176a8, 0x03000024, 0x4f420000, 0x000b2606, 0x0033002b, 0x0bbb4f00, 0x2627fd76, 0xc80c0c7c, 0x997c0c0c,
0x82782091, 0x200282b9, 0x8a8a9cd8, 0x0737418b, 0x7a060721, 0x0f2314e7, 0xa7161701, 0x38012a9b, 0x36080911, 0x11090836, 0x20068308, 0x200d8c08,
0x20b29980, 0x862f9349, 0xa7fe203d, 0x001f24c7, 0x4e370027, 0xe64110e1, 0x07016510, 0x651bcf63, 0x1f2f0d11, 0x4b08098e, 0x08170909, 0x086f2c09,
0x65091609, 0xc92b1d22, 0x4b09088e, 0x08170809, 0x636e2d08, 0x002205e2, 0x8f4d0004, 0x00212607, 0x002a0025, 0x21a5872f, 0x7e48010e, 0x07290806,
0x26222306, 0x3e341135, 0x36013f01, 0x011f3233, 0x11053637, 0x37011117, 0x05071133, 0x11230711, 0x0a063002, 0x98050a05, 0x2300820a, 0x0303aaac,
0xfe3f0d8c, 0xd0fe80b3, 0x0180017f, 0x01017fe0, 0xfe0709a0, 0x0a0c06a6, 0x03033502, 0x09013f3d, 0x895a0107, 0xfe3a310d, 0x1e012ee2, 0x012fe6fe,
0x01fe2c1e, 0xe2fe2f21, 0x24098747, 0x00c00100, 0x299d8216, 0x16320100, 0x06141115, 0x9583012b, 0x85013d21, 0x33362999, 0x26341101, 0x06222123,
0x16341b82, 0x3f15013b, 0x36323301, 0x261ac001, 0x7d901a26, 0x600c0403, 0x01210983, 0x087d8290, 0x09078020, 0x43900709, 0x0907a00d, 0x1a26c001,
0x261ae0fe, 0x540c025e, 0x20011a26, 0xa0fe261a, 0x1f832001, 0x07e0fe27, 0x0a323c09, 0x447f8309, 0x216a0d5f, 0x56252014, 0x07200e41, 0x59440f8e,
0x0928230c, 0x63833007, 0x70200482, 0x54440a89, 0x82a3200d, 0x0709219d, 0x8b83048d, 0x20107f7d, 0x0ed26600, 0x798e1720, 0x64f80121, 0xb3200b54,
0x01215389, 0x0ad45127, 0x69887820, 0x32086482, 0xff000005, 0x018002ff, 0x00230080, 0x004c002b, 0x006e0066, 0x11330100, 0x35262223, 0x010f0623,
0x0627010e, 0x06272223, 0x23012f26, 0x2b010e14, 0x5b331101, 0x002005bf, 0x20070861, 0x054b5536, 0x3626272e, 0x2223013f, 0x23072306, 0x16173315,
0x17230c82, 0x83013f16, 0x23352a03, 0x012b2627, 0x06010f22, 0x63178414, 0x172205de, 0x3c601716, 0x02230807, 0x0d407907, 0x08033a13, 0x11230c1a,
0x13161e13, 0x55173b17, 0x090e0909, 0x10307640, 0x1117e317, 0x830e51fe, 0x0139080e, 0x6c060596, 0x1d2d1209, 0x16021409, 0x03013927, 0x1c2a3e01,
0x0a210c61, 0x09092510, 0x0506181e, 0x033d2d84, 0x0c0f5403, 0x06070841, 0x0c370715, 0x0c0b0b0b, 0x0404670d, 0x303e856e, 0x1300ff40, 0x200a0d0d,
0x1807090f, 0x13021110, 0x0862824c, 0x3000013e, 0xf0fe1010, 0x09090d0a, 0x0507030d, 0x03110757, 0x3b16090f, 0x3e022315, 0x040a5880, 0x0720130d,
0x0513240a, 0x3e804906, 0x063c0b02, 0x01070814, 0x0c0b3306, 0x0c0a0c0c, 0x30040453, 0xab413784, 0x07334f05, 0x35001d24, 0x8d586000, 0x3727080e,
0x053e3736, 0x17041e32, 0x34351316, 0x22272627, 0x0e22022e, 0x07062302, 0x14011d06, 0x27322133, 0x07060716, 0x7023050e, 0x262d0562, 0x1736013f,
0x1e321716, 0x3e323302, 0x083b8204, 0x01173634, 0x141c11ef, 0x1c1460fe, 0x035f2812, 0x11150c12, 0x12161416, 0x03120c14, 0x51020564, 0x0e1b0134,
0x0e171017, 0x562f011b, 0x94010602, 0x0a082006, 0x26851037, 0x190c0a2f, 0x011a0e19, 0x080a3710, 0x3709080f, 0x2b2a8310, 0x0c0d0608, 0x030d0b0f,
0x08093710, 0x30080f83, 0x1c14fafe, 0x0701141c, 0x4b210f16, 0x0e0a0f03, 0x08060608, 0x030f090f, 0xfebdfe4f, 0x29420202, 0x0c0c0a17, 0x46251809,
0x06fe0301, 0x2d070ac2, 0x2d24850c, 0x150a1007, 0x072d0c02, 0x0709120a, 0x24820d2c, 0x0b070529, 0x0d020c08, 0x7309072c, 0x27290b1b, 0x33002b00,
0x00004800, 0x08eb5101, 0x52331521, 0x4e5005bc, 0x2133250a, 0x011d1632, 0x03231784, 0x6c112111, 0x07200751, 0x080b4518, 0x36323323, 0x28228333,
0x01230614, 0x0c1414b4, 0x5003840c, 0xfd720540, 0x0c143f05, 0xbac0fe50, 0x34262634, 0x0d099a26, 0x1a041c27, 0x041a0f0f, 0x090d271c, 0x0c402001,
0x03830c28, 0x20056a50, 0x20ef83a0, 0x26128230, 0xa001d0fe, 0x82d060fe, 0x34263031, 0x13080ba6, 0x08082218, 0x08131822, 0x4507000b, 0x0f2c0827,
0x1b001300, 0x3c003000, 0x54004800, 0x2110d345, 0xad9f0133, 0x500c1457, 0xfd8305a7, 0x8a272321, 0x0c0a6c0b, 0x20fee022, 0x3e23c594, 0x8d700808,
0x13d66902, 0xcc91b020, 0x10084023, 0x8d028208, 0x12776e06, 0x56002221, 0x9c430a33, 0x07625d07, 0x37321223, 0x050a4426, 0x3625072f, 0x22263435,
0x17141506, 0x16323336, 0x08048232, 0x3850d02d, 0x4c385038, 0x281c1c28, 0x91ce371c, 0xae91ce91, 0x2e183894, 0x1f1d1e1e, 0x2501192d, 0x75a67525,
0x03402925, 0x03252425, 0x82580140, 0x5038222a, 0x222a8258, 0x44d4281c, 0x303206b0, 0x0a0a0226, 0x34242701, 0x75755340, 0x34344053, 0x1b5e0a0a,
0x00c02a09, 0x0013000f, 0x0027001f, 0x157f413c, 0x2622132b, 0x013b3634, 0x06141632, 0x03461823, 0x15394207, 0x1c145022, 0x23073a67, 0xe0fe2001,
0x2405714b, 0x07090907, 0x14374216, 0x7443c020, 0x05da6705, 0x0130fe2a, 0x0160fea0, 0x090e0960, 0x67410282, 0x82002012, 0x42062000, 0x24200a37,
0x20063542, 0x20b59550, 0x05217933, 0xd9421620, 0x59152005, 0x29420e3e, 0x42de8716, 0x21210f31, 0x09f04201, 0x42390121, 0x70230d26, 0x84fe0808,
0x102f42de, 0xe0fe2024, 0xf4421204, 0x04122205, 0x13264250, 0x83266021, 0x4f002039, 0x002606d3, 0x0f00a001, 0xcf921700, 0x15213526, 0x32213314,
0x250c8757, 0x0660fea0, 0x87759401, 0xea76380f, 0x000006ea, 0xff000001, 0x000002e0, 0x000b0020, 0x22210500, 0x82363426, 0x14162c3e, 0xfee00106,
0x13130d40, 0x82c0010d, 0x6b202005, 0x9354052c, 0x001d220e, 0x54818826, 0x8b821393, 0x21112528, 0x16323315, 0x8554011d, 0xfee02a11, 0xfea001c0,
0x1c14e0c0, 0x147f5401, 0xd0d02108, 0x30400160, 0x00e0141c, 0xfffaff01, 0x01c601c0, 0x00a200c0, 0x011e2500, 0x2f06010f, 0x0e161701, 0x26240883,
0x1715022f, 0x4705a06b, 0x07200884, 0x26371e82, 0x35013f34, 0x010e010f, 0x012e012f, 0x0607013f, 0x26012f26, 0x8327013f, 0x013e250c, 0x2737011f,
0x36201285, 0x08c14518, 0x82262721, 0x1636250b, 0x2735021f, 0x4e05df5d, 0x372008d4, 0x22052947, 0x83013f15, 0x207f8339, 0x24278237, 0x010f1601,
0x830c8317, 0x17072163, 0x36081285, 0x01010f06, 0x030306b8, 0x270e0808, 0x06020109, 0x0c060f04, 0x3b481502, 0x0b0c0b0b, 0x0609190b, 0x19090710,
0x040b0b0b, 0x15483a04, 0x0f060b02, 0x09020607, 0x840d0627, 0x0622242f, 0x82040207, 0x48502514, 0x0b065048, 0x07250a82, 0x0e272206, 0x224a8408,
0x82070602, 0x15012349, 0x498e3a48, 0x8a0b0b21, 0x05282149, 0x5d344999, 0x0e060c04, 0x2217080e, 0x01060805, 0x06070204, 0x3b542a51, 0x0c299482,
0x072e190c, 0x2e070909, 0x2659821a, 0x3c040e04, 0x86512a54, 0x17232388, 0x33840303, 0x0b020923, 0x25aa8207, 0x2a2a1601, 0x89820116, 0x020b0726,
0x0e081709, 0x0b824e84, 0x0b214d97, 0x444ca70b, 0xc02f0763, 0x0b00c001, 0x38003000, 0x48003c00, 0x43250000, 0x13200a7c, 0x20057446, 0x098c6c2b,
0x3706bd52, 0x3e37013b, 0x32013b01, 0x011f011e, 0x27330727, 0x22012b26, 0x11211113, 0x270bef45, 0x0c0c0c01, 0x8c0c0c18, 0x1020e883, 0x20057844,
0x360b8310, 0x18062252, 0x1008640c, 0xb222040e, 0x02128c12, 0xc2035e03, 0x844ce0fe, 0x7120202c, 0x502206af, 0x2b820709, 0x14b0fe26, 0x01141c1c,
0x39310c85, 0x0b060e09, 0x1d1d3906, 0x60fe031d, 0xb0fe5001, 0x452b8530, 0x675906cb, 0x00182405, 0x82340024, 0x824720c7, 0x0caf57c7, 0x22231522,
0x23056d48, 0x2113013d, 0x34210a88, 0x05624b35, 0x6808fd79, 0x36220526, 0x65630732, 0x01212208, 0x20bb82e0, 0x29888380, 0x06060a10, 0x5a067401,
0x07848cfe, 0xfe201283, 0x78321884, 0x17172217, 0x08283122, 0x08682808, 0xe0fe4808, 0xb8841020, 0x1c14002a, 0x06f40630, 0x50010a06, 0xf4250683,
0x141c3006, 0x821482ff, 0x200582d3, 0x2134835f, 0x35878817, 0x4e005021, 0x8028060b, 0x1500c001, 0x31001d00, 0x23106944, 0x3634013b, 0x0d7fb082,
0x34362505, 0x2b341113, 0x26099176, 0x33141115, 0x45013221, 0x50300ae4, 0x36263426, 0x140e0e14, 0x2a06780e, 0x2a0ca80c, 0x1420b682, 0x240e5872,
0x1a26261a, 0x2d218218, 0x6cfe140e, 0x24065401, 0x06240c0c, 0x5f72acfe, 0x0007240c, 0x5022000f, 0x37261169, 0x32013b34, 0xa96f011d, 0x013b2109,
0x2f0bfc4b, 0x0c280ca8, 0x05060843, 0x64080864, 0x43080605, 0x240df54b, 0x740c0cc7, 0x201b850f, 0x0fbb5d0f, 0x36206b82, 0x1423e783, 0x6d242206,
0x3722064d, 0xe9831415, 0x012f0627, 0x36013f26, 0x2d758316, 0x91ce9108, 0x2f01ce91, 0x7575a675, 0x4d892da6, 0x590c7422, 0x200aee4b, 0x5e848ddc,
0x6b821027, 0x210f574c, 0xd8823507, 0x2309876f, 0x2223013d, 0x8c0d5a4c, 0x0c5c4c6c, 0xc34c6d8f, 0x626b820d, 0x02200711, 0x22069f6a, 0x83222307,
0x05fa445f, 0x83061621, 0x060862e3, 0xd683a520, 0x8db47521, 0x8b3820be, 0x8bd320f3, 0x000029f3, 0xfffdff07, 0x014302bf, 0x35052f48, 0x001b0017,
0x0021001e, 0x01000024, 0x16011f32, 0x22060107, 0x67830127, 0x05335108, 0x25331723, 0x23273307, 0x07373307, 0x17332717, 0x23370737, 0x0406d001,
0xfe060564, 0x030c03ec, 0x0506ecfe, 0x01070364, 0x4434394d, 0xc234f7fe, 0x443fca34, 0x44786434, 0x11616133, 0xc0013478, 0x07079405, 0x0404abfe,
0x07075501, 0x60300594, 0x902a0084, 0xf3f3a0a0, 0x0000a0a0, 0x00820004, 0x0180022e, 0x00070080, 0x00350025, 0x00000045, 0x2406856b, 0x2b343517,
0x25038301, 0x06010f22, 0x96821415, 0x37323322, 0x23059843, 0x1332013b, 0x290e8a43, 0x26223501, 0x06142135, 0x18821523, 0x34212408, 0x50180136,
0x38503838, 0x08100888, 0x0f06070e, 0x03080204, 0x10020304, 0x08400808, 0x13130df8, 0x83c0fd0d, 0x02220805, 0xfe251b30, 0x1b1b2560, 0x25a00125,
0x5c423001, 0x665c4242, 0x08580810, 0x04030a04, 0x030e0202, 0x40823701, 0x13000124, 0x2f84fe0d, 0x0d400126, 0xa0f0fe13, 0x04843083, 0x41180020,
0x0f2209cf, 0xc7501b00, 0x01332112, 0x200adb79, 0x974c1827, 0x0d0d481a, 0x6cfe062f, 0x94010606, 0x3d3d6c06, 0x08160909, 0x22068209, 0x83091608,
0x480d8906, 0x76280ea1, 0x06065401, 0xed06acfe, 0x39862b93, 0x05000022, 0x08ff4818, 0x0f00072a, 0x2b001700, 0x00003e00, 0x09ff4f18, 0x8507d044,
0x32262107, 0x49180782, 0x8325201d, 0x1a13131a, 0x20058b13, 0x2f4918ba, 0x79f02020, 0x3d830ae3, 0xc31a1322, 0x21404918, 0x240d5f79, 0x0027001f,
0x11674439, 0x7a1e2421, 0x37230b81, 0x65222636, 0x37300555, 0x16171632, 0x26012f06, 0x06010f22, 0x023e3726, 0x210b6c79, 0x8f7a3601, 0x0621220c,
0x31d3849d, 0x03251480, 0x0a060f01, 0x090c260b, 0x02010f06, 0x96441a13, 0x7a24200d, 0x27220a9b, 0xd3844108, 0x12182926, 0x09050808, 0x05250082,
0x140c0808, 0x103b4c0a, 0xe14d2020, 0x42122005, 0x521806e5, 0x36200733, 0x280ea37a, 0x0614013f, 0x34352622, 0x06085b37, 0x3621d683, 0x21858216,
0x18841516, 0x26272227, 0x013f023e, 0x2dc68b36, 0x06226a93, 0x14080702, 0x133e1306, 0xd2821406, 0x92822720, 0x091c0531, 0x0a11060a, 0x030a0950,
0x0a06b205, 0x82051c09, 0x05122814, 0x07040202, 0x8d0a5005, 0x291b21d0, 0x2305d47a, 0x02081616, 0x7138db82, 0x0d13130d, 0x03090808, 0x030a1311,
0x0a110318, 0x11134011, 0x08090803, 0x11291783, 0x07080905, 0x00031801, 0x0d974100, 0x47002b24, 0x97414f00, 0x71362011, 0x22200532, 0x2e052f71,
0x1f323634, 0x32363701, 0x010f1416, 0x85361617, 0x22d78206, 0x8207012f, 0x3f3424f5, 0x86262701, 0x41062022, 0xe78b0627, 0x100cac28, 0x06121206,
0x05830c10, 0x94200b8b, 0x1d851190, 0xd24b8220, 0x0ce47c05, 0x2b966b20, 0x5c974c20, 0x4b268421, 0x002105de, 0x08ff7609, 0x2a054343, 0x0027001f,
0x0037002f, 0x914b003f, 0x095370f7, 0x4305d067, 0x2620076b, 0x20069f52, 0x061b5206, 0x331f0f7c, 0x2f420701, 0x3c2f422f, 0x281c1c28, 0x0e14261c,
0x580e140e, 0x2f220f82, 0x118a3542, 0x0e0ab825, 0x7c800a0e, 0xc3201128, 0x51202984, 0x1c223982, 0x39822c28, 0x17140e22, 0x80204d84, 0x8220118a,
0x0e201784, 0x2410af42, 0x001f0017, 0x20d7912d, 0x21bf8536, 0x2a44023a, 0x32062c05, 0x06161716, 0x07222627, 0x42372606, 0x98260c94, 0x13131a13,
0x0483861a, 0x3c4e132e, 0x0d01053d, 0x31343109, 0x05010d09, 0x200d7b42, 0x26481890, 0x225d2b09, 0x030c091b, 0x0c030f0f, 0x8f821b09, 0x6f410d20,
0x002f3010, 0x003d0036, 0x00450041, 0x004d0049, 0x925b0054, 0x4322209f, 0x9b7e05f7, 0x079b4a08, 0x2d062551, 0x15233517, 0x37331614, 0x06222335,
0x0d83011d, 0x15200a82, 0x3329078b, 0x013d3632, 0x012b2634, 0x0b7b4215, 0xa6848520, 0x05848d20, 0x1c141025, 0x83c0141c, 0x28182c04, 0x18180709,
0x30680907, 0x82703030, 0x28682103, 0x12820c82, 0xd97ee28d, 0x1c23230b, 0x39832014, 0x602c0482, 0x09070818, 0x07091828, 0x18182808, 0x18240288,
0x1f091808, 0x18201882, 0x420e5f43, 0xcd7f056d, 0x36252f10, 0x010e0716, 0x012e2223, 0x17362627, 0xf7443216, 0x44ff8707, 0x32300cee, 0x05020c07,
0x361a294d, 0x0c020328, 0x84822907, 0xb28dd48a, 0x0a03222d, 0x142e2208, 0x0a081626, 0x454e0d03, 0x27420ab5, 0x000d390c, 0x0023001b, 0x0039002b,
0x22063700, 0x36272627, 0x17323637, 0x17061716, 0x1f510d8c, 0x050b4309, 0x2221b385, 0x27b18526, 0x061505c8, 0x0f01010f, 0x71200685, 0xc6200d8c,
0x200aa449, 0x22bd8501, 0x84054d52, 0x09c826bb, 0x22221609, 0x20059016, 0x0bdf55da, 0x2e21c685, 0x41c58322, 0x3422104f, 0x3f424500, 0x0f4f4111,
0x37262725, 0x4633043e, 0x37200b44, 0x01201182, 0x6241108b, 0x07c33a1c, 0x0b080101, 0x13070f0e, 0x0d010223, 0x260d0903, 0x9a03090d, 0x23020107,
0x41108a26, 0x56361a7c, 0x160c0702, 0x29070c12, 0x0604071e, 0x11161611, 0x07020206, 0x0e89291e, 0xc726d788, 0x1a000a00, 0xd5822b00, 0x00005a2e,
0x35262200, 0x17363734, 0x03141516, 0x26081c42, 0x07163637, 0x4736010e, 0xdb83070e, 0x3720c983, 0x28055b46, 0x32333634, 0x26070617, 0x05764a23,
0x27343528, 0x0f222432, 0x02410601, 0xce012d0c, 0x072e1f2c, 0x1af52e07, 0x02042736, 0x82279682, 0x020c0729, 0x87604d05, 0x860620db, 0x0c6435db,
0x9191ce91, 0x0e3a4367, 0x533a3203, 0x75a67575, 0xecfe1a0b, 0x2182fd83, 0x3c0c1241, 0x19222001, 0x0b0b451c, 0xfe191c45, 0x172514ee, 0x0d030a08,
0x070b030d, 0x03aa2e22, 0x24f18b05, 0x6728252c, 0x23558291, 0x20121c22, 0x75244f82, 0x031f2153, 0x41050f41, 0x97460a21, 0x000d2a0b, 0x0034001f,
0x0044003c, 0x0d734200, 0x2e012f27, 0x013e3701, 0x2204831f, 0x82011e17, 0x163722e4, 0x21058206, 0x225e012f, 0x36372307, 0xb742021e, 0x6201210f,
0x8142ea84, 0x70270807, 0x050e1046, 0x070e1a05, 0x0e180402, 0x14041110, 0x0e05b502, 0x02084610, 0x10110414, 0x030c1209, 0x0e060702, 0x42f20a0c,
0x8f250ac3, 0x22080a03, 0x058f422e, 0x04123e25, 0x830d0f1d, 0x100e2425, 0x821a0302, 0x0f443538, 0x0212041d, 0x1a104608, 0x0e060103, 0x01020709,
0xb00a0601, 0x420bcf42, 0x2c2210c3, 0xc3423a00, 0x012e3a21, 0x2627013f, 0x16011f36, 0x33010f14, 0x3f342627, 0x16173601, 0x1617010f, 0x1cbb4206,
0x070dbc2c, 0x0e072121, 0x06065008, 0x0483e450, 0x07060922, 0x0d201183, 0x2c1aae42, 0x28080f2f, 0x050f0828, 0x030e0330, 0x22048430, 0x84080705,
0x002b0812, 0xfffeff07, 0x010202bf, 0x000b00c1, 0x002f001d, 0x004a003b, 0x00680059, 0x16363700, 0x06070607, 0x37342622, 0x07063736, 0x42373626,
0x07250889, 0x3625010e, 0x05116e37, 0x08822720, 0x37323327, 0x0627013e, 0x26288226, 0x14163236, 0x82040607, 0x2b0625c7, 0x022f2601, 0x0223e582,
0x82262722, 0x163328db, 0x011e021f, 0x8236010f, 0x1617232b, 0xfb82020e, 0x36373208, 0x01070575, 0x2f10130c, 0x29131022, 0x1c1f141b, 0x3c674837,
0x2f050735, 0x2e3a5336, 0x1d7b0114, 0x39182414, 0x30336749, 0x2d290607, 0x10313a53, 0x332f8943, 0x020aeefe, 0x01090217, 0x3405010a, 0x5a0a020a,
0x05030934, 0x0a201082, 0x36080f86, 0x04132e26, 0x1413040f, 0x061f543a, 0x40260701, 0x52050701, 0x2f221013, 0x06361310, 0x36984407, 0x1c151b49,
0x7f2d3b1c, 0x45060684, 0x154939a2, 0x3b141c13, 0x89548930, 0x0a732326, 0x5d825a07, 0x01053428, 0x16170214, 0x0d890503, 0x252f702a, 0x1f060107,
0x14153a54, 0x14206282, 0x240f7349, 0x0036001d, 0x17ff4150, 0x21075f45, 0xff823727, 0x36023f23, 0x05144132, 0x06161730, 0x0607012f, 0x011e2526,
0x1617010f, 0xd17a010e, 0x84362008, 0x42012024, 0xf1421212, 0x06bb3a07, 0x0503031a, 0x0a020f23, 0x05230f02, 0x061a0303, 0x1f040801, 0x0108041f,
0x220d8504, 0x84030603, 0x42278a0e, 0x0043132b, 0x23472805, 0x01090418, 0x82051f05, 0x09012c02, 0x05231804, 0x10100205, 0x844e0502, 0x0503230c,
0x0d830101, 0x25890520, 0x00000039, 0xffffff07, 0x018102c8, 0x000b00b8, 0x00250017, 0x00430035, 0x42690054, 0x05250d43, 0x22061416, 0x055e4627,
0x1716073d, 0x2622010e, 0x1e373627, 0x25363201, 0x023e0726, 0x17011e32, 0x012e0726, 0x41160622, 0x37240723, 0x06071636, 0x20101745, 0x10fd4426,
0x080a4442, 0x104d022b, 0x13102f22, 0x0507010c, 0x120b6c52, 0x6c7e6c23, 0x190b1223, 0xfe5f725f, 0x06270ba3, 0x6d7e6d45, 0x0c260645, 0x7094700b,
0x073f41e3, 0x0c072925, 0x45130502, 0xc5200f29, 0x20131445, 0x091e42c0, 0x3f05b442, 0x01070552, 0x0f20500c, 0x323b3b32, 0x3b31200f, 0x0801ad3b,
0x3b3b663e, 0x01093f66, 0xf8606048, 0x25055341, 0x070b030d, 0x36457c22, 0x4522200d, 0x07261c23, 0x3b001d00, 0xc34a4300, 0x3505230b, 0x60182627,
0x0f2b0862, 0x16141501, 0x013e3233, 0x58013e17, 0x162406d3, 0x013d2617, 0x28055e41, 0x16363732, 0x15070607, 0x072b4514, 0x4207cf4a, 0x013d0545,
0x150b1238, 0x0e020302, 0x15030202, 0x1a25120b, 0x1c111e12, 0xa6753b31, 0x04313b75, 0x093f4617, 0xbd170428, 0x1a13131a, 0x0584b313, 0x08063242,
0x092cff22, 0x0c0b0b05, 0x0b0c0707, 0x2b09050b, 0x1d11271a, 0x395f1907, 0x53757553, 0x0e195f39, 0x18142c0b, 0x24072a46, 0x0b2c1418, 0x0ba548f3,
0x830b9b4c, 0x004822df, 0x09274355, 0x1225dfb3, 0x17010f16, 0x06bd5616, 0x14160722, 0x2305ca66, 0x17362627, 0x1a2ce9af, 0x2121070e, 0x50090d07,
0x94500606, 0x09200382, 0xb5066545, 0x120121f5, 0x86117045, 0x82002011, 0x4b072000, 0x11310843, 0x21001900, 0x31002900, 0x65004700, 0x32130000,
0x4fcf861e, 0xae7e0718, 0x08b04c0e, 0x34411786, 0x0d982433, 0x4f02131a, 0x0b270549, 0x010f060a, 0x4ca32503, 0x9f2510cd, 0xce9191ce, 0x29284291,
0x0a0c0124, 0x6a4f0c14, 0x09062506, 0x34181208, 0x2010e44c, 0x215082be, 0x3e42ce91, 0x0b5b452e, 0x17000f2b, 0x2d002500, 0x00003500, 0x0d3f5000,
0x5c5a3620, 0x36172507, 0x010e0716, 0x18073f44, 0x2110f144, 0x42502834, 0x26f88507, 0x13131a5a, 0x489a131a, 0xa8200c3f, 0x270a1848, 0x12180c01,
0x09060908, 0x06240082, 0x24120908, 0x13222c82, 0x2d48541a, 0x06f14f0a, 0x75d1fe26, 0xa67575a6, 0x260c0748, 0x00310029, 0x42410039, 0x172809df,
0x15160714, 0x23070614, 0x27050e47, 0x26012f34, 0x36013f34, 0x37240783, 0x031e1736, 0x2420ad8f, 0x2006e241, 0x2fa4849b, 0x292323a8, 0x0206011e,
0x15110601, 0x04041115, 0x06270583, 0x10060201, 0x410b121b, 0x755405ac, 0x0b012105, 0x01212e84, 0x08ab8410, 0x0e167121, 0x1b10160e, 0x03060601,
0x09190907, 0x020b0207, 0x081a0907, 0x07070208, 0x0c090101, 0x4825010f, 0xa3200bc7, 0x4b4c3384, 0x00132f0c, 0x0023001b, 0x00550045, 0x16321300,
0xb3511417, 0x4904200a, 0x25200f88, 0x3620e09e, 0x3634408d, 0x022313a8, 0x0c0a030c, 0x03090d26, 0x0801010d, 0x100f0e0b, 0x200b7c41, 0x21f29a00,
0x3b8b2605, 0x28010222, 0x2108794b, 0x994b0305, 0x8b902005, 0x411f20d9, 0x95201e07, 0x1e203e8b, 0x2e06c741, 0x00b801fc, 0x00340021, 0x004f003c,
0x9c00006c, 0x1e3324de, 0x43263703, 0x032006b3, 0x2005984c, 0x05f24e27, 0x05220622, 0x2507c44a, 0x3637013e, 0x04831f16, 0x17160725, 0x82222306,
0x262a8220, 0x26071415, 0x5e272623, 0x1425059a, 0x01323316, 0x2cf89a30, 0x0b260b46, 0x010f060a, 0x14100c02, 0x0511530a, 0x13f83c08, 0x1a13131a,
0x11075a01, 0x030a5312, 0x12070317, 0x041c110c, 0x1f100803, 0x2f020ba1, 0x91916734, 0x11916767, 0x0f07080b, 0x75a6750a, 0x8c2d5375, 0x160e0f16,
0x06021b0f, 0x42080207, 0x38080815, 0x03070919, 0x09010706, 0x0a4c0f0c, 0x0805090a, 0x0b100908, 0x08121806, 0x1b0c0508, 0x121b1313, 0x052112a2,
0x53090216, 0x0210170c, 0x09101302, 0x310f0502, 0x91150728, 0x285e82ce, 0x0d032c2e, 0x53201f0b, 0x205f8275, 0x0c3f4200, 0x50079351, 0x00200ab3,
0x20056e4e, 0x07296116, 0x2208bb43, 0x6b071632, 0x27230538, 0x83333626, 0x91ce2357, 0x52834b01, 0x46b07521, 0xa22d0a86, 0x06010807, 0x2e0e2e45,
0x08010645, 0x0dc74807, 0x46e87521, 0x53280a6d, 0x3c2d0609, 0x09062d3c, 0x240f9f49, 0x002f001f, 0x0997433d, 0x12208f87, 0x210e9e42, 0x524e0607,
0x05f44206, 0x99170721, 0x4290209f, 0x93220d8d, 0x494e0d03, 0x030c2605, 0x0d260d09, 0x24b19be2, 0x1e293001, 0x05194807, 0x07030524, 0x0483231e,
0x12872920, 0xc2894d20, 0x260c5b44, 0x001c000f, 0x91370029, 0x471320c3, 0x3621080c, 0x080b4716, 0x16011f23, 0x20bd9b14, 0x074d4cb3, 0x070e0823,
0x07f746f3, 0x06065023, 0x20b79c94, 0x084f4c04, 0x080f0523, 0x4c038262, 0x52200860, 0x8b54b588, 0x9521200d, 0x461220b3, 0x01200ff3, 0x21221142,
0xc3461a96, 0x060d5608, 0x131a6c25, 0x42131a13, 0x01211c1d, 0x09a44624, 0x08080525, 0x8232140c, 0x1a132131, 0x20092842, 0x10db5204, 0x2010d951,
0x06954536, 0x450d5149, 0x6b20057b, 0x46112d49, 0x59450619, 0x055b5705, 0x430cff47, 0x2924051f, 0x43003100, 0x5413a755, 0x35230aaf, 0x56162734,
0x3424056c, 0x14150637, 0x2407b154, 0x32161407, 0x201b8c36, 0x18a18317, 0x3112c350, 0x2a3c0201, 0x372a3c2a, 0x02121722, 0x020e140e, 0x0d824012,
0x463c2a23, 0x20108817, 0x16b054c0, 0x2886bb20, 0x0c141124, 0x23830404, 0x0c040425, 0x842f1114, 0x1148234e, 0x178b1717, 0xb8549420, 0x0bfb4107,
0x33002122, 0x630ecb4a, 0x35200888, 0x2105f46d, 0x937a3216, 0x26152105, 0x250a6146, 0x16323302, 0xea473617, 0x0c82560f, 0x38880126, 0x3875a675,
0x2d227482, 0x05822d66, 0x060fb324, 0x21450c09, 0x1a132606, 0x0325140d, 0x0ef34770, 0x212e3e25, 0x44212e21, 0xf1290637, 0x7553503a, 0x3a505375,
0x23d68372, 0x97191997, 0x32200783, 0x2706f247, 0x140c0809, 0x2a12180a, 0x210b4458, 0x78564412, 0x42062006, 0x1e240c2b, 0x2e002600, 0x20130159,
0x08495837, 0x26222323, 0x08005934, 0x22073e42, 0x41173607, 0xe14d07d5, 0x3cd02a0b, 0x08020726, 0x18061308, 0x26908226, 0x13131a41, 0x8473131a,
0x06862605, 0x22192406, 0x0df74419, 0x082e232c, 0x02060614, 0x140e1d07, 0x2a82400e, 0x2d1a1322, 0x50290584, 0x13310808, 0x11181811, 0x11034513,
0x18156753, 0x210e3354, 0x67520727, 0x2226210d, 0x200c8e41, 0x0e5d5627, 0x54180120, 0xa3230f4b, 0x53060309, 0xa020106a, 0x820b6353, 0x0e8e7b1e,
0x54181a20, 0x8d230c65, 0x53020611, 0x25200d6b, 0x200d7353, 0x146f4600, 0x7f4f2720, 0x08b94311, 0x410d2b57, 0xae250b76, 0x34262634, 0x053a4926,
0x41052357, 0x3b200d67, 0x26231d82, 0x431a7b34, 0x058205c8, 0x1c247b90, 0x38002900, 0x24207b91, 0x200ba74c, 0x09a64c06, 0x57011f21, 0x2e210aaa,
0x0dab5701, 0x0d430122, 0x2209934c, 0x4550068e, 0x022c089a, 0x01054348, 0x7223070a, 0x05080423, 0x200fb957, 0x0b794cc2, 0x030e3323, 0x089a4530,
0x27364a2c, 0x0f030c09, 0x0a04020f, 0xb9822706, 0x56011c24, 0x07820100, 0x1a220283, 0x0b863600, 0x1b000124, 0x0b868900, 0x07000224, 0x0b86b500,
0x22000324, 0x0b860301, 0x1b000424, 0x0b865e01, 0x26000524, 0x0b86c801, 0x18000624, 0x0b862102, 0x2c000a24, 0x0b869402, 0x17000b24, 0x0b86f102,
0x13001024, 0x0b863103, 0x07001124, 0x0b865503, 0x1b001224, 0x0b869503, 0x23821520, 0x0b86d920, 0x23821620, 0x8200fd21, 0x09042179, 0x3420a882,
0x0b850382, 0xb1820120, 0x17865120, 0x0e000224, 0x0b86a500, 0x44000324, 0x0b86bd00, 0x36000424, 0x0b862601, 0x4c000524, 0x0b867a01, 0x30000624,
0x0b86ef01, 0x58000a24, 0x0b863a02, 0x2e000b24, 0x0b86c102, 0x26001024, 0x0b860903, 0x0e001124, 0x0b864503, 0x36001224, 0x0b865d03, 0x23821520,
0x0b86b120, 0x23821620, 0x4300ed3a, 0x70006f00, 0x72007900, 0x67006900, 0x74006800, 0x28002000, 0x29006300, 0x46200782, 0x6e201b82, 0x41261184,
0x65007700, 0x0f827300, 0x07826d20, 0x6f43003c, 0x69727970, 0x20746867, 0x20296328, 0x746e6f46, 0x65774120, 0x656d6f73, 0x34970000, 0x35002022,
0x72205284, 0x65204082, 0x52200982, 0x67260782, 0x6c007500, 0x7c826100, 0x448b0020, 0x20352030, 0x65657246, 0x67655220, 0x72616c75, 0x2b8e0000,
0x6bb51788, 0x89822d20, 0x31002e28, 0x2e003200, 0xb0823000, 0x798ebe8a, 0x2e352d25, 0x832e3231, 0x16094123, 0x3322d4bb, 0x7e823300, 0x37002e22,
0x32248e82, 0x28002000, 0x281a3a41, 0x00650076, 0x00730072, 0x20878469, 0x202d823a, 0x87bc8235, 0x00292bc2, 0x30333300, 0x3235372e, 0x47412820,
0x6576280c, 0x6f697372, 0x85203a6e, 0x412782c7, 0xd0410731, 0x8235200d, 0x0597417a, 0x6b412d20, 0x414f830f, 0x352506db, 0x65657246, 0x087c412d,
0x68005422, 0x20229582, 0x05827700, 0x27006222, 0x20229d82, 0x9f826d00, 0x74007322, 0x70209f82, 0x70200982, 0x2008de41, 0x20b98220, 0x20bb8463,
0x20278220, 0x24218465, 0x006e0061, 0x20298264, 0x24178274, 0x006c006f, 0x2023826b, 0x08d58274, 0x6854002d, 0x65772065, 0x20732762, 0x74736f6d,
0x706f7020, 0x72616c75, 0x6f636920, 0x6573206e, 0x6e612074, 0x6f742064, 0x696b6c6f, 0x82002e74, 0x82742084, 0x8270204e, 0x003a2256, 0x2001822f,
0x22668466, 0x42610074, 0x2e220cb2, 0x17826300, 0x2e826d20, 0x7074742b, 0x2f2f3a73, 0x746e6f66, 0x05b34261, 0x6f632e22, 0x4b421882, 0x13a74225,
0x934f9f42, 0x090b4363, 0x0022a7d3, 0x00840002, 0x00dbff23, 0x8f088419, 0x829a2004, 0x017b0910, 0x02010200, 0x04010301, 0x06010501, 0x08010701,
0x0a010901, 0x0c010b01, 0x0e010d01, 0x10010f01, 0x12011101, 0x14011301, 0x16011501, 0x18011701, 0x1a011901, 0x1c011b01, 0x1e011d01, 0x20011f01,
0x22012101, 0x24012301, 0x26012501, 0x28012701, 0x2a012901, 0x2c012b01, 0x2e012d01, 0x30012f01, 0x32013101, 0x34013301, 0x36013501, 0x38013701,
0x3a013901, 0x3c013b01, 0x3e013d01, 0x40013f01, 0x42014101, 0x44014301, 0x46014501, 0x48014701, 0x4a014901, 0x4b018b00, 0x4d014c01, 0x4f014e01,
0x51015001, 0x53015201, 0x55015401, 0x57015601, 0x58018a00, 0x5a015901, 0x5c015b01, 0x5e015d01, 0x60015f01, 0x62016101, 0x64016301, 0x66016501,
0x68016701, 0x6a016901, 0x6c016b01, 0x6e016d01, 0x70016f01, 0x72017101, 0x74017301, 0x76017501, 0x78017701, 0x7a017901, 0x7c017b01, 0x7e017d01,
0x80017f01, 0x82018101, 0x84018301, 0x86018501, 0x88018701, 0x8a018901, 0x8c018b01, 0x8e018d01, 0x90018f01, 0x92019101, 0x94019301, 0x96019501,
0x61656805, 0x73047472, 0x04726174, 0x72657375, 0x6f6c6305, 0x6c086b63, 0x2d747369, 0x04746c61, 0x67616c66, 0x6f6f6208, 0x72616d6b, 0x6d69056b,
0x04656761, 0x74696465, 0x6d69740c, 0x632d7365, 0x6c637269, 0x68630c65, 0x866b6365, 0x710f280c, 0x74736575, 0x866e6f69, 0x6503240f, 0x82096579,
0x732d2e03, 0x6873616c, 0x6c61630c, 0x61646e65, 0x2f5d8372, 0x6d6f6307, 0x746e656d, 0x6c6f6606, 0x0b726564, 0x2d270685, 0x6e65706f, 0x82686309,
0x622d2497, 0x86087261, 0x09732124, 0x2d2da483, 0x666c6168, 0x6d656c05, 0x630b6e6f, 0x3a898372, 0x7261632d, 0x64680364, 0x61681064, 0x702d646e,
0x746e696f, 0x6769722d, 0x8a0f7468, 0x656c2410, 0x8a0d7466, 0x7075210f, 0x643a1d8b, 0x046e776f, 0x79706f63, 0x76617304, 0x71730665, 0x65726175,
0x766e6508, 0x8c826c65, 0x836c0921, 0x7562374d, 0x6204626c, 0x086c6c65, 0x70736f68, 0x6c617469, 0x756c700b, 0x2c852d73, 0x09410620, 0x73052805,
0x656c696d, 0x82726605, 0x6d032950, 0x6b086865, 0x6f627965, 0x0820a082, 0x3482f787, 0x41796121, 0x0c23061a, 0x886e696d, 0x06444141, 0x0c214e85,
0x20fe8273, 0x285b8665, 0x6d6f6307, 0x73736170, 0x21e98211, 0x14867465, 0xb3832d20, 0x118c0f20, 0x12707522, 0x72200f8c, 0x0421b683, 0x20908266,
0x2e048308, 0x746c612d, 0x75687409, 0x2d73626d, 0x860b7075, 0x28468309, 0x6e757303, 0x6f6f6d04, 0x27618d6e, 0x7466656c, 0x746f640a, 0x0828ad86,
0x6c697562, 0x676e6964, 0x70234d85, 0x84096664, 0x6f772456, 0x840a6472, 0x78652509, 0x0f6c6563, 0x70290a84, 0x7265776f, 0x6e696f70, 0x251a8574,
0x67616d69, 0x1a840c65, 0x63726126, 0x65766968, 0x61241785, 0x6f696475, 0x76240a85, 0x6f656469, 0x632a5285, 0x0965646f, 0x6566696c, 0x6f82722d,
0x61700b37, 0x2d726570, 0x6e616c70, 0x75660665, 0x6c6f6274, 0x77656e09, 0x24168473, 0x6c65620a, 0x055b426c, 0x6c63112e, 0x6465736f, 0x7061632d,
0x6e6f6974, 0x0c2d3982, 0x656a626f, 0x672d7463, 0x70756f72, 0x210c860e, 0x0e846e75, 0x74730b2c, 0x796b6369, 0x746f6e2d, 0x39820565, 0x09656e36,
0x72756f68, 0x73616c67, 0x61680973, 0x722d646e, 0x0a6b636f, 0x69840984, 0x28053e42, 0x73696373, 0x73726f73, 0x2318840b, 0x617a696c, 0x0b84fd82,
0x82707321, 0x420c202f, 0x65210963, 0x243c8672, 0x65636165, 0x08f7420d, 0x756c7024, 0x0d880e73, 0x6e696d22, 0x74230e8b, 0x8a656d69, 0x6863291d,
0x036b6365, 0x0b70616d, 0x29060443, 0x746c612d, 0x7561700c, 0x94416573, 0x21c58206, 0x0b86706f, 0x7325b584, 0x656b6168, 0x07ba420d, 0x706f2d31,
0x610c6e65, 0x65726464, 0x622d7373, 0x886b6f6f, 0x8263200c, 0x820b20b8, 0x86722048, 0x6908293d, 0x61622d64, 0x07656764, 0x1c830882, 0x69770f2f,
0x776f646e, 0x78616d2d, 0x7a696d69, 0x210f8865, 0x0f846e69, 0x1f860e20, 0x742a5a82, 0x0965726f, 0x776f6e73, 0x7d826c66, 0x72740925, 0x83687361,
0x69062daa, 0x6567616d, 0x6c630973, 0x6f627069, 0x15237082, 0x82727261, 0x86c58252, 0x822d2075, 0x916e2061, 0x656c2415, 0x90167466, 0x6972252b,
0x13746867, 0x75311690, 0x65670370, 0x6f6d0e6d, 0x2d79656e, 0x6c6c6962, 0x205f822d, 0x259d860c, 0x736f6c63, 0x3e410c65, 0x6f642a07, 0x730a7374,
0x656c696d, 0x361f822d, 0x6e61056b, 0x05797267, 0x7a7a6964, 0x6c660779, 0x65687375, 0x82660a64, 0x2d6e28a1, 0x6e65706f, 0x82726707, 0x656322c0,
0x21078204, 0x0483086e, 0x09205983, 0x62240884, 0x0f6d6165, 0x2d260988, 0x61657773, 0x0f840b74, 0x61656825, 0x85737472, 0x7173260b, 0x746e6975,
0x85178411, 0x742d210b, 0x73211e82, 0x2211850a, 0x86726174, 0x8515840a, 0x6f742633, 0x6575676e, 0x85218412, 0x852d200b, 0x8b10203a, 0x69772312,
0x89856b6e, 0x04250983, 0x7373696b, 0x20048309, 0x8498842d, 0x20188309, 0x268d842d, 0x75616c05, 0x840a6867, 0x20208405, 0x850a850c, 0x84178657,
0x656d2951, 0x6c622d68, 0x106b6e61, 0x72340983, 0x696c6c6f, 0x652d676e, 0x07736579, 0x2d646173, 0x08797263, 0xae830783, 0x83064741, 0x73082f6f,
0x72707275, 0x05657369, 0x65726974, 0x00820064, 0xffff0126, 0x01000200, 0x0c200982, 0x16200382, 0x0d830382, 0x99000326, 0x04000200, 0x04820d84,
0x01200282, 0x00240382, 0xf9256bd9, 0xda2b0783, 0x00bcc715, 0xda000000, 0x05c0c715, 0x7a4d81fa, 0x0000008d,
};
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+89
View File
@@ -0,0 +1,89 @@
/*******************************************************************************
*
* PNPOLY_INCLUDE_H
*
******************************************************************************/
#ifndef PNPOLY_INCLUDE_H
#define PNPOLY_INCLUDE_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef PNPOLY_DEF
# ifdef PNPOLY_STATIC
# define PNPOLY_DEF static
# else
# define PNPOLY_DEF extern
# endif
#endif
PNPOLY_DEF int pnpoly_aos(int nvert, const float *verts, float testx, float testy);
PNPOLY_DEF int pnpoly_soa(int nvert, const float *vertx, const float *verty, float testx, float testy);
#ifdef __cplusplus
}
#endif
#endif // PNPOLY_INCLUDE_H
/*******************************************************************************
*
* PNPOLY_IMPLEMENTATION
*
******************************************************************************/
#ifdef PNPOLY_IMPLEMENTATION
PNPOLY_DEF int pnpoly_aos(int nvert, const float *verts, float testx, float testy) {
int i, j, c = 0;
for ( i = 0, j = nvert - 1; i < nvert; j = i++ ) {
if ( ((verts[i*2+1] > testy) != (verts[j*2+1] > testy)) &&
(testx < (verts[j*2] - verts[i*2]) * (testy - verts[i*2+1]) / (verts[j*2+1] - verts[i*2+1]) + verts[i*2]) ) {
c = !c;
}
}
return c;
}
PNPOLY_DEF int pnpoly_soa(int nvert, const float *vertx, const float *verty, float testx, float testy) {
int i, j, c = 0;
for ( i = 0, j = nvert - 1; i < nvert; j = i++ ) {
if ( ((verty[i] > testy) != (verty[j] > testy)) &&
(testx < (vertx[j] - vertx[i]) * (testy - verty[i]) / (verty[j] - verty[i]) + vertx[i]) ) {
c = !c;
}
}
return c;
}
#endif // PNPOLY_IMPLEMENTATION
/*
Copyright (c) 1970-2003, Wm. Randolph Franklin
Copyright (c) 2020, by Matvey Cherevko (blackmatov@gmail.com)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimers.
2. Redistributions in binary form must reproduce the above copyright notice in
the documentation and/or other materials provided with the distribution.
3. The name of W. Randolph Franklin may not be used to endorse or promote
products derived from this Software without specific prior written permission.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
+181 -86
View File
@@ -48,10 +48,11 @@ LICENSE
RECENT REVISION HISTORY:
2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically
2.23 (2019-08-11) fix clang static analysis warning
2.22 (2019-03-04) gif fixes, fix warnings
2.21 (2019-02-25) fix typo in comment
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
2.19 (2018-02-11) fix warning
2.18 (2018-01-30) fix warnings
2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
@@ -91,7 +92,7 @@ RECENT REVISION HISTORY:
Carmelo J Fdez-Aguera
Bug & warning fixes
Marc LeBlanc David Woo Guillaume George Martins Mozeiko
Marc LeBlanc David Woo Guillaume George Martins Mozeiko Alexander Veselov
Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan
Dave Moore Roy Eltham Hayaki Saito Nathan Reed
Won Chun Luke Graham Johan Duparc Nick Verigakis
@@ -105,7 +106,9 @@ RECENT REVISION HISTORY:
Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus
Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo
Christian Floisand Kevin Schmidt JR Smith github:darealshinji
Blazej Dariusz Roszkowski github:Michaelangel007
Brad Weinberger Matvey Cherevko github:Michaelangel007
Blazej Dariusz Roszkowski
*/
#ifndef STBI_INCLUDE_STB_IMAGE_H
@@ -434,7 +437,7 @@ STBIDEF int stbi_is_hdr_from_file(FILE *f);
// get a VERY brief reason for failure
// NOT THREADSAFE
// on most compilers (and ALL modern mainstream compilers) this is threadsafe
STBIDEF const char *stbi_failure_reason (void);
// free the loaded image -- this is just free()
@@ -467,6 +470,13 @@ STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
// flip the image vertically, so the first pixel in the output array is the bottom left
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
// as above, but only applies to images loaded on the thread that calls the function
// this function is only available if your compiler supports thread-local variables;
// calling it will fail to link if your compiler doesn't
#if __cplusplus >= 201103L || __STDC_VERSION_ >= 201112L || defined(__GNUC__) || defined(_MSC_VER)
STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);
#endif
// ZLIB client - used by PNG, available for other purposes
STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
@@ -563,6 +573,17 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
#define stbi_inline __forceinline
#endif
#ifndef STBI_NO_THREAD_LOCALS
#if __cplusplus >= 201103L
#define STBI_THREAD_LOCAL thread_local
#elif __STDC_VERSION_ >= 201112L
#define STBI_THREAD_LOCAL _Thread_local
#elif defined(__GNUC__)
#define STBI_THREAD_LOCAL __thread
#elif defined(_MSC_VER)
#define STBI_THREAD_LOCAL __declspec(thread)
#endif
#endif
#ifdef _MSC_VER
typedef unsigned short stbi__uint16;
@@ -873,8 +894,11 @@ static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
#endif
// this is not threadsafe
static const char *stbi__g_failure_reason;
static
#ifdef STBI_THREAD_LOCAL
STBI_THREAD_LOCAL
#endif
const char *stbi__g_failure_reason;
STBIDEF const char *stbi_failure_reason(void)
{
@@ -926,11 +950,13 @@ static int stbi__mul2sizes_valid(int a, int b)
return a <= INT_MAX/b;
}
#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
static int stbi__mad2sizes_valid(int a, int b, int add)
{
return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
}
#endif
// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
static int stbi__mad3sizes_valid(int a, int b, int c, int add)
@@ -948,12 +974,14 @@ static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
}
#endif
#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
// mallocs with size overflow checking
static void *stbi__malloc_mad2(int a, int b, int add)
{
if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
return stbi__malloc(a*b + add);
}
#endif
static void *stbi__malloc_mad3(int a, int b, int c, int add)
{
@@ -997,13 +1025,29 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
#endif
static int stbi__vertically_flip_on_load = 0;
static int stbi__vertically_flip_on_load_global = 0;
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
{
stbi__vertically_flip_on_load = flag_true_if_should_flip;
stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
}
#ifndef STBI_THREAD_LOCAL
#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
#else
static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
{
stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
stbi__vertically_flip_on_load_set = 1;
}
#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
? stbi__vertically_flip_on_load_local \
: stbi__vertically_flip_on_load_global)
#endif // STBI_THREAD_LOCAL
static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
{
memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
@@ -1026,7 +1070,7 @@ static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int re
#ifndef STBI_NO_PSD
if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
#else
(void)bpc;
STBI_NOTUSED(bpc);
#endif
#ifndef STBI_NO_PIC
if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri);
@@ -1115,8 +1159,8 @@ static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int byt
stbi_uc *bytes = (stbi_uc *)image;
for (slice = 0; slice < z; ++slice) {
stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
bytes += slice_size;
stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
bytes += slice_size;
}
}
#endif
@@ -1202,7 +1246,7 @@ static FILE *stbi__fopen(char const *filename, char const *mode)
wchar_t wFilename[1024];
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
return 0;
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
return 0;
@@ -1304,15 +1348,15 @@ STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *u
STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
{
unsigned char *result;
stbi__context s;
stbi__start_mem(&s,buffer,len);
stbi__context s;
stbi__start_mem(&s,buffer,len);
result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
if (stbi__vertically_flip_on_load) {
stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
}
return result;
return result;
}
#endif
@@ -1481,6 +1525,9 @@ stbi_inline static stbi_uc stbi__get8(stbi__context *s)
return 0;
}
#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
// nothing
#else
stbi_inline static int stbi__at_eof(stbi__context *s)
{
if (s->io.read) {
@@ -1492,7 +1539,11 @@ stbi_inline static int stbi__at_eof(stbi__context *s)
return s->img_buffer >= s->img_buffer_end;
}
#endif
#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
// nothing
#else
static void stbi__skip(stbi__context *s, int n)
{
if (n < 0) {
@@ -1509,7 +1560,11 @@ static void stbi__skip(stbi__context *s, int n)
}
s->img_buffer += n;
}
#endif
#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
// nothing
#else
static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
{
if (s->io.read) {
@@ -1533,18 +1588,27 @@ static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
} else
return 0;
}
#endif
#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
// nothing
#else
static int stbi__get16be(stbi__context *s)
{
int z = stbi__get8(s);
return (z << 8) + stbi__get8(s);
}
#endif
#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
// nothing
#else
static stbi__uint32 stbi__get32be(stbi__context *s)
{
stbi__uint32 z = stbi__get16be(s);
return (z << 16) + stbi__get16be(s);
}
#endif
#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
// nothing
@@ -1566,7 +1630,9 @@ static stbi__uint32 stbi__get32le(stbi__context *s)
#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
// nothing
#else
//////////////////////////////////////////////////////////////////////////////
//
// generic converter from built-in img_n to req_comp
@@ -1582,7 +1648,11 @@ static stbi_uc stbi__compute_y(int r, int g, int b)
{
return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
}
#endif
#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
// nothing
#else
static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
{
int i,j;
@@ -1626,12 +1696,20 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
STBI_FREE(data);
return good;
}
#endif
#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
// nothing
#else
static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
{
return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
}
#endif
#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
// nothing
#else
static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
{
int i,j;
@@ -1675,6 +1753,7 @@ static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int r
STBI_FREE(data);
return good;
}
#endif
#ifndef STBI_NO_LINEAR
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
@@ -4946,6 +5025,8 @@ static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
++s->img_n;
}
STBI_FREE(z->expanded); z->expanded = NULL;
// end of PNG chunk, read and skip CRC
stbi__get32be(s);
return 1;
}
@@ -5115,7 +5196,7 @@ static int stbi__shiftsigned(unsigned int v, int shift, int bits)
v <<= -shift;
else
v >>= shift;
STBI_ASSERT(v >= 0 && v < 256);
STBI_ASSERT(v < 256);
v >>= (8-bits);
STBI_ASSERT(bits >= 0 && bits <= 8);
return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
@@ -5125,6 +5206,7 @@ typedef struct
{
int bpp, offset, hsz;
unsigned int mr,mg,mb,ma, all_a;
int extra_read;
} stbi__bmp_data;
static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
@@ -5137,6 +5219,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
info->offset = stbi__get32le(s);
info->hsz = hsz = stbi__get32le(s);
info->mr = info->mg = info->mb = info->ma = 0;
info->extra_read = 14;
if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
if (hsz == 12) {
@@ -5180,6 +5263,7 @@ static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
info->mr = stbi__get32le(s);
info->mg = stbi__get32le(s);
info->mb = stbi__get32le(s);
info->extra_read += 12;
// not documented, but generated by photoshop and handled by mspaint
if (info->mr == info->mg && info->mg == info->mb) {
// ?!?!?
@@ -5236,10 +5320,13 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
if (info.hsz == 12) {
if (info.bpp < 24)
psize = (info.offset - 14 - 24) / 3;
psize = (info.offset - info.extra_read - 24) / 3;
} else {
if (info.bpp < 16)
psize = (info.offset - 14 - info.hsz) >> 2;
psize = (info.offset - info.extra_read - info.hsz) >> 2;
}
if (psize == 0) {
STBI_ASSERT(info.offset == (s->img_buffer - s->buffer_start));
}
if (info.bpp == 24 && ma == 0xff000000)
@@ -5267,7 +5354,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
if (info.hsz != 12) stbi__get8(s);
pal[i][3] = 255;
}
stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
if (info.bpp == 1) width = (s->img_x + 7) >> 3;
else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
else if (info.bpp == 8) width = s->img_x;
@@ -5316,7 +5403,7 @@ static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req
int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
int z = 0;
int easy=0;
stbi__skip(s, info.offset - 14 - info.hsz);
stbi__skip(s, info.offset - info.extra_read - info.hsz);
if (info.bpp == 24) width = 3 * s->img_x;
else if (info.bpp == 16) width = 2*s->img_x;
else /* bpp = 32 and pad = 0 */ width=0;
@@ -6206,7 +6293,7 @@ typedef struct
int w,h;
stbi_uc *out; // output buffer (always 4 components)
stbi_uc *background; // The current "background" as far as a gif is concerned
stbi_uc *history;
stbi_uc *history;
int flags, bgindex, ratio, transparent, eflags;
stbi_uc pal[256][4];
stbi_uc lpal[256][4];
@@ -6294,7 +6381,7 @@ static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
{
stbi_uc *p, *c;
int idx;
int idx;
// recurse to decode the prefixes, since the linked-list is backwards,
// and working backwards through an interleaved image would be nasty
@@ -6303,12 +6390,12 @@ static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
if (g->cur_y >= g->max_y) return;
idx = g->cur_x + g->cur_y;
idx = g->cur_x + g->cur_y;
p = &g->out[idx];
g->history[idx / 4] = 1;
g->history[idx / 4] = 1;
c = &g->color_table[g->codes[code].suffix * 4];
if (c[3] > 128) { // don't render transparent pixels;
if (c[3] > 128) { // don't render transparent pixels;
p[0] = c[2];
p[1] = c[1];
p[2] = c[0];
@@ -6417,14 +6504,14 @@ static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
// two back is the image from two frames ago, used for a very specific disposal format
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
{
int dispose;
int first_frame;
int pi;
int pcount;
int dispose;
int first_frame;
int pi;
int pcount;
STBI_NOTUSED(req_comp);
// on first frame, any non-written pixels get the background colour (non-transparent)
first_frame = 0;
first_frame = 0;
if (g->out == 0) {
if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
@@ -6436,17 +6523,17 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
if (!g->out || !g->background || !g->history)
return stbi__errpuc("outofmem", "Out of memory");
// image is treated as "transparent" at the start - ie, nothing overwrites the current background;
// image is treated as "transparent" at the start - ie, nothing overwrites the current background;
// background colour is only used for pixels that are not rendered first frame, after that "background"
// color refers to the color that was there the previous frame.
// color refers to the color that was there the previous frame.
memset(g->out, 0x00, 4 * pcount);
memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
memset(g->history, 0x00, pcount); // pixels that were affected previous frame
first_frame = 1;
first_frame = 1;
} else {
// second frame - how do we dispoase of the previous one?
dispose = (g->eflags & 0x1C) >> 2;
pcount = g->w * g->h;
dispose = (g->eflags & 0x1C) >> 2;
pcount = g->w * g->h;
if ((dispose == 3) && (two_back == 0)) {
dispose = 2; // if I don't have an image to revert back to, default to the old background
@@ -6455,32 +6542,32 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
if (dispose == 3) { // use previous graphic
for (pi = 0; pi < pcount; ++pi) {
if (g->history[pi]) {
memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
}
}
} else if (dispose == 2) {
// restore what was changed last frame to background before that frame;
} else if (dispose == 2) {
// restore what was changed last frame to background before that frame;
for (pi = 0; pi < pcount; ++pi) {
if (g->history[pi]) {
memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
}
}
} else {
// This is a non-disposal case eithe way, so just
// This is a non-disposal case eithe way, so just
// leave the pixels as is, and they will become the new background
// 1: do not dispose
// 0: not specified.
}
// background is what out is after the undoing of the previou frame;
memcpy( g->background, g->out, 4 * g->w * g->h );
// background is what out is after the undoing of the previou frame;
memcpy( g->background, g->out, 4 * g->w * g->h );
}
// clear my history;
// clear my history;
memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame
for (;;) {
int tag = stbi__get8(s);
int tag = stbi__get8(s);
switch (tag) {
case 0x2C: /* Image Descriptor */
{
@@ -6525,19 +6612,19 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
} else if (g->flags & 0x80) {
g->color_table = (stbi_uc *) g->pal;
} else
return stbi__errpuc("missing color table", "Corrupt GIF");
return stbi__errpuc("missing color table", "Corrupt GIF");
o = stbi__process_gif_raster(s, g);
if (!o) return NULL;
// if this was the first frame,
pcount = g->w * g->h;
// if this was the first frame,
pcount = g->w * g->h;
if (first_frame && (g->bgindex > 0)) {
// if first frame, any pixel not drawn to gets the background color
for (pi = 0; pi < pcount; ++pi) {
if (g->history[pi] == 0) {
g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
}
}
}
@@ -6548,7 +6635,7 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
case 0x21: // Comment Extension.
{
int len;
int ext = stbi__get8(s);
int ext = stbi__get8(s);
if (ext == 0xF9) { // Graphic Control Extension.
len = stbi__get8(s);
if (len == 4) {
@@ -6557,23 +6644,23 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
// unset old transparent
if (g->transparent >= 0) {
g->pal[g->transparent][3] = 255;
}
g->pal[g->transparent][3] = 255;
}
if (g->eflags & 0x01) {
g->transparent = stbi__get8(s);
if (g->transparent >= 0) {
g->pal[g->transparent][3] = 0;
g->pal[g->transparent][3] = 0;
}
} else {
// don't need transparent
stbi__skip(s, 1);
g->transparent = -1;
stbi__skip(s, 1);
g->transparent = -1;
}
} else {
stbi__skip(s, len);
break;
}
}
}
while ((len = stbi__get8(s)) != 0) {
stbi__skip(s, len);
}
@@ -6592,15 +6679,15 @@ static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, i
static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
{
if (stbi__gif_test(s)) {
int layers = 0;
int layers = 0;
stbi_uc *u = 0;
stbi_uc *out = 0;
stbi_uc *two_back = 0;
stbi_uc *two_back = 0;
stbi__gif g;
int stride;
int stride;
memset(&g, 0, sizeof(g));
if (delays) {
*delays = 0;
*delays = 0;
}
do {
@@ -6610,44 +6697,52 @@ static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y,
if (u) {
*x = g.w;
*y = g.h;
++layers;
stride = g.w * g.h * 4;
++layers;
stride = g.w * g.h * 4;
if (out) {
out = (stbi_uc*) STBI_REALLOC( out, layers * stride );
void *tmp = (stbi_uc*) STBI_REALLOC( out, layers * stride );
if (NULL == tmp) {
STBI_FREE(g.out);
STBI_FREE(g.history);
STBI_FREE(g.background);
return stbi__errpuc("outofmem", "Out of memory");
}
else
out = (stbi_uc*) tmp;
if (delays) {
*delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );
*delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );
}
} else {
out = (stbi_uc*)stbi__malloc( layers * stride );
out = (stbi_uc*)stbi__malloc( layers * stride );
if (delays) {
*delays = (int*) stbi__malloc( layers * sizeof(int) );
*delays = (int*) stbi__malloc( layers * sizeof(int) );
}
}
memcpy( out + ((layers - 1) * stride), u, stride );
memcpy( out + ((layers - 1) * stride), u, stride );
if (layers >= 2) {
two_back = out - 2 * stride;
two_back = out - 2 * stride;
}
if (delays) {
(*delays)[layers - 1U] = g.delay;
(*delays)[layers - 1U] = g.delay;
}
}
} while (u != 0);
} while (u != 0);
// free temp buffer;
STBI_FREE(g.out);
STBI_FREE(g.history);
STBI_FREE(g.background);
// free temp buffer;
STBI_FREE(g.out);
STBI_FREE(g.history);
STBI_FREE(g.background);
// do the final conversion after loading everything;
// do the final conversion after loading everything;
if (req_comp && req_comp != 4)
out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
*z = layers;
*z = layers;
return out;
} else {
return stbi__errpuc("not GIF", "Image was not as a gif type.");
return stbi__errpuc("not GIF", "Image was not as a gif type.");
}
}
@@ -6665,7 +6760,7 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req
*y = g.h;
// moved conversion to after successful load so that the same
// can be done for multiple frames.
// can be done for multiple frames.
if (req_comp && req_comp != 4)
u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
} else if (g.out) {
@@ -6673,9 +6768,9 @@ static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req
STBI_FREE(g.out);
}
// free buffers needed for multiple frame loading;
// free buffers needed for multiple frame loading;
STBI_FREE(g.history);
STBI_FREE(g.background);
STBI_FREE(g.background);
return u;
}
@@ -7338,7 +7433,7 @@ STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user
/*
revision history:
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
2.19 (2018-02-11) fix warning
2.18 (2018-01-30) fix warnings
2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
+46 -45
View File
@@ -20,8 +20,8 @@
output_pixels, out_w, out_h, 0,
num_channels , alpha_chan , 0)
stbir_resize_uint8_srgb_edgemode(
input_pixels , in_w , in_h , 0,
output_pixels, out_w, out_h, 0,
input_pixels , in_w , in_h , 0,
output_pixels, out_w, out_h, 0,
num_channels , alpha_chan , 0, STBIR_EDGE_CLAMP)
// WRAP/REFLECT/ZERO
@@ -159,6 +159,7 @@
Nathan Reed: warning fixes
REVISIONS
0.97 (2020-02-02) fixed warning
0.96 (2019-03-04) fixed warnings
0.95 (2017-07-23) fixed warnings
0.94 (2017-03-18) fixed warnings
@@ -233,7 +234,7 @@ STBIRDEF int stbir_resize_float( const float *input_pixels , int input_w , i
int num_channels);
// The following functions interpret image data as gamma-corrected sRGB.
// The following functions interpret image data as gamma-corrected sRGB.
// Specify STBIR_ALPHA_CHANNEL_NONE if you have no alpha channel,
// or otherwise provide the index of the alpha channel. Flags value
// of 0 will probably do the right thing if you're not sure what
@@ -306,19 +307,19 @@ typedef enum
STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
void *alloc_context);
STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
void *alloc_context);
STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
float *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
void *alloc_context);
@@ -350,7 +351,7 @@ STBIRDEF int stbir_resize( const void *input_pixels , int input_w , int
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
stbir_datatype datatype,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_filter filter_horizontal, stbir_filter filter_vertical,
stbir_colorspace space, void *alloc_context);
@@ -358,7 +359,7 @@ STBIRDEF int stbir_resize_subpixel(const void *input_pixels , int input_w , int
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
stbir_datatype datatype,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_filter filter_horizontal, stbir_filter filter_vertical,
stbir_colorspace space, void *alloc_context,
float x_scale, float y_scale,
@@ -368,7 +369,7 @@ STBIRDEF int stbir_resize_region( const void *input_pixels , int input_w , int
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
stbir_datatype datatype,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_filter filter_horizontal, stbir_filter filter_vertical,
stbir_colorspace space, void *alloc_context,
float s0, float t0, float s1, float t1);
@@ -670,14 +671,14 @@ static const stbir_uint32 fp32_to_srgb8_tab4[104] = {
0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559,
0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723,
};
static stbir_uint8 stbir__linear_to_srgb_uchar(float in)
{
static const stbir__FP32 almostone = { 0x3f7fffff }; // 1-eps
static const stbir__FP32 minval = { (127-13) << 23 };
stbir_uint32 tab,bias,scale,t;
stbir__FP32 f;
// Clamp to [2^(-13), 1-eps]; these two values map to 0 and 1, respectively.
// The tests are carefully written so that NaNs map to 0, same as in the reference
// implementation.
@@ -685,13 +686,13 @@ static stbir_uint8 stbir__linear_to_srgb_uchar(float in)
in = minval.f;
if (in > almostone.f)
in = almostone.f;
// Do the table lookup and unpack bias, scale
f.f = in;
tab = fp32_to_srgb8_tab4[(f.u - minval.u) >> 20];
bias = (tab >> 16) << 9;
scale = tab & 0xffff;
// Grab next-highest mantissa bits and perform linear interpolation
t = (f.u >> 12) & 0xff;
return (unsigned char) ((bias + scale*t) >> 16);
@@ -1238,7 +1239,7 @@ static float* stbir__get_decode_buffer(stbir__info* stbir_info)
return &stbir_info->decode_buffer[stbir_info->horizontal_filter_pixel_margin * stbir_info->channels];
}
#define STBIR__DECODE(type, colorspace) ((type) * (STBIR_MAX_COLORSPACES) + (colorspace))
#define STBIR__DECODE(type, colorspace) ((int)(type) * (STBIR_MAX_COLORSPACES) + (int)(colorspace))
static void stbir__decode_scanline(stbir__info* stbir_info, int n)
{
@@ -2445,7 +2446,7 @@ static int stbir__resize_arbitrary(
return 0;
result = stbir__resize_allocated(&info, input_data, input_stride_in_bytes,
output_data, output_stride_in_bytes,
output_data, output_stride_in_bytes,
alpha_channel, flags, type,
edge_horizontal, edge_vertical,
colorspace, extra_memory, memory_required);
@@ -2499,7 +2500,7 @@ STBIRDEF int stbir_resize_uint8_srgb_edgemode(const unsigned char *input_pixels
STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
unsigned char *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
void *alloc_context)
{
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
@@ -2511,7 +2512,7 @@ STBIRDEF int stbir_resize_uint8_generic( const unsigned char *input_pixels , int
STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
stbir_uint16 *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
void *alloc_context)
{
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
@@ -2524,7 +2525,7 @@ STBIRDEF int stbir_resize_uint16_generic(const stbir_uint16 *input_pixels , int
STBIRDEF int stbir_resize_float_generic( const float *input_pixels , int input_w , int input_h , int input_stride_in_bytes,
float *output_pixels , int output_w, int output_h, int output_stride_in_bytes,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
stbir_edge edge_wrap_mode, stbir_filter filter, stbir_colorspace space,
void *alloc_context)
{
return stbir__resize_arbitrary(alloc_context, input_pixels, input_w, input_h, input_stride_in_bytes,
@@ -2538,7 +2539,7 @@ STBIRDEF int stbir_resize( const void *input_pixels , int input_w , int
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
stbir_datatype datatype,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_filter filter_horizontal, stbir_filter filter_vertical,
stbir_colorspace space, void *alloc_context)
{
@@ -2553,7 +2554,7 @@ STBIRDEF int stbir_resize_subpixel(const void *input_pixels , int input_w , int
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
stbir_datatype datatype,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_filter filter_horizontal, stbir_filter filter_vertical,
stbir_colorspace space, void *alloc_context,
float x_scale, float y_scale,
@@ -2574,7 +2575,7 @@ STBIRDEF int stbir_resize_region( const void *input_pixels , int input_w , int
void *output_pixels, int output_w, int output_h, int output_stride_in_bytes,
stbir_datatype datatype,
int num_channels, int alpha_channel, int flags,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_edge edge_mode_horizontal, stbir_edge edge_mode_vertical,
stbir_filter filter_horizontal, stbir_filter filter_vertical,
stbir_colorspace space, void *alloc_context,
float s0, float t0, float s1, float t1)
@@ -2593,38 +2594,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
*/
+115 -68
View File
@@ -1,4 +1,4 @@
/* stb_image_write - v1.13 - public domain - http://nothings.org/stb
/* stb_image_write - v1.14 - public domain - http://nothings.org/stb
writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015
no warranty implied; use at your own risk
@@ -105,7 +105,7 @@ USAGE:
TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed
data, set the global variable 'stbi_write_tga_with_rle' to 0.
JPEG does ignore alpha channels in input data; quality is between 1 and 100.
Higher quality looks better but results in a bigger image.
JPEG baseline (no JPEG progressive).
@@ -113,7 +113,7 @@ USAGE:
CREDITS:
Sean Barrett - PNG/BMP/TGA
Sean Barrett - PNG/BMP/TGA
Baldur Karlsson - HDR
Jean-Sebastien Guay - TGA monochrome
Tim Kelsey - misc enhancements
@@ -247,17 +247,17 @@ STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean);
#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff)
#ifdef STB_IMAGE_WRITE_STATIC
static int stbi__flip_vertically_on_write=0;
static int stbi_write_png_compression_level = 8;
static int stbi_write_tga_with_rle = 1;
static int stbi_write_force_png_filter = -1;
#else
int stbi_write_png_compression_level = 8;
int stbi__flip_vertically_on_write=0;
int stbi_write_tga_with_rle = 1;
int stbi_write_force_png_filter = -1;
#endif
static int stbi__flip_vertically_on_write = 0;
STBIWDEF void stbi_flip_vertically_on_write(int flag)
{
stbi__flip_vertically_on_write = flag;
@@ -306,7 +306,7 @@ static FILE *stbiw__fopen(char const *filename, char const *mode)
wchar_t wFilename[1024];
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))
return 0;
if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))
return 0;
@@ -774,7 +774,7 @@ STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const
#ifndef STBIW_ZLIB_COMPRESS
// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size()
#define stbiw__sbraw(a) ((int *) (a) - 2)
#define stbiw__sbraw(a) ((int *) (void *) (a) - 2)
#define stbiw__sbm(a) stbiw__sbraw(a)[0]
#define stbiw__sbn(a) stbiw__sbraw(a)[1]
@@ -1044,13 +1044,13 @@ static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int
int type = mymap[filter_type];
unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y);
int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes;
if (type==0) {
memcpy(line_buffer, z, width*n);
return;
}
// first loop isn't optimized since it's just one pixel
// first loop isn't optimized since it's just one pixel
for (i = 0; i < n; ++i) {
switch (type) {
case 1: line_buffer[i] = z[i]; break;
@@ -1271,26 +1271,31 @@ static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) {
bits[0] = val & ((1<<bits[1])-1);
}
static int stbiw__jpg_processDU(stbi__write_context *s, int *bitBuf, int *bitCnt, float *CDU, float *fdtbl, int DC, const unsigned short HTDC[256][2], const unsigned short HTAC[256][2]) {
static int stbiw__jpg_processDU(stbi__write_context *s, int *bitBuf, int *bitCnt, float *CDU, int du_stride, float *fdtbl, int DC, const unsigned short HTDC[256][2], const unsigned short HTAC[256][2]) {
const unsigned short EOB[2] = { HTAC[0x00][0], HTAC[0x00][1] };
const unsigned short M16zeroes[2] = { HTAC[0xF0][0], HTAC[0xF0][1] };
int dataOff, i, diff, end0pos;
int dataOff, i, j, n, diff, end0pos, x, y;
int DU[64];
// DCT rows
for(dataOff=0; dataOff<64; dataOff+=8) {
for(dataOff=0, n=du_stride*8; dataOff<n; dataOff+=du_stride) {
stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+1], &CDU[dataOff+2], &CDU[dataOff+3], &CDU[dataOff+4], &CDU[dataOff+5], &CDU[dataOff+6], &CDU[dataOff+7]);
}
// DCT columns
for(dataOff=0; dataOff<8; ++dataOff) {
stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+8], &CDU[dataOff+16], &CDU[dataOff+24], &CDU[dataOff+32], &CDU[dataOff+40], &CDU[dataOff+48], &CDU[dataOff+56]);
stbiw__jpg_DCT(&CDU[dataOff], &CDU[dataOff+du_stride], &CDU[dataOff+du_stride*2], &CDU[dataOff+du_stride*3], &CDU[dataOff+du_stride*4],
&CDU[dataOff+du_stride*5], &CDU[dataOff+du_stride*6], &CDU[dataOff+du_stride*7]);
}
// Quantize/descale/zigzag the coefficients
for(i=0; i<64; ++i) {
float v = CDU[i]*fdtbl[i];
// DU[stbiw__jpg_ZigZag[i]] = (int)(v < 0 ? ceilf(v - 0.5f) : floorf(v + 0.5f));
// ceilf() and floorf() are C99, not C89, but I /think/ they're not needed here anyway?
DU[stbiw__jpg_ZigZag[i]] = (int)(v < 0 ? v - 0.5f : v + 0.5f);
for(y = 0, j=0; y < 8; ++y) {
for(x = 0; x < 8; ++x,++j) {
float v;
i = y*du_stride+x;
v = CDU[i]*fdtbl[j];
// DU[stbiw__jpg_ZigZag[j]] = (int)(v < 0 ? ceilf(v - 0.5f) : floorf(v + 0.5f));
// ceilf() and floorf() are C99, not C89, but I /think/ they're not needed here anyway?
DU[stbiw__jpg_ZigZag[j]] = (int)(v < 0 ? v - 0.5f : v + 0.5f);
}
}
// Encode DC
@@ -1405,10 +1410,10 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in
37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99};
static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99};
static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f,
static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f,
1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f };
int row, col, i, k;
int row, col, i, k, subsample;
float fdtbl_Y[64], fdtbl_UV[64];
unsigned char YTable[64], UVTable[64];
@@ -1417,6 +1422,7 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in
}
quality = quality ? quality : 90;
subsample = quality <= 90 ? 1 : 0;
quality = quality < 1 ? 1 : quality > 100 ? 100 : quality;
quality = quality < 50 ? 5000 / quality : 200 - quality * 2;
@@ -1439,7 +1445,7 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in
static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 };
static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 };
const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width),
3,1,0x11,0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 };
3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 };
s->func(s->context, (void*)head0, sizeof(head0));
s->func(s->context, (void*)YTable, sizeof(YTable));
stbiw__putc(s, 1);
@@ -1462,36 +1468,74 @@ static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, in
// Encode 8x8 macroblocks
{
static const unsigned short fillBits[] = {0x7F, 7};
const unsigned char *imageData = (const unsigned char *)data;
int DCY=0, DCU=0, DCV=0;
int bitBuf=0, bitCnt=0;
// comp == 2 is grey+alpha (alpha is ignored)
int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0;
const unsigned char *dataR = (const unsigned char *)data;
const unsigned char *dataG = dataR + ofsG;
const unsigned char *dataB = dataR + ofsB;
int x, y, pos;
for(y = 0; y < height; y += 8) {
for(x = 0; x < width; x += 8) {
float YDU[64], UDU[64], VDU[64];
for(row = y, pos = 0; row < y+8; ++row) {
// row >= height => use last input row
int clamped_row = (row < height) ? row : height - 1;
int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp;
for(col = x; col < x+8; ++col, ++pos) {
float r, g, b;
// if col >= width => use pixel from last input column
int p = base_p + ((col < width) ? col : (width-1))*comp;
if(subsample) {
for(y = 0; y < height; y += 16) {
for(x = 0; x < width; x += 16) {
float Y[256], U[256], V[256];
for(row = y, pos = 0; row < y+16; ++row) {
// row >= height => use last input row
int clamped_row = (row < height) ? row : height - 1;
int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp;
for(col = x; col < x+16; ++col, ++pos) {
// if col >= width => use pixel from last input column
int p = base_p + ((col < width) ? col : (width-1))*comp;
float r = dataR[p], g = dataG[p], b = dataB[p];
Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128;
U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b;
V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b;
}
}
DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT);
r = imageData[p+0];
g = imageData[p+ofsG];
b = imageData[p+ofsB];
YDU[pos]=+0.29900f*r+0.58700f*g+0.11400f*b-128;
UDU[pos]=-0.16874f*r-0.33126f*g+0.50000f*b;
VDU[pos]=+0.50000f*r-0.41869f*g-0.08131f*b;
// subsample U,V
{
float subU[64], subV[64];
int yy, xx;
for(yy = 0, pos = 0; yy < 8; ++yy) {
for(xx = 0; xx < 8; ++xx, ++pos) {
int j = yy*32+xx*2;
subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f;
subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f;
}
}
DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
}
}
}
} else {
for(y = 0; y < height; y += 8) {
for(x = 0; x < width; x += 8) {
float Y[64], U[64], V[64];
for(row = y, pos = 0; row < y+8; ++row) {
// row >= height => use last input row
int clamped_row = (row < height) ? row : height - 1;
int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp;
for(col = x; col < x+8; ++col, ++pos) {
// if col >= width => use pixel from last input column
int p = base_p + ((col < width) ? col : (width-1))*comp;
float r = dataR[p], g = dataG[p], b = dataB[p];
Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128;
U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b;
V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b;
}
}
DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT);
DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
}
}
}
@@ -1530,10 +1574,13 @@ STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const
#endif // STB_IMAGE_WRITE_IMPLEMENTATION
/* Revision history
1.14 (2020-02-02) updated JPEG writer to downsample chroma channels
1.13
1.12
1.11 (2019-08-11)
1.10 (2019-02-07)
support utf8 filenames in Windows; fix warnings and platform ifdefs
support utf8 filenames in Windows; fix warnings and platform ifdefs
1.09 (2018-02-11)
fix typo in zlib quality API, improve STB_I_W_STATIC in C++
1.08 (2018-01-29)
@@ -1582,38 +1629,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
*/
+26 -26
View File
@@ -28,7 +28,7 @@
// Minor features
// Martins Mozeiko
// github:IntellectualKitty
//
//
// Bugfixes / warning fixes
// Jeremy Jaussaud
// Fabian Giesen
@@ -432,7 +432,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt
}
}
tail = tail->next;
}
}
}
fr.prev_link = best;
@@ -591,38 +591,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
*/
+36 -19
View File
@@ -1,9 +1,9 @@
// stb_sprintf - v1.06 - public domain snprintf() implementation
// stb_sprintf - v1.07 - public domain snprintf() implementation
// originally by Jeff Roberts / RAD Game Tools, 2015/10/20
// http://github.com/nothings/stb
//
// allowed types: sc uidBboXx p AaGgEef n
// lengths : h ll j z t I64 I32 I
// lengths : hh h ll j z t I64 I32 I
//
// Contributors:
// Fabian "ryg" Giesen (reformatting)
@@ -18,6 +18,8 @@
// Leonard Ritter
// Stefano Zanotti
// Adam Allison
// Arvid Gerstmann
// Markus Kolb
//
// LICENSE:
//
@@ -139,25 +141,38 @@ PERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC):
"...512 char string..." ( 35.0x/32.5x faster!)
*/
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define STBI__ASAN __attribute__((no_sanitize("address")))
#if defined(__clang__)
#if defined(__has_feature) && defined(__has_attribute)
#if __has_feature(address_sanitizer)
#if __has_attribute(__no_sanitize__)
#define STBSP__ASAN __attribute__((__no_sanitize__("address")))
#elif __has_attribute(__no_sanitize_address__)
#define STBSP__ASAN __attribute__((__no_sanitize_address__))
#elif __has_attribute(__no_address_safety_analysis__)
#define STBSP__ASAN __attribute__((__no_address_safety_analysis__))
#endif
#endif
#endif
#elif __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
#if __SANITIZE_ADDRESS__
#define STBSP__ASAN __attribute__((__no_sanitize_address__))
#endif
#endif
#ifndef STBI__ASAN
#define STBI__ASAN
#ifndef STBSP__ASAN
#define STBSP__ASAN
#endif
#ifdef STB_SPRINTF_STATIC
#define STBSP__PUBLICDEC static
#define STBSP__PUBLICDEF static STBI__ASAN
#define STBSP__PUBLICDEF static STBSP__ASAN
#else
#ifdef __cplusplus
#define STBSP__PUBLICDEC extern "C"
#define STBSP__PUBLICDEF extern "C" STBI__ASAN
#define STBSP__PUBLICDEF extern "C" STBSP__ASAN
#else
#define STBSP__PUBLICDEC extern
#define STBSP__PUBLICDEF STBI__ASAN
#define STBSP__PUBLICDEF STBSP__ASAN
#endif
#endif
@@ -200,7 +215,7 @@ STBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char comma, char peri
#define stbsp__uint16 unsigned short
#ifndef stbsp__uintptr
#if defined(__ppc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64)
#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64)
#define stbsp__uintptr stbsp__uint64
#else
#define stbsp__uintptr stbsp__uint32
@@ -457,6 +472,8 @@ STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback,
case 'h':
fl |= STBSP__HALFWIDTH;
++f;
if (f[0] == 'h')
++f; // QUARTERWIDTH
break;
// are we 64-bit (unix style)
case 'l':
@@ -1342,12 +1359,14 @@ STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, .
typedef struct stbsp__context {
char *buf;
int count;
int length;
char tmp[STB_SPRINTF_MIN];
} stbsp__context;
static char *stbsp__clamp_callback(char *buf, void *user, int len)
{
stbsp__context *c = (stbsp__context *)user;
c->length += len;
if (len > c->count)
len = c->count;
@@ -1367,7 +1386,7 @@ static char *stbsp__clamp_callback(char *buf, void *user, int len)
}
if (c->count <= 0)
return 0;
return c->tmp;
return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can
}
@@ -1375,29 +1394,27 @@ static char * stbsp__count_clamp_callback( char * buf, void * user, int len )
{
stbsp__context * c = (stbsp__context*)user;
c->count += len;
c->length += len;
return c->tmp; // go direct into buffer if you can
}
STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va )
{
stbsp__context c;
int l;
if ( (count == 0) && !buf )
{
c.count = 0;
c.length = 0;
STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va );
l = c.count;
}
else
{
if ( count == 0 )
return 0;
int l;
c.buf = buf;
c.count = count;
c.length = 0;
STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va );
@@ -1408,7 +1425,7 @@ STBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, c
buf[l] = 0;
}
return l;
return c.length;
}
STBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...)
+173 -60
View File
@@ -1,4 +1,4 @@
// stb_truetype.h - v1.22 - public domain
// stb_truetype.h - v1.23 - public domain
// authored from 2009-2019 by Sean Barrett / RAD Game Tools
//
// This library processes TrueType files:
@@ -47,10 +47,11 @@
// Kenney Phillis Jr. github:oyvindjam
// Brian Costabile github:vassvik
// Ken Voskuil (kaesve) Ryan Griege
//
//
// VERSION HISTORY
//
// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS)
// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined
// 1.21 (2019-02-25) fix warning
// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod
@@ -210,7 +211,7 @@
//
// Advancing for the next character:
// Call GlyphHMetrics, and compute 'current_point += SF * advance'.
//
//
//
// ADVANCED USAGE
//
@@ -335,7 +336,7 @@ int main(int argc, char **argv)
}
return 0;
}
#endif
#endif
//
// Output:
//
@@ -349,9 +350,9 @@ int main(int argc, char **argv)
// :@@. M@M
// @@@o@@@@
// :M@@V:@@.
//
//
//////////////////////////////////////////////////////////////////////////////
//
//
// Complete program: print "Hello World!" banner, with bugs
//
#if 0
@@ -652,7 +653,7 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, cons
// Calling these functions in sequence is roughly equivalent to calling
// stbtt_PackFontRanges(). If you more control over the packing of multiple
// fonts, or if you want to pack custom data into a font texture, take a look
// at the source to of stbtt_PackFontRanges() and create a custom version
// at the source to of stbtt_PackFontRanges() and create a custom version
// using these functions, e.g. call GatherRects multiple times,
// building up a single array of rects, then call PackRects once,
// then call RenderIntoRects repeatedly. This may result in a
@@ -704,7 +705,7 @@ struct stbtt_fontinfo
int numGlyphs; // number of glyphs, needed for range checking
int loca,head,glyf,hhea,hmtx,kern,gpos; // table locations as offset from start of .ttf
int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf
int index_map; // a cmap mapping for our chosen character encoding
int indexToLocFormat; // format needed to map from glyph index to glyph
@@ -787,6 +788,18 @@ STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1,
STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1);
// as above, but takes one or more glyph indices for greater efficiency
typedef struct stbtt_kerningentry
{
int glyph1; // use stbtt_FindGlyphIndex
int glyph2;
int advance;
} stbtt_kerningentry;
STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info);
STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length);
// Retrieves a complete list of all of the kerning pairs provided by the font
// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write.
// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1)
//////////////////////////////////////////////////////////////////////////////
//
@@ -831,6 +844,11 @@ STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, s
STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices);
// frees the data allocated above
STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg);
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg);
// fills svg with the character's SVG data.
// returns data size or 0 if SVG not found.
//////////////////////////////////////////////////////////////////////////////
//
// BITMAP RENDERING
@@ -960,7 +978,7 @@ STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, floa
// and computing from that can allow drop-out prevention).
//
// The algorithm has not been optimized at all, so expect it to be slow
// if computing lots of characters or very large sizes.
// if computing lots of characters or very large sizes.
@@ -1332,6 +1350,22 @@ static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict)
return stbtt__cff_get_index(&cff);
}
// since most people won't use this, find this table the first time it's needed
static int stbtt__get_svg(stbtt_fontinfo *info)
{
stbtt_uint32 t;
if (info->svg < 0) {
t = stbtt__find_table(info->data, info->fontstart, "SVG ");
if (t) {
stbtt_uint32 offset = ttULONG(info->data + t + 2);
info->svg = t + offset;
} else {
info->svg = 0;
}
}
return info->svg;
}
static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart)
{
stbtt_uint32 cmap, t;
@@ -1411,6 +1445,8 @@ static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, in
else
info->numGlyphs = 0xffff;
info->svg = -1;
// find a cmap encoding table we understand *now* to avoid searching
// later. (todo: could make this installable)
// the same regardless of glyph.
@@ -1717,7 +1753,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
if (i != 0)
num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
// now start the new one
// now start the new one
start_off = !(flags & 1);
if (start_off) {
// if we start off with an off-curve point, then when we need to find a point on the curve
@@ -1759,7 +1795,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
}
}
num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy);
} else if (numberOfContours == -1) {
} else if (numberOfContours < 0) {
// Compound shapes.
int more = 1;
stbtt_uint8 *comp = data + g + 10;
@@ -1770,7 +1806,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
int comp_num_verts = 0, i;
stbtt_vertex *comp_verts = 0, *tmp = 0;
float mtx[6] = {1,0,0,1,0,0}, m, n;
flags = ttSHORT(comp); comp+=2;
gidx = ttSHORT(comp); comp+=2;
@@ -1800,7 +1836,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
mtx[2] = ttSHORT(comp)/16384.0f; comp+=2;
mtx[3] = ttSHORT(comp)/16384.0f; comp+=2;
}
// Find transformation scales.
m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]);
n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]);
@@ -1836,9 +1872,6 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
// More components ?
more = flags & (1<<5);
}
} else if (numberOfContours < 0) {
// @TODO other compound variations?
STBTT_assert(0);
} else {
// numberOfCounters == 0, do nothing
}
@@ -2267,6 +2300,48 @@ STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_inde
}
}
STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info)
{
stbtt_uint8 *data = info->data + info->kern;
// we only look at the first table. it must be 'horizontal' and format 0.
if (!info->kern)
return 0;
if (ttUSHORT(data+2) < 1) // number of tables, need at least 1
return 0;
if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format
return 0;
return ttUSHORT(data+10);
}
STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length)
{
stbtt_uint8 *data = info->data + info->kern;
int k, length;
// we only look at the first table. it must be 'horizontal' and format 0.
if (!info->kern)
return 0;
if (ttUSHORT(data+2) < 1) // number of tables, need at least 1
return 0;
if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format
return 0;
length = ttUSHORT(data+10);
if (table_length < length)
length = table_length;
for (k = 0; k < length; k++)
{
table[k].glyph1 = ttUSHORT(data+18+(k*6));
table[k].glyph2 = ttUSHORT(data+20+(k*6));
table[k].advance = ttSHORT(data+22+(k*6));
}
return length;
}
static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2)
{
stbtt_uint8 *data = info->data + info->kern;
@@ -2603,6 +2678,44 @@ STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v)
STBTT_free(v, info->userdata);
}
STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl)
{
int i;
stbtt_uint8 *data = info->data;
stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info);
int numEntries = ttUSHORT(svg_doc_list);
stbtt_uint8 *svg_docs = svg_doc_list + 2;
for(i=0; i<numEntries; i++) {
stbtt_uint8 *svg_doc = svg_docs + (12 * i);
if ((gl >= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2)))
return svg_doc;
}
return 0;
}
STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg)
{
stbtt_uint8 *data = info->data;
stbtt_uint8 *svg_doc;
if(info->svg == 0)
return 0;
if(svg_doc = stbtt_FindSVGDoc(info, gl)) {
*svg = (char *)data + info->svg + ttULONG(svg_doc + 4);
return ttULONG(svg_doc + 8);
} else {
return 0;
}
}
STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg)
{
return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg);
}
//////////////////////////////////////////////////////////////////////////////
//
// antialiasing software rasterizer
@@ -2728,7 +2841,7 @@ static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, i
float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0);
STBTT_assert(z != NULL);
if (!z) return z;
// round dx down to avoid overshooting
if (dxdy < 0)
z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy);
@@ -2806,7 +2919,7 @@ static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__ac
}
}
}
e = e->next;
}
}
@@ -3534,7 +3647,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
{
int ix0,iy0,ix1,iy1;
stbtt__bitmap gbm;
stbtt_vertex *vertices;
stbtt_vertex *vertices;
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
if (scale_x == 0) scale_x = scale_y;
@@ -3557,7 +3670,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
if (height) *height = gbm.h;
if (xoff ) *xoff = ix0;
if (yoff ) *yoff = iy0;
if (gbm.w && gbm.h) {
gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata);
if (gbm.pixels) {
@@ -3568,7 +3681,7 @@ STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info
}
STBTT_free(vertices, info->userdata);
return gbm.pixels;
}
}
STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff)
{
@@ -3580,7 +3693,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigne
int ix0,iy0;
stbtt_vertex *vertices;
int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices);
stbtt__bitmap gbm;
stbtt__bitmap gbm;
stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0);
gbm.pixels = output;
@@ -3602,7 +3715,7 @@ STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *
STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
{
return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff);
}
}
STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint)
{
@@ -3617,7 +3730,7 @@ STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, uns
STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff)
{
return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff);
}
}
STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint)
{
@@ -3742,7 +3855,7 @@ static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *no
con->y = 0;
con->bottom_y = 0;
STBTT__NOTUSED(nodes);
STBTT__NOTUSED(num_nodes);
STBTT__NOTUSED(num_nodes);
}
static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects)
@@ -4137,7 +4250,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char
n = 0;
for (i=0; i < num_ranges; ++i)
n += ranges[i].num_chars;
rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context);
if (rects == NULL)
return 0;
@@ -4148,7 +4261,7 @@ STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char
n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects);
stbtt_PackFontRangesPackRects(spc, rects, n);
return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects);
STBTT_free(rects, spc->user_allocator_context);
@@ -4309,7 +4422,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y;
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
if (x_inter < x)
if (x_inter < x)
winding += (y0 < y1) ? 1 : -1;
}
}
@@ -4335,7 +4448,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
y1 = (int)verts[i ].y;
if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) {
float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0;
if (x_inter < x)
if (x_inter < x)
winding += (y0 < y1) ? 1 : -1;
}
} else {
@@ -4347,7 +4460,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
if (hits[1][0] < 0)
winding += (hits[1][1] < 0 ? -1 : 1);
}
}
}
}
}
return winding;
@@ -4423,7 +4536,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
// invert for y-downwards bitmaps
scale_y = -scale_y;
{
int x,y,i,j;
float *precompute;
@@ -4572,7 +4685,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
STBTT_free(verts, info->userdata);
}
return data;
}
}
STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff)
{
@@ -4590,7 +4703,7 @@ STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata)
//
// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string
static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2)
static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2)
{
stbtt_int32 i=0;
@@ -4629,7 +4742,7 @@ static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, s
return i;
}
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2)
{
return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2);
}
@@ -4758,7 +4871,7 @@ STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset,
STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index)
{
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index);
}
STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data)
@@ -4851,38 +4964,38 @@ This software is available under 2 licenses -- choose whichever you prefer.
------------------------------------------------------------------------------
ALTERNATIVE A - MIT License
Copyright (c) 2017 Sean Barrett
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
------------------------------------------------------------------------------
ALTERNATIVE B - Public Domain (www.unlicense.org)
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
software, either in source code form or as a compiled binary, for any purpose,
commercial or non-commercial, and by any means.
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
In jurisdictions that recognize copyright laws, the author or authors of this
software dedicate any and all copyright interest in the software to the public
domain. We make this dedication for the benefit of the public at large and to
the detriment of our heirs and successors. We intend this dedication to be an
overt act of relinquishment in perpetuity of all present and future rights to
this software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
------------------------------------------------------------------------------
*/
+53 -10
View File
@@ -8,8 +8,13 @@
#include "dbgui_impl/widgets/console_widget.hpp"
#include "dbgui_impl/widgets/engine_widget.hpp"
#include "dbgui_impl/widgets/input_widget.hpp"
#include "dbgui_impl/widgets/window_widget.hpp"
#include <3rdparty/icons/fa_solid_900.h>
#include <3rdparty/icons/fa_regular_400.h>
#include <3rdparty/icons/materialicons_regular.h>
namespace e2d
{
class dbgui::internal_state final : private e2d::noncopyable {
@@ -28,6 +33,7 @@ namespace e2d
ImGuiIO& io = bind_context_();
setup_key_map_(io);
setup_config_flags_(io);
setup_custom_fonts_(io);
setup_internal_resources_(io);
}
@@ -128,9 +134,10 @@ namespace e2d
const v2f display_size = draw_data->DisplaySize;
const v2f framebuffer_size = display_size * v2f(draw_data->FramebufferScale);
const m4f projection =
math::make_orthographic_lh_matrix4(display_size, 0.f, 1.f) *
math::make_translation_matrix4(-1.f, 1.f);
const m4f projection = math::make_orthographic_lh_matrix4(
0.f, display_size.x,
display_size.y, 0.f,
-1.f, 1.f);
for ( int i = 0; i < draw_data->CmdListsCount; ++i ) {
const ImDrawList* cmd_list = draw_data->CmdLists[i];
@@ -241,6 +248,41 @@ namespace e2d
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
}
void setup_custom_fonts_(ImGuiIO& io) {
io.Fonts->AddFontDefault();
ImFontConfig icons_config;
icons_config.MergeMode = true;
icons_config.PixelSnapH = true;
{
static const ImWchar icons_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0};
io.Fonts->AddFontFromMemoryCompressedTTF(
fa_solid_900_compressed_data,
math::numeric_cast<int>(fa_solid_900_compressed_size),
13.f,
&icons_config, icons_ranges);
}
{
static const ImWchar icons_ranges[] = { ICON_MIN_FA, ICON_MAX_FA, 0};
io.Fonts->AddFontFromMemoryCompressedTTF(
fa_regular_400_compressed_data,
math::numeric_cast<int>(fa_regular_400_compressed_size),
13.f,
&icons_config, icons_ranges);
}
{
static const ImWchar icons_ranges[] = { ICON_MIN_MD, ICON_MAX_MD, 0};
io.Fonts->AddFontFromMemoryCompressedTTF(
materialicons_regular_compressed_data,
math::numeric_cast<int>(materialicons_regular_compressed_size),
13.f,
&icons_config, icons_ranges);
}
}
void setup_internal_resources_(ImGuiIO& io) {
{
shader_ = render_.create_shader(
@@ -254,14 +296,14 @@ namespace e2d
{
unsigned char* font_pixels;
int font_width, font_height;
io.Fonts->GetTexDataAsRGBA32(&font_pixels, &font_width, &font_height);
io.Fonts->GetTexDataAsAlpha8(&font_pixels, &font_width, &font_height);
texture_ = render_.create_texture(image(
make_vec2(font_width, font_height).cast_to<u32>(),
image_data_format::rgba8,
image_data_format::a8,
buffer(
font_pixels,
math::numeric_cast<std::size_t>(font_width * font_height) * sizeof(u32))));
math::numeric_cast<std::size_t>(font_width * font_height) * sizeof(u8))));
if ( !texture_ ) {
throw bad_dbgui_operation();
@@ -276,7 +318,7 @@ namespace e2d
.capabilities(render::capabilities_state()
.blending(true))
.blending(render::blending_state()
.src_factor(render::blending_factor::src_alpha)
.src_factor(render::blending_factor::one)
.dst_factor(render::blending_factor::one_minus_src_alpha)))
.shader(shader_));
}
@@ -417,9 +459,10 @@ namespace e2d
{
dbgui::dbgui(debug& d, input& i, render& r, window& w)
: state_(new internal_state(d, i, r, w)) {
register_menu_widget<dbgui_widgets::console_widget>("Debug", "Console...", d);
register_menu_widget<dbgui_widgets::engine_widget>("Debug", "Engine...");
register_menu_widget<dbgui_widgets::window_widget>("Debug", "Window...");
register_menu_widget<dbgui_widgets::console_widget>("Debug", ICON_FA_TERMINAL " Console", d);
register_menu_widget<dbgui_widgets::engine_widget>("Debug", ICON_FA_COGS " Engine");
register_menu_widget<dbgui_widgets::input_widget>("Debug", ICON_FA_GAMEPAD " Input");
register_menu_widget<dbgui_widgets::window_widget>("Debug", ICON_FA_DESKTOP " Window");
}
dbgui::~dbgui() noexcept = default;
+6 -5
View File
@@ -21,9 +21,9 @@ namespace
varying vec2 v_uv;
void main(){
v_color = a_color;
v_uv = a_uv;
gl_Position = vec4(a_position.x, -a_position.y, 0.0, 1.0) * u_MVP;
v_color = a_color;
v_uv = a_uv;
gl_Position = vec4(a_position.x, a_position.y, 0.0, 1.0) * u_MVP;
}
)glsl";
@@ -33,7 +33,8 @@ namespace
varying vec2 v_uv;
void main(){
gl_FragColor = v_color * texture2D(u_texture, v_uv);
float glyph_alpha = v_color.a * texture2D(u_texture, v_uv).a;
gl_FragColor = vec4(v_color.rgb * glyph_alpha, glyph_alpha);
}
)glsl";
}
@@ -82,7 +83,7 @@ namespace e2d::imgui
void imgui_event_listener::on_move_cursor(const v2f& pos) noexcept {
const v2f real_size = window_.real_size().cast_to<f32>();
if ( math::minimum(real_size) > 0.f ) {
io_.MousePos = pos * (v2f(io_.DisplaySize) / real_size);
io_.MousePos = v2f(pos.x, real_size.y - pos.y) / real_size * v2f(io_.DisplaySize);
}
}
@@ -42,7 +42,6 @@ namespace e2d::dbgui_widgets
console_widget::console_widget(debug& d)
: debug_(d)
, sink_(debug_.register_sink<debug_sink>()) {
desc_.title = "Console";
desc_.first_size = v2f(400.f, 300.f);
levels_.set();
}
@@ -95,7 +94,7 @@ namespace e2d::dbgui_widgets
ImGui::SetScrollHereY(1.f);
}
});
return true;
}
@@ -8,10 +8,6 @@
namespace e2d::dbgui_widgets
{
engine_widget::engine_widget() {
desc_.title = "Engine";
}
bool engine_widget::show() {
if ( !modules::is_initialized<engine>() ) {
return false;
@@ -12,7 +12,7 @@ namespace e2d::dbgui_widgets
{
class engine_widget final : public dbgui::widget {
public:
engine_widget();
engine_widget() = default;
~engine_widget() noexcept = default;
bool show() override;
@@ -0,0 +1,64 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#include "input_widget.hpp"
namespace e2d::dbgui_widgets
{
bool input_widget::show() {
if ( !modules::is_initialized<input>() ) {
return false;
}
input& i = the<input>();
{
imgui_utils::show_formatted_text(
"cursor pos: %0",
strings::make_format_arg(i.mouse().cursor_pos(), 0u, 2u));
imgui_utils::show_formatted_text(
"scroll delta: %0",
strings::make_format_arg(i.mouse().scroll_delta(), 0u, 2u));
ImGui::Separator();
imgui_utils::show_formatted_text(
"input text: %0",
i.keyboard().input_text());
{
ImGui::Text("pressed keys:");
ImGui::Indent();
E2D_DEFER([](){ ImGui::Unindent(); });
const vector<keyboard_key> pressed_keys = i.keyboard().pressed_keys();
for ( keyboard_key pk : pressed_keys ) {
imgui_utils::show_formatted_text("%0", pk);
}
}
{
ImGui::Text("pressed buttons:");
ImGui::Indent();
E2D_DEFER([](){ ImGui::Unindent(); });
const vector<mouse_button> pressed_buttons = i.mouse().pressed_buttons();
for ( mouse_button mb : pressed_buttons ) {
imgui_utils::show_formatted_text("%0", mb);
}
}
}
return true;
}
const input_widget::description& input_widget::desc() const noexcept {
return desc_;
}
}
@@ -0,0 +1,23 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#pragma once
#include "../dbgui.hpp"
namespace e2d::dbgui_widgets
{
class input_widget final : public dbgui::widget {
public:
input_widget() = default;
~input_widget() noexcept = default;
bool show() override;
const description& desc() const noexcept override;
private:
description desc_;
};
}
@@ -8,10 +8,6 @@
namespace e2d::dbgui_widgets
{
window_widget::window_widget() {
desc_.title = "Window";
}
bool window_widget::show() {
if ( !modules::is_initialized<window>() ) {
return false;
@@ -12,7 +12,7 @@ namespace e2d::dbgui_widgets
{
class window_widget final : public dbgui::widget {
public:
window_widget();
window_widget() = default;
~window_widget() noexcept = default;
bool show() override;
@@ -362,7 +362,9 @@ namespace e2d
double cursor_x = 0.0, cursor_y = 0.0;
E2D_ASSERT(window);
glfwGetCursorPos(window.get(), &cursor_x, &cursor_y);
listener.on_move_cursor(make_vec2(cursor_x, cursor_y).cast_to<f32>());
listener.on_move_cursor(make_vec2(
cursor_x,
math::numeric_cast<double>(real_size.y) - cursor_y).cast_to<f32>());
return listener;
}
private:
@@ -427,7 +429,7 @@ namespace e2d
if ( self ) {
self->for_all_listeners(
&event_listener::on_move_cursor,
make_vec2(pos_x, pos_y).cast_to<f32>());
make_vec2(pos_x, math::numeric_cast<double>(self->real_size.y) - pos_y).cast_to<f32>());
}
}
@@ -21,6 +21,7 @@ namespace e2d::bindings::high
void bind_actor(sol::state& l);
void bind_behaviour(sol::state& l);
void bind_camera(sol::state& l);
void bind_colliders(sol::state& l);
void bind_flipbook_player(sol::state& l);
void bind_label(sol::state& l);
void bind_model_renderer(sol::state& l);
@@ -29,6 +30,7 @@ namespace e2d::bindings::high
void bind_scene(sol::state& l);
void bind_spine_player(sol::state& l);
void bind_sprite_renderer(sol::state& l);
void bind_touchable(sol::state& l);
}
namespace e2d::bindings
@@ -45,6 +47,7 @@ namespace e2d::bindings
high::bind_actor(l);
high::bind_behaviour(l);
high::bind_camera(l);
high::bind_colliders(l);
high::bind_flipbook_player(l);
high::bind_label(l);
high::bind_model_renderer(l);
@@ -53,5 +56,6 @@ namespace e2d::bindings
high::bind_scene(l);
high::bind_spine_player(l);
high::bind_sprite_renderer(l);
high::bind_touchable(l);
}
}
@@ -7,8 +7,8 @@
#include "../_high_binds.hpp"
#include <enduro2d/high/gobject.hpp>
#include <enduro2d/high/components/camera.hpp>
#include <enduro2d/high/components/disabled.hpp>
#include <enduro2d/high/components/camera.hpp>
namespace e2d::bindings::high
{
@@ -50,6 +50,32 @@ namespace e2d::bindings::high
}
),
"input", sol::property(
[](const gcomponent<camera>& c) -> bool {
return c.owner().component<camera::input>().exists();
},
[](gcomponent<camera>& c, bool yesno){
if ( yesno ) {
c.owner().component<camera::input>().ensure();
} else {
c.owner().component<camera::input>().remove();
}
}
),
"gizmos", sol::property(
[](const gcomponent<camera>& c) -> bool {
return c.owner().component<camera::gizmos>().exists();
},
[](gcomponent<camera>& c, bool yesno){
if ( yesno ) {
c.owner().component<camera::gizmos>().ensure();
} else {
c.owner().component<camera::gizmos>().remove();
}
}
),
"depth", sol::property(
[](const gcomponent<camera>& c) -> i32 {
return c->depth();
@@ -0,0 +1,193 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#include "../_high_binds.hpp"
#include <enduro2d/high/gobject.hpp>
#include <enduro2d/high/components/disabled.hpp>
#include <enduro2d/high/components/colliders.hpp>
namespace
{
using namespace e2d;
void bind_rect_collider(sol::state& l) {
l.new_usertype<gcomponent<rect_collider>>("rect_collider",
sol::no_constructor,
"enable", [](gcomponent<rect_collider>& c){
c.owner().component<disabled<rect_collider>>().remove();
},
"disable", [](gcomponent<rect_collider>& c){
c.owner().component<disabled<rect_collider>>().ensure();
},
"enabled", sol::property(
[](const gcomponent<rect_collider>& c) -> bool {
return !c.owner().component<disabled<rect_collider>>().exists();
},
[](gcomponent<rect_collider>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<rect_collider>>().remove();
} else {
c.owner().component<disabled<rect_collider>>().ensure();
}
}
),
"disabled", sol::property(
[](const gcomponent<rect_collider>& c) -> bool {
return c.owner().component<disabled<rect_collider>>().exists();
},
[](gcomponent<rect_collider>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<rect_collider>>().ensure();
} else {
c.owner().component<disabled<rect_collider>>().remove();
}
}
),
"size", sol::property(
[](const gcomponent<rect_collider>& c) -> v2f {
return c->size();
},
[](gcomponent<rect_collider>& c, const v2f& v){
c->size(v);
}),
"offset", sol::property(
[](const gcomponent<rect_collider>& c) -> v2f {
return c->offset();
},
[](gcomponent<rect_collider>& c, const v2f& v){
c->offset(v);
})
);
}
void bind_circle_collider(sol::state& l) {
l.new_usertype<gcomponent<circle_collider>>("circle_collider",
sol::no_constructor,
"enable", [](gcomponent<circle_collider>& c){
c.owner().component<disabled<circle_collider>>().remove();
},
"disable", [](gcomponent<circle_collider>& c){
c.owner().component<disabled<circle_collider>>().ensure();
},
"enabled", sol::property(
[](const gcomponent<circle_collider>& c) -> bool {
return !c.owner().component<disabled<circle_collider>>().exists();
},
[](gcomponent<circle_collider>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<circle_collider>>().remove();
} else {
c.owner().component<disabled<circle_collider>>().ensure();
}
}
),
"disabled", sol::property(
[](const gcomponent<circle_collider>& c) -> bool {
return c.owner().component<disabled<circle_collider>>().exists();
},
[](gcomponent<circle_collider>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<circle_collider>>().ensure();
} else {
c.owner().component<disabled<circle_collider>>().remove();
}
}
),
"radius", sol::property(
[](const gcomponent<circle_collider>& c) -> f32 {
return c->radius();
},
[](gcomponent<circle_collider>& c, f32 v){
c->radius(v);
}),
"offset", sol::property(
[](const gcomponent<circle_collider>& c) -> v2f {
return c->offset();
},
[](gcomponent<circle_collider>& c, const v2f& v){
c->offset(v);
})
);
}
void bind_polygon_collider(sol::state& l) {
l.new_usertype<gcomponent<polygon_collider>>("polygon_collider",
sol::no_constructor,
"enable", [](gcomponent<polygon_collider>& c){
c.owner().component<disabled<polygon_collider>>().remove();
},
"disable", [](gcomponent<polygon_collider>& c){
c.owner().component<disabled<polygon_collider>>().ensure();
},
"enabled", sol::property(
[](const gcomponent<polygon_collider>& c) -> bool {
return !c.owner().component<disabled<polygon_collider>>().exists();
},
[](gcomponent<polygon_collider>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<polygon_collider>>().remove();
} else {
c.owner().component<disabled<polygon_collider>>().ensure();
}
}
),
"disabled", sol::property(
[](const gcomponent<polygon_collider>& c) -> bool {
return c.owner().component<disabled<polygon_collider>>().exists();
},
[](gcomponent<polygon_collider>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<polygon_collider>>().ensure();
} else {
c.owner().component<disabled<polygon_collider>>().remove();
}
}
),
"points", sol::property(
[](const gcomponent<polygon_collider>& c) -> vector<v2f> {
return c->points();
},
[](gcomponent<polygon_collider>& c, vector<v2f> v){
c->points(std::move(v));
}),
"offset", sol::property(
[](const gcomponent<polygon_collider>& c) -> v2f {
return c->offset();
},
[](gcomponent<polygon_collider>& c, const v2f& v){
c->offset(v);
})
);
}
}
namespace e2d::bindings::high
{
void bind_colliders(sol::state& l) {
bind_rect_collider(l);
bind_circle_collider(l);
bind_polygon_collider(l);
}
}
@@ -0,0 +1,134 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#include "../_high_binds.hpp"
#include <enduro2d/high/gobject.hpp>
#include <enduro2d/high/components/disabled.hpp>
#include <enduro2d/high/components/touchable.hpp>
namespace e2d::bindings::high
{
void bind_touchable(sol::state& l) {
l.new_usertype<gcomponent<touchable>>("touchable",
sol::no_constructor,
"enable", [](gcomponent<touchable>& c){
c.owner().component<disabled<touchable>>().remove();
},
"disable", [](gcomponent<touchable>& c){
c.owner().component<disabled<touchable>>().ensure();
},
"enabled", sol::property(
[](const gcomponent<touchable>& c) -> bool {
return !c.owner().component<disabled<touchable>>().exists();
},
[](gcomponent<touchable>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<touchable>>().remove();
} else {
c.owner().component<disabled<touchable>>().ensure();
}
}
),
"disabled", sol::property(
[](const gcomponent<touchable>& c) -> bool {
return c.owner().component<disabled<touchable>>().exists();
},
[](gcomponent<touchable>& c, bool yesno){
if ( yesno ) {
c.owner().component<disabled<touchable>>().ensure();
} else {
c.owner().component<disabled<touchable>>().remove();
}
}
),
"bubbling", sol::property(
[](const gcomponent<touchable>& c) -> bool {
return c->bubbling();
},
[](gcomponent<touchable>& c, bool v){
c->bubbling(v);
}),
"capturing", sol::property(
[](const gcomponent<touchable>& c) -> bool {
return c->capturing();
},
[](gcomponent<touchable>& c, bool v){
c->capturing(v);
})
);
//
// events
//
l["touchable"].get_or_create<sol::table>()
.new_usertype<touchable_events::mouse_evt>("mouse_evt",
sol::no_constructor,
"target", sol::property(
[](const touchable_events::mouse_evt& c) -> gobject {
return c.target();
}),
"bubbling", sol::property(
[](const touchable_events::mouse_evt& c) -> bool {
return c.bubbling();
}),
"capturing", sol::property(
[](const touchable_events::mouse_evt& c) -> bool {
return c.capturing();
}),
"type", sol::property(
[](const touchable_events::mouse_evt& c) -> str {
return str(enum_hpp::to_string_or_throw(c.type()));
}),
"button", sol::property(
[](const touchable_events::mouse_evt& c) -> str {
return str(enum_hpp::to_string_or_throw(c.button()));
})
);
l["touchable"].get_or_create<sol::table>()
.new_usertype<touchable_events::touch_evt>("touch_evt",
sol::no_constructor,
"target", sol::property(
[](const touchable_events::touch_evt& c) -> gobject {
return c.target();
}),
"bubbling", sol::property(
[](const touchable_events::touch_evt& c) -> bool {
return c.bubbling();
}),
"capturing", sol::property(
[](const touchable_events::touch_evt& c) -> bool {
return c.capturing();
}),
"type", sol::property(
[](const touchable_events::touch_evt& c) -> str {
return str(enum_hpp::to_string_or_throw(c.type()));
}),
"finger", sol::property(
[](const touchable_events::touch_evt& c) -> u32 {
return c.finger();
})
);
}
}
@@ -11,6 +11,7 @@
#include <enduro2d/high/components/actor.hpp>
#include <enduro2d/high/components/behaviour.hpp>
#include <enduro2d/high/components/camera.hpp>
#include <enduro2d/high/components/colliders.hpp>
#include <enduro2d/high/components/flipbook_player.hpp>
#include <enduro2d/high/components/label.hpp>
#include <enduro2d/high/components/model_renderer.hpp>
@@ -19,6 +20,7 @@
#include <enduro2d/high/components/scene.hpp>
#include <enduro2d/high/components/spine_player.hpp>
#include <enduro2d/high/components/sprite_renderer.hpp>
#include <enduro2d/high/components/touchable.hpp>
namespace e2d::bindings::high
{
@@ -41,6 +43,9 @@ namespace e2d::bindings::high
"actor", sol::property([](gobject& go){ return component_wrapper<actor>{go}; }),
"behaviour", sol::property([](gobject& go){ return component_wrapper<behaviour>{go}; }),
"camera", sol::property([](gobject& go){ return component_wrapper<camera>{go}; }),
"rect_collider", sol::property([](gobject& go){ return component_wrapper<rect_collider>{go}; }),
"circle_collider", sol::property([](gobject& go){ return component_wrapper<circle_collider>{go}; }),
"polygon_collider", sol::property([](gobject& go){ return component_wrapper<polygon_collider>{go}; }),
"flipbook_player", sol::property([](gobject& go){ return component_wrapper<flipbook_player>{go}; }),
"label", sol::property([](gobject& go){ return component_wrapper<label>{go}; }),
"model_renderer", sol::property([](gobject& go){ return component_wrapper<model_renderer>{go}; }),
@@ -48,7 +53,8 @@ namespace e2d::bindings::high
"renderer", sol::property([](gobject& go){ return component_wrapper<renderer>{go}; }),
"scene", sol::property([](gobject& go){ return component_wrapper<scene>{go}; }),
"spine_player", sol::property([](gobject& go){ return component_wrapper<spine_player>{go}; }),
"sprite_renderer", sol::property([](gobject& go){ return component_wrapper<sprite_renderer>{go}; })
"sprite_renderer", sol::property([](gobject& go){ return component_wrapper<sprite_renderer>{go}; }),
"touchable", sol::property([](gobject& go){ return component_wrapper<touchable>{go}; })
);
}
}
@@ -39,6 +39,14 @@ namespace e2d::bindings::high
"world_matrix", sol::property(
[](const node& n) -> m4f { return n.world_matrix(); }),
"local_to_world", [](const node& n, const v4f& v) -> v4f {
return n.local_to_world(v);
},
"world_to_local", [](const node& n, const v4f& v) -> v4f {
return n.world_to_local(v);
},
"root", sol::property(
[](node& n) -> node_iptr { return n.root(); }),
@@ -67,12 +67,10 @@ namespace
mat4<T>(const vec3<T>&,const vec3<T>&,const vec3<T>&)>(&math::make_look_at_rh_matrix4),
"make_orthographic_lh", sol::overload(
sol::resolve<mat4<T>(T,T,T,T)>(&math::make_orthographic_lh_matrix4),
sol::resolve<mat4<T>(const vec2<T>&,T,T)>(&math::make_orthographic_lh_matrix4)),
sol::resolve<mat4<T>(T,T,T,T,T,T)>(&math::make_orthographic_lh_matrix4)),
"make_orthographic_rh", sol::overload(
sol::resolve<mat4<T>(T,T,T,T)>(&math::make_orthographic_rh_matrix4),
sol::resolve<mat4<T>(const vec2<T>&,T,T)>(&math::make_orthographic_rh_matrix4)),
sol::resolve<mat4<T>(T,T,T,T,T,T)>(&math::make_orthographic_rh_matrix4)),
"make_perspective_lh", [](T angle, T aspect, T znear, T zfar) -> mat4<T> {
return math::make_perspective_lh_matrix4(make_rad(angle), aspect, znear, zfar);
+1 -1
View File
@@ -68,7 +68,7 @@ namespace e2d
namespace e2d
{
const char* component_inspector<actor>::title = "actor";
const char* component_inspector<actor>::title = ICON_FA_CUBE " actor";
void component_inspector<actor>::operator()(gcomponent<actor>& c) const {
if ( node_iptr n = c->node() ) {
@@ -55,7 +55,7 @@ namespace e2d
namespace e2d
{
const char* component_inspector<behaviour>::title = "behaviour";
const char* component_inspector<behaviour>::title = ICON_FA_SCROLL " behaviour";
void component_inspector<behaviour>::operator()(gcomponent<behaviour>& c) const {
E2D_UNUSED(c);
+39 -1
View File
@@ -128,6 +128,32 @@ namespace e2d
}
}
namespace e2d
{
const char* factory_loader<camera::input>::schema_source = R"json({
"type" : "object",
"required" : [],
"additionalProperties" : false,
"properties" : {}
})json";
bool factory_loader<camera::input>::operator()(
camera::input& component,
const fill_context& ctx) const
{
E2D_UNUSED(component, ctx);
return true;
}
bool factory_loader<camera::input>::operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const
{
E2D_UNUSED(dependencies, ctx);
return true;
}
}
namespace e2d
{
const char* factory_loader<camera::gizmos>::schema_source = R"json({
@@ -156,9 +182,21 @@ namespace e2d
namespace e2d
{
const char* component_inspector<camera>::title = "camera";
const char* component_inspector<camera>::title = ICON_FA_VIDEO " camera";
void component_inspector<camera>::operator()(gcomponent<camera>& c) const {
if ( bool input = c.owner().component<camera::input>().exists();
ImGui::Checkbox("input", &input) )
{
if ( input ) {
c.owner().component<camera::input>().ensure();
} else {
c.owner().component<camera::input>().remove();
}
}
ImGui::SameLine();
if ( bool gizmos = c.owner().component<camera::gizmos>().exists();
ImGui::Checkbox("gizmos", &gizmos) )
{
@@ -0,0 +1,255 @@
/*******************************************************************************
* This file is part of the "Enduro2D"
* For conditions of distribution and use, see copyright notice in LICENSE.md
* Copyright (C) 2018-2019, by Matvey Cherevko (blackmatov@gmail.com)
******************************************************************************/
#include <enduro2d/high/components/colliders.hpp>
namespace
{
using namespace e2d;
template < typename Collider >
bool collider_base_loader(
impl::collider_base<Collider>& component,
const factory_loader<>::fill_context& ctx)
{
if ( ctx.root.HasMember("offset") ) {
v2f offset = component.offset();
if ( !json_utils::try_parse_value(ctx.root["offset"], offset) ) {
the<debug>().error("COLLIDER_BASE: Incorrect formatting of 'offset' property");
return false;
}
component.offset(offset);
}
return true;
}
template < typename Collider >
void collider_base_inspector(impl::collider_base<Collider>& c) {
if ( v2f offset = c.offset();
ImGui::DragFloat2("offset", offset.data(), 1.f) )
{
c.offset(offset);
}
}
}
namespace e2d
{
const char* factory_loader<rect_collider>::schema_source = R"json({
"type" : "object",
"required" : [],
"additionalProperties" : false,
"properties" : {
"size" : { "$ref": "#/common_definitions/v2" },
"offset" : { "$ref": "#/common_definitions/v2" }
}
})json";
bool factory_loader<rect_collider>::operator()(
rect_collider& component,
const fill_context& ctx) const
{
if ( ctx.root.HasMember("size") ) {
v2f size = component.size();
if ( !json_utils::try_parse_value(ctx.root["size"], size) ) {
the<debug>().error("RECT_COLLIDER: Incorrect formatting of 'size' property");
return false;
}
component.size(size);
}
return collider_base_loader(component, ctx);
}
bool factory_loader<rect_collider>::operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const
{
E2D_UNUSED(dependencies, ctx);
return true;
}
}
namespace e2d
{
const char* factory_loader<circle_collider>::schema_source = R"json({
"type" : "object",
"required" : [],
"additionalProperties" : false,
"properties" : {
"radius" : { "type" : "number" },
"offset" : { "$ref": "#/common_definitions/v2" }
}
})json";
bool factory_loader<circle_collider>::operator()(
circle_collider& component,
const fill_context& ctx) const
{
if ( ctx.root.HasMember("radius") ) {
f32 radius = component.radius();
if ( !json_utils::try_parse_value(ctx.root["radius"], radius) ) {
the<debug>().error("CIRCLE_COLLIDER: Incorrect formatting of 'radius' property");
return false;
}
component.radius(radius);
}
return collider_base_loader(component, ctx);
}
bool factory_loader<circle_collider>::operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const
{
E2D_UNUSED(dependencies, ctx);
return true;
}
}
namespace e2d
{
const char* factory_loader<polygon_collider>::schema_source = R"json({
"type" : "object",
"required" : [],
"additionalProperties" : false,
"properties" : {
"points" : { "$ref": "#/definitions/points" },
"offset" : { "$ref": "#/common_definitions/v2" }
},
"definitions" : {
"points" : {
"type" : "array",
"items" : { "$ref": "#/common_definitions/v2" }
}
}
})json";
bool factory_loader<polygon_collider>::operator()(
polygon_collider& component,
const fill_context& ctx) const
{
if ( ctx.root.HasMember("points") ) {
vector<v2f> points = component.points();
if ( !json_utils::try_parse_value(ctx.root["points"], points) ) {
the<debug>().error("POLYGON_COLLIDER: Incorrect formatting of 'points' property");
return false;
}
component.points(std::move(points));
}
return collider_base_loader(component, ctx);
}
bool factory_loader<polygon_collider>::operator()(
asset_dependencies& dependencies,
const collect_context& ctx) const
{
E2D_UNUSED(dependencies, ctx);
return true;
}
}
namespace e2d
{
const char* component_inspector<rect_collider>::title = ICON_FA_DICE_FOUR " rect_collider";
void component_inspector<rect_collider>::operator()(gcomponent<rect_collider>& c) const {
if ( v2f size = c->size();
ImGui::DragFloat2("size", size.data(), 1.f) )
{
c->size(size);
}
collider_base_inspector(*c);
}
void component_inspector<rect_collider>::operator()(
gcomponent<rect_collider>& c,
gizmos_context& ctx) const
{
ctx.draw_wire_rect(
c->offset(),
c->size(),
ctx.selected() ? color32::cyan() : color32::green());
}
}
namespace e2d
{
const char* component_inspector<circle_collider>::title = ICON_FA_DICE_ONE " circle_collider";
void component_inspector<circle_collider>::operator()(gcomponent<circle_collider>& c) const {
if ( f32 radius = c->radius();
ImGui::DragFloat("radius", &radius, 1.f) )
{
c->radius(radius);
}
collider_base_inspector(*c);
}
void component_inspector<circle_collider>::operator()(
gcomponent<circle_collider>& c,
gizmos_context& ctx) const
{
const u32 segments = math::numeric_cast<u32>(
math::to_rad_v(math::two_pi<f32>()) *
c->radius() *
0.2f);
ctx.draw_wire_circle(
c->offset(),
c->radius(),
segments,
ctx.selected() ? color32::cyan() : color32::green());
}
}
namespace e2d
{
const char* component_inspector<polygon_collider>::title = ICON_FA_DICE_SIX " polygon_collider";
void component_inspector<polygon_collider>::operator()(gcomponent<polygon_collider>& c) const {
const str points_label = strings::rformat(
"points(%0)###points",
c->points().size());
if ( ImGui::TreeNode(points_label.c_str()) ) {
E2D_DEFER([](){ ImGui::TreePop(); });
int count = math::numeric_cast<int>(c->points().size());
if ( ImGui::DragInt("count", &count, 1.f, 0, std::numeric_limits<int>::max()) ) {
c->points().resize(math::numeric_cast<std::size_t>(count));
}
for ( std::size_t i = 0; i < c->points().size(); ++i ) {
ImGui::PushID(math::numeric_cast<int>(i));
E2D_DEFER([](){ ImGui::PopID(); });
if ( v2f point = c->points()[i];
ImGui::DragFloat2("###point", point.data(), 1.f) )
{
c->points()[i] = point;
}
}
}
collider_base_inspector(*c);
}
void component_inspector<polygon_collider>::operator()(
gcomponent<polygon_collider>& c,
gizmos_context& ctx) const
{
ctx.draw_wire_polygon(
c->points(),
c->offset(),
ctx.selected() ? color32::cyan() : color32::green());
}
}

Some files were not shown because too many files have changed in this diff Show More