mirror of
https://github.com/enduro2d/enduro2d.git
synced 2026-09-30 02:46:47 +07:00
Merge pull request #112 from enduro2d/feature/input_event_system
Feature/input event system
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
Vendored
+975
@@ -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"
|
||||
Vendored
+941
@@ -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"
|
||||
@@ -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};
|
||||
};
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
{
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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,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_;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"};
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
//
|
||||
|
||||
@@ -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)...);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Submodule
+1
Submodule modules/IconFontCppHeaders added at 5a43b5a3e2
Submodule
+1
Submodule modules/pnpoly.h added at 5ba3fd8de6
+1
-1
Submodule modules/stb updated: f67165c2bb...0cbdb25d2b
@@ -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" : {}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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 }
|
||||
}
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Executable
+15
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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,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,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
|
||||
|
||||
Executable
+36
@@ -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
|
||||
@@ -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/
|
||||
|
||||
|
||||
@@ -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
@@ -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,
|
||||
};
|
||||
|
||||
+2871
File diff suppressed because it is too large
Load Diff
+1767
File diff suppressed because it is too large
Load Diff
Vendored
+89
@@ -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.
|
||||
*/
|
||||
|
||||
Vendored
+181
-86
@@ -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
@@ -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
@@ -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.
|
||||
------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Vendored
+26
-26
@@ -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.
|
||||
------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Vendored
+36
-19
@@ -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, ...)
|
||||
|
||||
Vendored
+173
-60
@@ -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.
|
||||
------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user